Skip to main content
Glama

Nexus Agent — MCP for Home Assistant

Release HA Add-on Custom Repository License Stars

Give AI assistants full control over your smart home. 323 tools across 29 domains — entities, automations & scripts (CRUD + traces + linter + live reference validator), scene CRUD, dashboards + screenshot + resource management, energy, long-term statistics (sum/mean/min/max by day/week/month), voice pipelines, blueprints, calendar, HACS, Supervisor, ESPHome (list devices, compile, OTA, logs, LVGL display UI management), themes, self-documenting Card Builder (visual cards, recipe builder, embedded block schema, upstream sync), aggregated snapshot (one-call context), BM25 tool search, HA-aware YAML validation, git versioning, and more.

Works with Claude Code, Claude Desktop, VS Code, Cursor, Windsurf, OpenAI Codex CLI, Gemini CLI.


What can you ask?

Once connected, just talk to your AI assistant:

  • "Turn off all lights in the house"

  • "Create an automation: alert me when the front door opens after 10 PM"

  • "Why is my bedroom sensor showing unavailable?"

  • "Take a screenshot of my main dashboard"

  • "Show all pending Home Assistant updates"

  • "Install Mushroom Cards from HACS"

  • "Commit my config changes to git with a summary of what changed"

  • "Build me a Lovelace card for the living room with temperature and humidity"


Related MCP server: ha-mcp

What's New in v0.25.0

  • Pre-built, signed Docker image on ghcr.io — the add-on now pulls ghcr.io/fistacho/nexus-agent instead of building locally, and the same image works standalone/HA Container. See Docker Image.

  • confirm gate on services_call_service — the generic domain/service dispatcher now requires confirm=True for eight guarded HA/Supervisor services (homeassistant.restart/stop, hassio.host_reboot/host_shutdown/restore_full/restore_partial, update.install, group.remove), closing the gap where those effects were reachable without confirmation even though the equivalent dedicated tool already required it. ws_call_service now refuses them outright. See Confirmation Gates.

  • Origin header validation — the HTTP transport now rejects a disallowed, null or repeated Origin header with 403, per the MCP spec's DNS-rebinding protection. HA ingress and GET /health are exempt.

  • Path/service-name hardening — entity_id, automation/script IDs, event types and Supervisor slugs are now validated before being spliced into a request URL; domain/service names are restricted to [A-Za-z0-9_]+; areas_control_area and services_send_notification no longer accept an arbitrary action/target.

  • Breaking: armhf/armv7/i386 are no longer published as pre-built images — those architectures stay on 0.24.x (still builds locally via the Dockerfile).

  • Full details in CHANGELOG.md.

What's New in v0.24.0

  • Optional tool_mode=search add-on option — replaces tools/list with a handful of lookup + call-by-name-proxy tools for context-constrained clients; everything hidden this way still works if called directly by name. See Add-on Options.

  • supervisor_get_addon no longer leaks secrets — schema-declared password fields, secret-looking option keys (including plural forms like credentials/api_keys), and URLs with inline credentials are now redacted; supervisor_set_addon_options still lets you edit other fields without re-typing the secret.

  • Self-protection of the add-on — nexus now refuses to stop, uninstall or change its own add-on's options, whether asked directly or via hassio.addon_stop/app_stop/addon_stdin/app_stdin.

  • Bounded WebSocket timeouts — a stuck HA WebSocket handshake or a slow closing handshake can no longer make a call hang well past its documented timeout.

  • Full details in CHANGELOG.md.

What's New in v0.23.0

  • ESPHome compile/validate/OTA upload work in the add-on — routed through the ESPHome Device Builder add-on's own trusted-peer ingress site, the same path Home Assistant Core itself uses to reach it. Standalone installs need ESPHOME_DASHBOARD_URL set explicitly; the add-on discovers it automatically via the Supervisor.

  • The add-on now uses host_network: true so it can reach that trusted-peer site at all — see Network (add-on) below for what this means for your Network tab settings, and note the add-on's security rating drops by one point as a result.

  • Stable esphome_* error codes (esphome_not_configured, esphome_unreachable, esphome_auth_required, esphome_protocol_error, esphome_command_failed, esphome_unsupported_option, timeout) with a diagnosis block on connectivity/auth failures instead of ad-hoc messages.

  • esphome_upload_device requires confirm=True — OTA-flashing a device is not undoable the way a config edit is; the first call without it does no I/O.

  • SSRF guard on card_builder_upload_image_from_url — resolves the hostname once, rejects loopback/link-local/reserved destinations, and pins every redirect hop to the already-resolved IP, closing the DNS-rebinding window. More relevant than before: under host_network, a loopback request from this add-on now looks like it came from Home Assistant Core to some ingress-fronted add-ons.

  • Full details in CHANGELOG.md.

What's New in v0.22.1

Includes everything from 0.22.0 below — 0.22.0 could not be built by the real Home Assistant Supervisor (a build.yaml regression) and should not be used; install 0.22.1 directly. Fixed: the add-on image failed to build under the Supervisor (update.install error) — reverted to a literal FROM python:3.12-alpine in the Dockerfile (no ARG BUILD_FROM) and removed build.yaml, matching every release through 0.21.0. Full details in CHANGELOG.md.

What's New in v0.22.0

  • read_only and disabled_namespaces add-on options — a serverside policy that hides and refuses non-read-only tools (or whole namespaces) at the MCP protocol level, not just from tools/list. See Add-on Options / Security.

  • confirm gate on supervisor_delete_backup and files_delete_config_file — the first call without confirm=True now does no I/O and returns a confirmation prompt instead of deleting immediately.

  • Safer section-by-section dashboard edits — expected_config_hash/config_hash on the dashboard section tools detect a stale read before a write can land on the wrong card.

  • GET /health trimmed to {"status": "ok"} — it no longer leaks ha_url, the tool count or the active policy to unauthenticated LAN callers.

  • ESPHome fixes — esphome_clean_mqtt now works through HA's own mqtt integration; device online/offline status no longer depends on a binary_sensor.*_api_connection_status entity that isn't guaranteed to exist; an unreachable dashboard now comes with a Supervisor-based diagnosis instead of a bare connection error.

  • Full details in CHANGELOG.md.

What's New in v0.20.0

  • Section-aware Lovelace editing — dashboards_get_view_sections, dashboards_add_card_to_section, dashboards_update_card_in_section, dashboards_remove_card_from_section, dashboards_add_section_to_view. A view with type: sections renders only view.sections; cards written to view.cards show up exclusively in edit mode as "imported cards" (hui-sections-view.ts), so dashboards_add_card_to_view could never place a card on a modern dashboard. These tools do the read-modify-write server-side, so a 16-view / 140 kB config never has to round-trip through dashboards_save_dashboard_config. url_path accepts a view path ('lukasz2'), and non-sections views are rejected with a clear message.

  • Tool count corrected — the manifest claimed 325 while 317 were registered; the real number is now measured from the registry (322 with the five new tools).

  • Audit fixes — a follow-up review checked every registered tool against the live Home Assistant API and fixed ~20 of them that called nonexistent endpoints or held stale logic: WebSocket render_template/listen_state_changes, backup service selection, integrations_* config/options flow via REST, entity exposure, light color_temp_kelvin, zones, energy preferences, calendar event deletion, ESPHome add-on slug discovery + compile/upload/validate, energy statistics units. Full list in CHANGELOG.md.

  • Security hardening — path containment for files_*/esphome_*/git_rollback_file, SVG upload sanitization and stricter media upload limits in card_builder_*.

  • New blueprints_save_blueprint — persists blueprint YAML fetched by import_blueprint, which only ever downloaded and validated. Tool count corrected to 323.

What's New in v0.16.0

  • system_get_updates — list pending HA updates (core, add-ons, HACS, custom components) with version info and release URLs

  • system_get_system_health — health check of all HA subsystems (recorder, network, cloud, etc.)

  • system_get_repairs — list active repair issues that require attention

  • Entity groups CRUD — automations_list_groups, automations_set_group, automations_remove_group — create/update/delete group.* entities via group.set

  • Live automation reference validator — automations_validate_automation_references cross-checks every entity_id and service in your YAML against the live HA registry; template values skipped automatically

  • Lovelace resource management — dashboards_add_dashboard_resource, dashboards_remove_dashboard_resource, dashboards_update_dashboard_resource — manage custom JS/CSS resources without touching YAML

What's New in v0.15.0

  • Pagination + field selection — list_entities and get_snapshot now accept limit, offset, and fields/state_fields

  • Confirmation gates on all destructive operations — restart_ha, stop_ha, git_rollback_*, delete_automation, delete_script, remove_integration all require confirm=True

  • Automation best-practice linter — automations_validate_best_practices statically checks YAML for 7 common mistakes

  • Dashboard screenshot via Puppet engine — dashboards_screenshot renders any Lovelace view to PNG


Open your Home Assistant instance and add the repository.

  1. Click the Open Add-on Repository on MY button above

  2. Find Nexus Agent in the Add-on Store → Install → Start

  3. Open Web UI — copy your MCP URL and paste it into your AI client


Manual Installation (Add-on Store)

If the MY button does not work for your setup:

  1. In Home Assistant go to Settings → Add-ons → Add-on Store

  2. Click the three-dot menu (⋮) → Repositories

  3. Add:

    https://github.com/Fistacho/ha-nexus-agent
  4. Find Nexus Agent → Install → Start → Open Web UI

The web UI shows your API key and generates ready-to-paste config for every MCP client.


Standalone (outside HA)

git clone https://github.com/Fistacho/ha-nexus-agent
cd ha-nexus-agent
pip install -r requirements.txt
cp .env.example .env
# Edit .env: set HA_URL and HA_TOKEN
python server.py

Open http://localhost:7123 to get your API key and MCP client configs.

Getting a Home Assistant token

  1. In HA: Profile → Security → Long-Lived Access Tokens

  2. Create Token → name it nexus

  3. Paste as HA_TOKEN in .env


Docker Image

Starting with 0.25.0, nexus also ships as a pre-built, cosign-signed image on ghcr.io — no local clone/build needed for standalone/HA Container use:

docker run -d --name nexus \
  -p 7123:7123 \
  -e HA_URL=http://homeassistant.local:8123 \
  -e HA_TOKEN=your_long_lived_token \
  ghcr.io/fistacho/nexus-agent:<version>

run.sh detects the absence of /data/options.json (only present under the real Supervisor) and falls back to HA_URL/HA_TOKEN from the environment instead. Verify the signature before trusting a pulled image:

cosign verify --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp '^https://github\.com/Fistacho/ha-nexus-agent/' \
  ghcr.io/fistacho/nexus-agent:<version>

The add-on itself (config.yaml's image:) points at this exact same multi-arch manifest tag — Supervisor picks the right architecture at pull time regardless of the image name (an explicit platform= argument to the Docker Engine pull itself), so no per-architecture image name is needed. Only aarch64 and amd64 are published as of 0.25.0 (see CHANGELOG.md — HA itself dropped Core/Supervised support for 32-bit hosts in 2025.12, and the build tooling this repo uses for signed images has no supported path to add armhf/armv7/i386 back). Everyone on those architectures keeps working on 0.24.x, which still builds locally via the Dockerfile, but cannot update past it.

server.json in this repo also declares this same image as an MCP Registry OCI package — registry publication itself starts at nexus 1.0.0 (see ADR-0005), but the image is pullable from every tagged release regardless. Full operational details (options, security posture, ESPHome): DOCS.md.


Connecting MCP Clients

Open Nexus with the Open Web UI button on the add-on's page (Settings → Add-ons → Nexus Agent) after starting it — that page shows your real API key and the exact, ready-to-paste config for every client below. This works over HA's ingress proxy whether or not you've also enabled Show in sidebar on that same add-on page — the sidebar entry is just a shortcut to the same URL. Outside of ingress (or without a valid Authorization: Bearer header), the same page hides the key.

The MCP endpoint is a Streamable HTTP transport (not SSE) at:

http://your-ha-ip:7123/mcp

Authenticate with an Authorization: Bearer YOUR_API_KEY header wherever the client supports it — prefer this over the ?token= query string, which is kept only for backward compatibility, ends up in plaintext in HTTP access logs and shell history, and will be removed entirely in nexus 1.0.0 (using it logs a one-time deprecation warning per add-on start, without ever logging the key itself).

Claude Code CLI

claude mcp add nexus --transport http "http://your-ha-ip:7123/mcp" --header "Authorization: Bearer YOUR_API_KEY" --scope user

(--transport http, not sse — Nexus speaks Streamable HTTP. Syntax per the Claude Code MCP docs.)

Gemini CLI

gemini mcp add --transport http --header "Authorization: Bearer YOUR_API_KEY" nexus "http://your-ha-ip:7123/mcp"

OpenAI Codex CLI

codex mcp add nexus --url "http://your-ha-ip:7123/mcp?token=YOUR_API_KEY"

Codex's mcp add has no --header flag for HTTP servers, so this falls back to the query-token URL (logged in plaintext). For header-based auth instead, edit ~/.codex/config.toml directly, e.g.:

[mcp_servers.nexus]
url = "http://your-ha-ip:7123/mcp"
bearer_token_env_var = "NEXUS_API_KEY"

VS Code

Create .vscode/mcp.json:

{
  "servers": {
    "nexus": {
      "type": "http",
      "url": "http://your-ha-ip:7123/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "nexus": {
      "url": "http://your-ha-ip:7123/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "nexus": {
      "url": "http://your-ha-ip:7123/mcp",
      "type": "http",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Claude Desktop

Add to %APPDATA%/Claude/claude_desktop_config.json (Win) or ~/Library/Application Support/Claude/claude_desktop_config.json (Mac):

{
  "mcpServers": {
    "nexus": {
      "command": "python",
      "args": ["server.py"],
      "cwd": "/path/to/ha-nexus-agent",
      "env": {
        "HA_URL": "http://homeassistant.local:8123",
        "HA_TOKEN": "your_ha_token_here"
      }
    }
  }
}

Tip: Copy the exact config with your real key from the Open Web UI button on the add-on's page (ingress). The same URL outside of ingress hides the key — see Security.


Tools

323 tools across 29 categories:

Category

Tools

Highlights

entities_*

18

list (paginated + field selection), turn on/off/toggle, bulk_control, voice expose, set_value

services_*

19

call_service (confirm gate on 8 guarded services — restart/stop/host reboot/host shutdown/restore backup/update.install/group.remove, see Confirmation Gates), notify, light color, camera snapshot/record, media controls

automations_*

31

CRUD + full YAML, traces, scripts, scenes, scene CRUD (get/set/delete_scene_config), validate_best_practices (static linter), validate_automation_references (live registry check), list/set/remove groups, confirm gates on delete

blueprints_*

5

list, import from URL, save (persist imported YAML), delete, instantiate

areas_*

8

list, create, get_states, control_area

devices_*

4

list, update (rename/move/disable), remove

calendar_*

4

list calendars/events, create/delete event

todo_*

5

list, add/update/remove items

helpers_*

11

input_boolean/number/text/select/datetime, timers, counters

history_*

5

state history, logbook, error log, system info

system_*

12

check_config, backup, restart/stop (confirm gate), get_updates, get_system_health, get_repairs

dashboards_*

15

get/save config, add cards/views, section-aware editing of type: sections views (list sections, add/update/remove cards in a section, add section), screenshot (Puppet), add/remove/update resources (JS/CSS)

files_*

6

read/write config files, YAML validation (!include, !secret)

git_*

11

commit, rollback (confirm gate), log, safe_write_with_checkpoint

ws_*

7

listen state changes, events, subscribe_trigger, render_template

supervisor_*

20

add-on install/start/stop/update/logs/stats, backups, core/host info

hacs_*

7

list/install/uninstall/update HACS repos, critical updates

energy_*

9

grid, solar, battery sources, energy preferences

zones_*

8

create/update/delete zones, person location

labels_*

14

labels, categories, assign to entities/devices

search_*

7

fuzzy search, orphan devices, unused entities, deep_search

integrations_*

13

config_flow (install like in UI), options flow CRUD, enable/disable, remove (confirm gate)

voice_*

10

Assist pipelines CRUD, STT/TTS/wake-word engines

themes_*

8

list/create/update/delete Lovelace themes

card_builder_*

38

Cards CRUD, style presets, CSS properties, media, renderer config, embedded block schema (list_block_types, get_block_schema, list_button_toggle_features), embedded styles knowledge (list_style_categories, list_style_targets, list_style_snippets, build_styles), 10 turnkey templates (make_template_card), build_from_recipe high-level builder, validate_config, check_schema_sync, upload SVG/media/image-from-url, design patterns, design principles

snapshot_*

2

Aggregated one-call context — states + areas + devices + entities + integrations, domain/area/field filters, pagination

esphome_*

18

list devices + online status, read / write config YAML, get entities, compile / validate / OTA upload via Dashboard API, add-on logs, ping; LVGL: list LVGL devices, get pages/widgets/styles, client-side validate (unique IDs, page refs), add/delete widgets

statistics_*

4

long-term recorder statistics — list IDs, get sum/mean/min/max by hour/day/week/month, get_energy_statistics (auto-discovers kWh/m³ sensors)

discover_*

4

BM25 tool search — query the tool catalogue, list namespaces, fetch full docstrings


Features

  • 323 MCP tools across 29 categories — the most complete HA MCP server available

  • Built-in tool search — discover_tool_search("query") finds the right tool without flooding the AI's context

  • Confirmation gates — 18 destructive tools, plus 8 guarded services reachable via services_call_service, require confirm=True; without it they return the exact command to re-run. See Confirmation Gates.

  • Automation linter — automations_validate_best_practices catches 7 common YAML mistakes before they cause issues

  • Live reference validator — automations_validate_automation_references cross-checks every entity_id and service call against the running HA instance

  • Updates monitor — system_get_updates lists all pending updates across core, add-ons and HACS

  • Repair issues — system_get_repairs surfaces active issues from HA's repair centre

  • Lovelace resources — add/remove/update custom JS modules and CSS without editing YAML

  • Dashboard screenshot — render any Lovelace view to PNG via the Puppet engine (see below)

  • Real-time WebSocket — subscribe to state changes, events and triggers live

  • Git versioning — every config change auto-committed, instant rollback, safe_write_with_checkpoint

  • YAML validation before writing any config file (!include, !secret aware)

  • Setup web UI — generates ready-to-use MCP config for every client

  • HA Add-on native — one-click install, no manual token setup

  • API key auth — /mcp requires the key via Authorization: Bearer (recommended) or the legacy ?token= query string

  • Ingress-gated Setup UI — the API key and one-click client config are only shown to Home Assistant's ingress proxy or a valid Bearer token; see Security


Security

  • Setup UI (GET /) and POST /regenerate only reveal the API key / accept a key reset from callers Home Assistant has already authenticated:

    • via the HA ingress proxy (the Open Web UI button on the add-on's page, or the Nexus sidebar entry if you've enabled Show in sidebar) — this is the intended way to open Nexus;

    • via a valid Authorization: Bearer <API_KEY> header — for scripted/CLI access;

    • in standalone mode only (no Supervisor, e.g. .env deployment) — from localhost, since there is no ingress proxy to authenticate the caller there.

    Any other caller gets the page with the key, tool count and active policy omitted (or 403 for /regenerate).

  • GET /health is intentionally unauthenticated and minimal — it returns only {"status": "ok"}, nothing else, because the Supervisor watchdog that polls it only needs a 200 response. The tool count, ha_url and active read_only/disabled_namespaces policy used to leak here to anyone on the LAN; they now live only on the ingress-gated Setup UI page above.

    • The Supervisor Watchdog itself is off by default and must be turned on with the Watchdog toggle on the add-on's Info tab — listing watchdog: in the add-on's own manifest does not enable it by itself.

  • /mcp accepts Authorization: Bearer <API_KEY> (recommended) or ?token=<API_KEY> in the query string (kept for backward compatibility only, removed in nexus 1.0.0 — it ends up in HTTP access logs and shell/browser history; prefer the header wherever your client supports it, see Connecting MCP Clients). Using the query-string form logs one deprecation warning per add-on start (never the key itself).

  • Access logs never contain the raw key — the add-on redacts ?token=... in uvicorn's access log before it's written.

  • Startup logs never print the raw key — only the path of the file it's stored in (/config/.nexus_api_key).

  • Tool-exposure policy (read_only, disabled_namespaces) — see Add-on Options — narrows what a client can see/call at the MCP protocol level itself: a hidden tool is refused at tools/call, not merely omitted from tools/list. read_only does not restrict what an already-visible read tool can read (e.g. files_read_config_file, git_log, supervisor_get_addon_logs); combine with disabled_namespaces to also narrow that.

  • Found a vulnerability? See SECURITY.md for how to report it privately.


Confirmation Gates

confirm is a human-in-the-loop checkpoint, not a security boundary — it stops an AI assistant from running a disruptive action without the caller explicitly asking twice; it does not stop a script, automation, YAML file + reload, blueprint, services_fire_event or button.press from reaching the same effect indirectly (an accepted residual risk — the indirect paths run inside HA Core's own automation engine, outside anything nexus mediates). The actual security boundary is read_only/disabled_namespaces, which hides the tool (or the guarded services below) entirely.

18 tools require confirm=True before they do anything:

Tool

Effect gated

system_restart_ha

restarts HA Core

system_stop_ha

stops HA Core

supervisor_restart_core

restarts HA Core

supervisor_restart_host

reboots the host

supervisor_restore_backup

restores a full backup, discarding changes since

supervisor_delete_backup

permanently deletes a backup

supervisor_uninstall_addon

deletes an add-on and its data

automations_delete_automation

deletes an automation config

automations_delete_script

deletes a script config

automations_remove_group

removes an automation/script group

automations_delete_scene

deletes a scene config

dashboards_remove_dashboard_resource

removes a Lovelace JS/CSS resource

git_rollback_file

reverts one file in /config to a prior commit

git_rollback_to_commit

reverts all of /config to a prior commit

integrations_remove_integration

removes a config entry

files_delete_config_file

deletes a file under /config

esphome_upload_device

flashes new firmware, no automatic rollback

services_call_service

only when domain.service is one of eight guarded services: homeassistant.restart/stop, hassio.host_reboot/host_shutdown/restore_full/restore_partial, update.install, group.remove — ignored for every other service

ws_call_service never accepts confirm for those same eight guarded services — it refuses them outright with {"error": "guarded_service_refused", "use": "services_call_service"}, since none of them return a response payload anyway.


Add-on Options

Option

Default

Description

port

7123

TCP port for the MCP endpoint and Setup UI

log_level

info

Add-on's own log verbosity (debug|info|warning|error)

git_versioning_auto

true

Auto-commit /config changes made through nexus's file/git tools

max_backups

30

Supervisor backups nexus keeps before pruning the oldest

api_key

(auto-generated)

Pin the MCP API key instead of letting nexus generate one

read_only

false

Hide and refuse every tool that is not read-only (ADR-0003), and every MCP prompt. See Security for what it does not restrict. Requires a restart.

disabled_namespaces

[]

List of tool namespaces (e.g. ["supervisor", "git"]) to hide and refuse entirely. An unknown namespace name refuses to start with a readable error in the add-on log. Requires a restart.

tool_mode

full

full exposes every tool in tools/list, unchanged. search instead shows only 3 lookup tools (discover_tool_search, discover_get_tool_doc, discover_list_namespaces) plus 3 call-by-name proxies, one per tool class (discover_call_read_tool / _write_tool / _destructive_tool) — a much smaller catalogue for context-constrained clients. Every tool search hides still works if called directly by name, and stays subject to read_only/disabled_namespaces exactly as in full mode — this option only changes what tools/list shows. discover must stay out of disabled_namespaces while this is search (the add-on refuses to start otherwise — it would leave tools/list empty). Requires a restart.

read_only and disabled_namespaces combine as a union — a tool hidden by either one is hidden. Both are evaluated once at startup; there is no per-session or per-client variant. tool_mode is a context-budget convenience, not a security boundary — it never widens or narrows what read_only/disabled_namespaces already decided.

Network (add-on)

Since 0.23.0 the add-on runs with host_network: true (ADR-0004) — the only way it can reach the ESPHome Device Builder add-on's trusted-peer ingress site at 127.0.0.1:<its ingress_port>, the same path Home Assistant Core itself uses to reach it. This is a deliberate trade-off, not a default anyone should ignore: the add-on's Supervisor security rating drops by one point as a result, since a host-networked container can reach the host's own loopback interface, not just its own network namespace.

Practically, this changes how the port option is enforced. Docker no longer publishes ports: from config.yaml — nexus reconstructs your choice itself at startup from the add-on's Network tab (Configuration tab, or Info tab → Network):

  • Default (7123) — nexus binds 0.0.0.0:7123; MCP + Setup UI are reachable on the LAN at that port, same as before 0.23.0.

  • Remapped to another port — nexus binds the LAN socket there instead; ingress_port stays fixed at 7123 regardless, so Home Assistant's own ingress ("Open Web UI") keeps working either way.

  • Disabled/unmapped — no LAN socket at all; only Home Assistant ingress can reach nexus. This is the only way to turn the LAN endpoint off entirely.

Do not try to work around any of this by editing the port option's value below — it is scheduled for removal in 1.0.0 and only ever controls the LAN socket described above.

Dashboard Screenshots

dashboards_screenshot renders any Lovelace view to a base64-encoded PNG by delegating to the Puppet headless Chromium add-on. Nexus itself contains no browser dependencies — this approach works on every architecture nexus ships for (aarch64, amd64 — see Docker Image for why 32-bit dropped in 0.25.0).

Setup

  1. In HA: Settings → Add-ons → Add-on Store → ⋮ → Repositories
    Add: https://github.com/balloob/home-assistant-addons

  2. Install Puppet, set its access_token option to a HA long-lived access token, then start it

  3. Done — Nexus discovers Puppet automatically via the Supervisor

Docker / standalone:

# Run the Puppet container as a sidecar, then point Nexus at it:
NEXUS_SCREENSHOT_ENGINE_URL=http://puppet:10000

Usage

dashboards_screenshot(url_path="caly-dom", width=1280, height=800, wait_ms=3000)
dashboards_screenshot(url_path="lovelace/0", full_page=True)   # full scrollable page

Returns {"image_base64": "...", "format": "png", "size_bytes": ...}.


Git Versioning

Nexus keeps a git history of your HA config directory. Before every risky change, use git_safe_write_with_checkpoint — it commits current state first, then applies the change.

All rollback operations require confirm=True to prevent accidental data loss:

git_init_config()
git_safe_write_with_checkpoint("automations.yaml", new_content)
git_rollback_file("automations.yaml", confirm=True)        # undo single file
git_rollback_to_commit("abc1234", confirm=True)            # full rollback
git_log(limit=10)                                          # see history

Automation Linter

automations_validate_best_practices checks YAML against 7 rules before you save:

Rule

Severity

What it catches

state_trigger_no_for

⚠️ warning

State trigger without for: duration — fires on every flicker

no_alias

⚠️ warning

Missing alias: — hard to find in logs

missing_mode

ℹ️ info

No mode: declared — silently defaults to single

triggers_without_ids

ℹ️ info

Multiple triggers without id: — breaks trigger.id conditions

deprecated_service_key

ℹ️ info

service: in actions — use action: (HA 2024.8+)

no_description

ℹ️ info

No description: field

restart_mode_caution

ℹ️ info

mode: restart — can cause mid-run side-effects

automations_validate_best_practices(yaml_content="""
alias: Turn off lights
trigger:
  - platform: state
    entity_id: binary_sensor.motion
    to: "off"
action:
  - service: light.turn_off
    target:
      entity_id: light.living_room
""")
# → {"warnings": 2, "infos": 1, "issues": [...]}

Environment Variables

Variable

Required

Default

Description

HA_URL

Yes

http://homeassistant.local:8123

Home Assistant URL

HA_TOKEN

Standalone only

—

Long-lived access token

SUPERVISOR_TOKEN

Add-on only

auto-injected

Set automatically by HA

HA_CONFIG_PATH

For git/file tools

/config

Path to HA config directory

NEXUS_API_KEY

No

auto-generated

Pin to a specific API key

NEXUS_PORT

No

7123

HTTP server port

NEXUS_SCREENSHOT_ENGINE_URL

No

auto-discovered

Explicit URL to Puppet engine (Docker/standalone)

ESPHOME_DASHBOARD_URL

Standalone only, for esphome_* compile/validate/upload

—

ESPHome Device Builder's trusted-peer ingress URL. The add-on discovers this automatically via the Supervisor and does not need it set; standalone installs must set it explicitly or those tools return esphome_not_configured.

NEXUS_READ_ONLY

No

false

Standalone equivalent of the read_only add-on option — see Add-on Options

NEXUS_DISABLED_NAMESPACES

No

(empty)

Standalone equivalent of disabled_namespaces, comma-separated (e.g. supervisor,git)

NEXUS_TOOL_MODE

No

full

Standalone equivalent of the tool_mode add-on option (full|search) — see Add-on Options


Changelog

See Releases for full history.

Available Tools

323 tools
areas_control_areaControl area entities by domainA

Turn on, off or toggle every entity of one domain in an area.

Calls service <domain>.<action> over HTTP with {"area_id": area_id} as the target, so Home Assistant dispatches it to every entity of that domain in the area. action must be one of turn_on/turn_off/toggle (ADR-0006 D6) — an unchecked value here could reach an arbitrary <domain>.<action> service under cover of "controlling an area".

Use when: controlling a whole area by domain, e.g. all lights in a room. Not for: controlling an explicit list of entity_ids across areas — use entities_bulk_control. Returns: list of state-change dicts as returned by the HA service call. Errors: raises ValueError when action is not one of turn_on, turn_off, toggle. Limits: an invalid domain (no such domain, or the domain has no matching service) fails with the underlying HTTP error from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesService to call on the domain: 'turn_on', 'turn_off' or 'toggle'.
domainNoEntity domain to target within the area, e.g. 'light' or 'switch'; defaults to 'light'.light
area_idYesArea registry ID to target; obtain it from areas_list_areas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false), and the description goes well beyond them: it explains that the action is a validated enum (turn_on/turn_off/toggle), that an unchecked value could reach an arbitrary service, that ValueError is raised on bad action, and that an invalid domain surfaces the underlying HA HTTP error. Error modes and validation behavior are exactly the kind of context structured fields cannot carry.

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

Conciseness4/5

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

The action is front-loaded in sentence one and the labeled Use when / Not for / Errors / Limits blocks are easy to scan. Slightly verbose: the ADR-0006 parenthetical and the 'Returns' line restate what the output schema already provides, so a little text does not earn 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 three-parameter mutation tool this covers everything an agent needs: selection criteria, the alternative tool, the service-dispatch mechanism, validation failures, and upstream HTTP failure behavior. Return values are already covered by the output schema, so the extra 'Returns' line is a harmless redundancy rather than a gap.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds compositional meaning the schema does not: `domain` and `action` are combined into the `<domain>.<action>` service name and `area_id` is passed as the target payload, so the agent understands the parameters jointly rather than as three independent fields. It does not explain the `light` default beyond the schema text.

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

Purpose5/5

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

The first sentence states a specific verb (turn on/off/toggle) and a precise resource scope (every entity of one domain within an area). It also discloses the underlying mechanism — dispatching `<domain>.<action>` with an area target — which distinguishes it unambiguously from entity-level and list-level siblings.

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

Usage Guidelines5/5

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

It contains an explicit 'Use when' clause ('controlling a whole area by domain, e.g. all lights in a room') and an explicit 'Not for' clause naming the alternative (`entities_bulk_control`) for explicit entity_id lists across areas. Nothing about tool selection is left to inference.

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

areas_create_areaCreate areaA

Create a new Home Assistant area (room).

Calls WS config/area_registry/create with name; Home Assistant assigns a new area_id and there is no way to request a specific one, so calling this twice with the same name creates two distinct areas.

Use when: you need a new area to assign devices, entities or labels to. Not for: renaming or moving an existing area — no update tool exists for areas in this namespace. Returns: the created area registry dict (area_id, name, floor_id, icon, aliases, picture).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new area, e.g. 'Kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare idempotentHint=false and destructiveHint=false, but the description adds the concrete consequence: Home Assistant assigns the area_id, you cannot request one, and calling twice with the same name yields two distinct areas. It also discloses the return payload shape, which is genuine context beyond the hints.

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

Conciseness5/5

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

Front-loaded with the action, then compact labeled sections (Use when / Not for / Returns) on separate lines. Every sentence carries information; there is no filler or repetition of the title.

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

Completeness5/5

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

For a one-parameter create tool with annotations and an output schema, the description covers the operation, the non-idempotent pitfall, usage boundaries, and the return contents. An agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is 100% and the single 'name' parameter is fully described in the schema, so the baseline is 3. The description adds a little beyond the schema by clarifying that name is the only input and that area_id cannot be specified, which is meaningful for a create operation.

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 new Home Assistant area (room)') and names the underlying WS command. It also distinguishes itself from the sibling update concept by noting no update tool exists in this namespace, so the agent can place it precisely among the areas_* tools.

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

Usage Guidelines5/5

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

Explicit 'Use when' (need a new area to assign devices, entities or labels to) and 'Not for' (renaming or moving an existing area, with the note that no update tool exists). Both the trigger and the exclusion 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.

areas_delete_areaDelete areaA
DestructiveIdempotent

Delete a Home Assistant area by its area_id.

Calls WS config/area_registry/delete and returns Home Assistant's result unchanged; the area disappears from the registry immediately.

Use when: removing an area that is no longer used. Returns: the raw WS deletion result. Limits: irreversible — there is no restore tool for a deleted area.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_idYesArea registry ID to delete; obtain it from areas_list_areas.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds genuinely new context: the effect is immediate ('area disappears from the registry immediately') and irreversible ('there is no restore tool'). It stops short of noting permission/auth requirements or downstream effects on entities assigned to the area.

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

Conciseness4/5

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

Front-loaded with the action, then cleanly labeled Use when / Returns / Limits sections. Minor redundancy: the raw WS result is stated twice ('returns Home Assistant's result unchanged' and 'Returns: the raw WS deletion result').

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

Completeness5/5

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

An output schema exists, so return-value explanation is optional, yet the description still covers the return, the mutation's immediacy, and the irreversibility — everything an agent needs before invoking a destructive one-parameter delete.

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 already documents itself, including the pointer to areas_list_areas. The description adds no format or syntax detail beyond what the schema provides, 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 ('Delete a Home Assistant area by its area_id') and names the underlying WS command, making it trivially distinguishable from areas_create_area, areas_list_areas, and the other area siblings.

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?

Includes an explicit 'Use when: removing an area that is no longer used' line, giving clear positive context. It does not name an alternative or a when-not condition (e.g., what to do if the area still has devices), so it falls short of a 5.

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

areas_get_area_entitiesGet entities in areaA
Read-onlyIdempotent

Get every entity registered in a given area, directly or via its device.

Reads the entity and device registries over WebSocket, then keeps entity-registry rows whose own area_id matches, or whose device_id belongs to a device assigned to the area.

Use when: you need the entity registry rows for one area, e.g. before bulk-editing labels or categories. Not for: current state values — use areas_get_area_states, or a combined view — use snapshot_get_area_snapshot. Returns: list of entity registry dicts (entity_id, device_id, area_id, labels, …) belonging to the area. Limits: an unknown area_id returns an empty list rather than an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_idYesArea registry ID whose entities to return; obtain it from areas_list_areas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds real value beyond them: it discloses the underlying read path (entity and device registries over WebSocket), the matching rule (own area_id OR device_id of a device assigned to the area), and the limit that an unknown area_id yields an empty list rather than an error. Missing only return-format/pagination detail, which the output schema likely covers.

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

Conciseness5/5

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

Front-loads the core action, then uses compact labeled sections (Use when / Not for / Returns / Limits). Every sentence carries unique information; nothing restates the name or title.

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

Completeness5/5

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

For a one-parameter read tool with full schema coverage, annotations, and an output schema, the description covers purpose, routing, semantics, and edge-case behavior. Nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single area_id parameter is fully documented in the schema, including where to obtain it (areas_list_areas). The description adds no syntax or format beyond 'given area', so the baseline 3 applies 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 (get entity registry rows for an area) and immediately clarifies the scope: direct area members plus entities reached via their device. It explicitly separates itself from areas_get_area_states and snapshot_get_area_snapshot, so the agent can disambiguate 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?

Contains an explicit 'Use when' clause (need entity registry rows for one area, e.g. before bulk-editing labels/categories) and a 'Not for' clause naming the two siblings to use instead for state values or combined views. When-to-use, when-not, and alternatives are all present.

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

areas_get_area_statesGet entity states in areaA
Read-onlyIdempotent

Get current states of every entity in a given area.

Calls areas_get_area_entities for the area, then filters the full state list (ha.get_states()) down to the entity_ids found in that call.

Use when: you need live state values scoped to one area, e.g. before deciding what to control. Not for: registry rows without state values — use areas_get_area_entities, or a combined view — use snapshot_get_area_snapshot. Returns: list of HA state objects (entity_id, state, attributes, last_changed, last_updated) for entities in the area.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_idYesArea registry ID whose entity states to return; obtain it from areas_list_areas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuine behavioral context beyond that: it discloses the internal two-step mechanism (calls areas_get_area_entities, then filters ha.get_states()) and the exact return shape. It does not mention pagination or performance cost of pulling the full state list, which keeps it from a 5.

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

Conciseness4/5

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

Front-loaded with the purpose, then mechanics, then when/when-not, then returns. Every line is useful, though the internal implementation detail is slightly more than strictly needed for selection.

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

Completeness5/5

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

With annotations carrying the safety profile, a 100%-covered single-param schema, and an output schema, the description only needs to route the agent and it does so fully. No gaps remain for correct invocation.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter already documents that area_id comes from areas_list_areas, so the description adds no meaning beyond the schema. Baseline 3 applies when the schema does all the work.

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

Purpose5/5

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

States a specific verb ('Get') and resource ('current states of every entity in a given area'), and explicitly distinguishes itself from areas_get_area_entities (registry rows) and snapshot_get_area_snapshot (combined view). An agent can route correctly 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?

Explicit 'Use when' (live state values scoped to one area, e.g. before deciding what to control) and 'Not for' clauses that name the two alternatives with the condition that selects each. Nothing is left to inference.

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

areas_list_areasList areasA
Read-onlyIdempotent

List all Home Assistant areas (rooms).

Reads the area registry over WebSocket (config/area_registry/list) and returns every entry exactly as Home Assistant reports it, unfiltered.

Use when: you need area IDs and names before assigning entities, devices or labels to an area. Returns: list of area registry dicts (area_id, name, floor_id, icon, aliases, picture).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds real value beyond that: it discloses the underlying WebSocket call (config/area_registry/list) and that results are returned 'exactly as Home Assistant reports it, unfiltered', clarifying there is no server-side filtering or pagination.

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

Conciseness5/5

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

Front-loaded with the action, then the data source, then the usage trigger and return shape. Every sentence adds information an agent can act on; nothing is padded.

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

Completeness5/5

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

For a zero-parameter read tool with an output schema, the description covers purpose, source, filtering behavior, and when to reach for it. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so per the rubric the baseline is 4; there is no parameter semantics to document or omit.

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

Purpose5/5

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

States a specific verb+resource ('List all Home Assistant areas (rooms)') and scopes it precisely as the full, unfiltered registry, which distinguishes it from siblings like search_search_areas, areas_list_floors, and areas_list_devices. An agent can pick 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?

'Use when: you need area IDs and names before assigning entities, devices or labels to an area' gives a concrete precondition and motivation. It stops short of naming alternatives or when-not-to-use conditions, so it is clear context without exclusions.

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

areas_list_devicesList all devices unfilteredA
Read-onlyIdempotent

List all devices in Home Assistant's device registry, unfiltered.

Calls WS config/device_registry/list via ha_client and returns every registry entry exactly as Home Assistant reports it, with every field (unlike the slimmed projection other tools apply).

Use when: you need the complete raw device registry, including fields not exposed elsewhere. Not for: a smaller per-field view — use devices_list_devices, which projects each entry down to id/name/area_id/manufacturer/model/ entry_type plus config_entries/disabled_by; devices scoped to one area — use devices_list_devices_in_area; fuzzy name-based search — use search_search_devices. Returns: list of full device registry dicts as returned by config/device_registry/list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description still adds real value by naming the underlying WS command (`config/device_registry/list`), stating that entries are returned verbatim with every field rather than the slimmed projection used elsewhere, and describing the return shape.

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

Conciseness4/5

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

Front-loaded with the core purpose, then cleanly sectioned into Use when / Not for / Returns. The 'Returns' line largely restates what the output schema already provides, which is the only redundancy; otherwise 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 zero-parameter read-only list tool with full annotation coverage and an output schema, nothing an agent needs to call it correctly is missing — scope, alternatives, and data shape are all covered.

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 disambiguate, and it correctly avoids inventing filter parameters.

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

Purpose5/5

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

States a specific verb and resource ('List all devices in Home Assistant's device registry, unfiltered') and explicitly positions itself against three sibling list/search tools. An agent can identify exactly what this returns 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?

Provides explicit 'Use when' and 'Not for' sections, naming the alternatives (`devices_list_devices`, `devices_list_devices_in_area`, `search_search_devices`) and the condition that selects each. Routing is fully determined by the text.

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

areas_list_floorsList floorsA
Read-onlyIdempotent

List all floors defined in Home Assistant.

Reads the floor registry over WebSocket (config/floor_registry/list) and returns every entry exactly as Home Assistant reports it, unfiltered.

Use when: grouping areas by floor, e.g. before building a floor-scoped dashboard. Returns: list of floor registry dicts as reported by Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful behavioral context beyond that by naming the WebSocket endpoint and stating that results are returned exactly as Home Assistant reports them and unfiltered.

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

Conciseness4/5

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

The description is front-loaded, structured with purpose, usage, and return sections, and contains no obvious filler. It is slightly more verbose than strictly necessary because the output schema already covers the return shape, but the extra framing remains useful.

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

Completeness5/5

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

For a simple zero-parameter list tool with annotations and an output schema, the description is complete. It states the purpose, data source, filtering behavior, and a relevant usage scenario, so an agent has enough context to invoke it correctly.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics burden. The baseline score for a no-parameter tool is 4.

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

Purpose5/5

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

The description uses a specific verb and resource: 'List all floors defined in Home Assistant.' It also names the exact backing registry endpoint, so an agent can distinguish this from sibling area, device, or entity listing 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 provides a clear use case: 'Use when: grouping areas by floor, e.g. before building a floor-scoped dashboard.' It gives positive guidance but does not explicitly state when not to use it or name alternative sibling tools.

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

automations_activate_sceneActivate a sceneA
Idempotent

Activate a scene, applying its stored entity states.

Calls the scene.turn_on service with entity_id.

Returns: list[dict], the raw scene.turn_on service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull scene entity ID to activate, e.g. 'scene.movie_night'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description usefully adds the exact backend service invoked (scene.turn_on) and the return shape, which goes beyond the annotations.

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

Conciseness5/5

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

Three short, front-loaded lines: action, mechanism, return. No filler, and the most important information (what it does) leads.

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 action tool with annotations covering the safety profile and an output schema present, this is largely complete. The return-value line is somewhat redundant given the output schema, and it omits error/failure behavior, keeping it just under a 5.

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 entity_id parameter is fully documented in the schema, including an example format. The description merely restates that entity_id is passed to scene.turn_on, adding no new syntax or constraint detail, so baseline 3 applies.

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

Purpose4/5

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

The description gives a specific verb+resource ('Activate a scene') and clarifies the effect ('applying its stored entity states'), which distinguishes it from siblings like automations_get_scene_config or automations_list_scenes. It does not explicitly name a sibling it should be preferred over, so it stops short of a 5.

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

Usage Guidelines2/5

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

It notes the underlying mechanism (calls scene.turn_on) but offers no when-to-use guidance, no prerequisites, and no comparison to alternatives such as services_call_service or entities_turn_on. An agent gets no routing help.

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

automations_delete_automationDelete an automation configA
DestructiveIdempotent

Delete an automation by config id, then reload automations.

Without confirm=True returns a safety prompt; with confirm=True deletes /api/config/automation/config/<id> and calls the automation.reload service.

Returns: dict {"status": "deleted", "automation_id", "result"}. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is not True, or {"error": "not found", "automation_id": aid} when no automation has that config id. Limits: requires confirm=True; deletion is immediate and permanent.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to actually delete the automation. False (default) returns a safety prompt instead of deleting anything.
automation_idYesAutomation config id to delete — the entity's `id` attribute, not its entity_id. A leading 'automation.' is stripped if present.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds material context beyond them: the two-step confirm safety gate, the side effect of calling automation.reload, the concrete endpoint, exact error shapes for confirmation_required and not found, and the irreversibility warning ('deletion is immediate and permanent').

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

Conciseness5/5

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

Front-loads the action and the confirm gate, then uses labeled Returns/Errors/Limits blocks. Slight redundancy with the output schema, but every line carries actionable content and the structure is easy to scan.

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

Completeness5/5

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

For a destructive 2-param tool with full schema coverage, annotations, and an output schema, this covers the remaining gaps (confirmation workflow, error responses, permanence) thoroughly. 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 both parameters are already documented in the schema (confirm's safety behavior and automation_id's config-id/prefix rules). The description largely restates those semantics rather than adding new ones, 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+resource+scope: 'Delete an automation by config id, then reload automations.' An agent can distinguish this from automations_delete_script, automations_delete_scene, and the get/set config siblings 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?

Clearly describes the confirm-gated workflow (without confirm=True you get a safety prompt; with it the deletion runs), which is the key usage condition. It stops short of naming alternatives (e.g. disable_automation vs delete) or when deletion is inappropriate, so it is clear context without explicit routing.

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

automations_delete_sceneDelete a scene configA
DestructiveIdempotent

Delete a scene config, then reload scenes.

Without confirm=True returns a safety prompt and touches nothing; with confirm=True deletes /api/config/scene/config/<id> and calls the scene.reload service.

Returns: dict {"deleted": sid, ...} merged with HA's delete response, or {"status": "not_found", "scene_id": sid} when no scene has that id. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is not True. Limits: requires confirm=True; deletion is immediate and permanent.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to actually delete the scene. False (default) returns a safety prompt instead of deleting anything.
scene_idYesScene id to delete, bare (e.g. 'movie_night') or prefixed ('scene.movie_night').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantial behavioral detail: the safety prompt when confirm is false, the exact endpoint touched, the scene.reload service call, possible not_found result, confirmation_required error, and that deletion is immediate and permanent. This is rich context beyond the structured annotations.

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

Conciseness4/5

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

The description is front-loaded with the core action and then organized into safety, returns, errors, and limits sections. It is longer than strictly necessary given the output schema exists, but each section is relevant and the structure aids quick scanning.

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

Completeness5/5

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

Given a destructive mutation tool with annotations, a fully covered input schema, and an output schema, the description still supplies the critical safety context an agent needs: confirm gating, immediate permanence, endpoint behavior, and error outcomes. Nothing essential for correct invocation appears missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both scene_id and confirm. The description reinforces the confirm requirement, but it does not add syntax or semantic detail beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: delete a scene config, then reload scenes. It distinguishes itself from siblings such as automations_delete_automation and automations_delete_script by naming the scene config resource, and the confirm requirement further differentiates the operation.

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

Usage Guidelines4/5

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

It clearly explains the two invocation modes: without confirm=True it returns a safety prompt and touches nothing; with confirm=True it deletes and reloads. It does not name alternative tools or explicitly say when not to use this tool beyond the confirmation guard, so it falls short of full when/when-not/alternatives guidance.

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

automations_delete_scriptDelete a script configA
DestructiveIdempotent

Delete a script by id, then reload scripts.

Without confirm=True returns a safety prompt; with confirm=True deletes /api/config/script/config/<id> and calls the script.reload service.

Returns: dict {"status": "deleted", "script_id", "result"}. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is not True, or {"error": "not found", "script_id": sid} when no script has that id. Limits: requires confirm=True; deletion is immediate and permanent.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to actually delete the script. False (default) returns a safety prompt instead of deleting anything.
script_idYesScript id to delete, bare (e.g. 'goodnight') or prefixed ('script.goodnight').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Despite annotations already flagging destructiveHint=true and idempotentHint=true, the description adds substantial context: deletion is immediate and permanent, the confirm gate semantics, the underlying endpoint and script.reload call, and the concrete error shapes for confirmation_required and not found.

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

Conciseness4/5

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

Front-loaded with the core action, then cleanly sectioned into Returns/Errors/Limits. Slightly verbose in restating the confirm behavior and the return dict, but every section carries usable information and nothing is filler.

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

Completeness5/5

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

For a two-parameter destructive tool with an output schema, the description covers the confirmation flow, side effects, permanence, and error cases — nothing an agent needs to invoke it safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both confirm (including its default and safety-prompt behavior) and script_id formats. The description restates the confirm requirement rather than adding syntax beyond the schema, 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 ('Delete a script by id') plus the side effect ('then reload scripts'), which cleanly separates it from siblings like automations_set_script_config, automations_run_script, and automations_delete_scene/automation.

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

Usage Guidelines4/5

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

The confirm=True gate is explained thoroughly (safety prompt without it, real deletion with it), giving clear operational context. It stops short of naming sibling alternatives (e.g. delete_scene/delete_automation) or stating when a script should be deleted versus edited, so it's clear but not fully routing.

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

automations_disable_automationDisable an automationA
Idempotent

Disable an automation so it stops reacting to its triggers.

Calls the automation.turn_off service with entity_id; the automation's stored config is untouched, only its runtime state changes.

Returns: list[dict], the raw automation.turn_off service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull automation entity ID to disable, e.g. 'automation.morning_routine'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=false, so the safety profile is partly covered. The description adds important non-obvious behavior: it calls the automation.turn_off service, changes only runtime state, and leaves stored config untouched, which reconciles the non-read-only but non-destructive annotation pair. It stops short of mentioning permissions or rate limits.

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

Conciseness5/5

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

The description is front-loaded with the core action and consequence, then adds only the two details an agent needs: that it wraps automation.turn_off and that stored config is untouched. The return-value line is short and earned, with no filler or redundancy.

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

Completeness5/5

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

For a single-parameter automation toggle, the description covers what the tool does, how it does it (turn_off service), what changes (runtime state), what does not change (stored config), and what it returns. An output schema already exists, so return details are not required, but the extra note is harmless and complete.

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%: the entity_id parameter is fully documented with its expected format and example. The description only restates that entity_id is passed to the service call, adding no syntax or format detail beyond the schema, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb and resource ('Disable an automation') and adds the effect ('stops reacting to its triggers'), making the purpose unmistakable. It does not explicitly contrast itself with the sibling automations_enable_automation, but the action is self-evidently distinct from trigger/list/enable operations.

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

Usage Guidelines3/5

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

Usage is implied by the verb 'disable' and the consequence of stopping trigger reactions, but the description never explicitly states when to choose this over automations_enable_automation, automations_trigger_automation, or automations_set_automation_config. It gives useful context (runtime state only, config untouched) that indirectly guides selection but falls short of explicit 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.

automations_enable_automationEnable a disabled automationA
Idempotent

Enable a disabled automation.

Calls the automation.turn_on service with entity_id.

Not for: running the automation's actions immediately — use automations_trigger_automation. Returns: list[dict], the raw automation.turn_on service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull automation entity ID to enable, e.g. 'automation.morning_routine'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare non-read-only, non-destructive, and idempotent behavior. The description adds the underlying `automation.turn_on` service call and the raw response shape, which clarifies the mutation mechanics. It does not cover auth needs or further side effects, 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.

Conciseness4/5

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

Four short, front-loaded lines cover purpose, mechanism, exclusion, and return. The return line is slightly redundant because an output schema exists, but the overall structure remains efficient and easy to scan.

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

Completeness5/5

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

For a single-parameter enable tool with rich annotations and an output schema, the description supplies purpose, alternative routing, and mechanism. An agent has everything needed to invoke it correctly.

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

Parameters3/5

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

Schema coverage is 100% and the single `entity_id` parameter is already documented with an example. The description only restates 'with entity_id' and adds no new parameter 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 ('Enable') and resource ('disabled automation'), and explicitly names the sibling automations_trigger_automation as the not-for case. An agent can distinguish it from related tools without opening schemas.

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

Usage Guidelines5/5

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

Explicitly says when not to use it ('running the automation's actions immediately') and names the alternative (automations_trigger_automation). The intended enable use case is clear from the first line.

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

automations_get_automation_configGet an automation's stored configA
Read-onlyIdempotent

Get the stored config of one automation (automations.yaml) as a dict.

Requests /api/config/automation/config/<id> over HTTP and returns the parsed JSON, or None on a 404 — including for automations defined in packages/YAML without an id, since those have no config-id route.

Not for: the automation's current runtime state — use automations_list_automations or entities_get_entity for that. Returns: dict with id, alias, trigger/triggers, condition/conditions, action/actions and mode, or None when no automation has that config id.

ParametersJSON Schema
NameRequiredDescriptionDefault
automation_idYesAutomation config id — the entity's `id` attribute, e.g. '1733294456585' — not its entity_id. A leading 'automation.' is stripped, but the rest must still be the config id (read it from `entities_get_entity(entity_id)` -> attributes.id), which differs from the entity's object_id for UI-created automations.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds genuine behavior: it hits a specific HTTP route and returns None on 404, including for package/YAML automations that lack a config-id route. That edge-case disclosure is high-value context an agent could not infer from annotations.

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

Conciseness4/5

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

Front-loads the purpose, then the mechanism, then the exclusion, then the return shape. Every sentence carries signal, though the HTTP endpoint path detail is slightly more than needed for selection.

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

Completeness5/5

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

Despite an output schema existing, the description supplies the critical None/404 behavior and the packages-without-id caveat that the output schema would not convey. Combined with named alternatives, nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents automation_id (config id vs entity_id, leading prefix stripping). The description adds no syntax 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 ('get the stored config of one automation') and even names the backing file (automations.yaml), distinguishing it from the many sibling automations_* tools.

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

Usage Guidelines5/5

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

Explicitly declares what it is NOT for ('the automation's current runtime state') and routes the agent to two named alternatives, automations_list_automations and entities_get_entity. The condition selecting this tool is unambiguous.

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

automations_get_automation_traceGet one automation traceA
Read-onlyIdempotent

Get a full automation trace (steps, timing, condition results) for a specific run.

Calls the trace/get WebSocket command for domain 'automation', automation_id and run_id.

Not for: finding which run_id to use — use automations_list_automation_traces or automations_get_last_automation_trace first. Returns: dict with the full step-by-step trace for that run. Limits: blocks for the WebSocket round trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYesRun id from `automations_list_automation_traces`, identifying one specific run.
automation_idYesAutomation config id the trace belongs to, bare or prefixed ('automation.<id>').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds real value beyond them by disclosing the underlying trace/get WebSocket command and the blocking round-trip behavior. It stops short of rich context (no error modes when the run_id is stale or missing).

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

Conciseness5/5

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

Front-loads the core purpose, then uses tight labeled clauses (Not for / Returns / Limits) that each carry distinct information. No filler sentences and no repetition of the schema.

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

Completeness5/5

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

For a read-only trace fetch with full schema coverage, annotations, and an output schema, this is complete: purpose, prerequisite routing, return shape, and blocking caveat are all present. An agent has everything needed to invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and both required params are documented in-schema, including the prefixed 'automation.<id>' form. The description adds no syntax or format detail beyond what the schema already provides, 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 (Get), resource (full automation trace), and scope (for a specific run), with the content of the trace enumerated (steps, timing, condition results). An agent can distinguish it from list/get_last siblings 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 the exclusion ('Not for: finding which run_id to use') and routes the agent to two specific alternatives (automations_list_automation_traces, automations_get_last_automation_trace) with the condition that selects them. Nothing is left to inference.

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

automations_get_last_automation_traceGet the most recent automation traceA
Read-onlyIdempotent

Fetch the most recent trace for an automation in one call.

Calls trace/list for automation_id, then picks a run_id (the most recent overall, or with failed_only=True the most recent whose script_execution isn't 'finished') and calls trace/get for it.

Use when: debugging "why didn't this fire?" without first listing traces and picking a run_id by hand. Returns: dict with the full step-by-step trace for the picked run. Errors: returns {"error": "no_traces"|"no_failed_traces", "automation_id": aid} when no matching run exists. Limits: blocks for two sequential WebSocket round trips.

ParametersJSON Schema
NameRequiredDescriptionDefault
failed_onlyNoIf True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False.
automation_idYesAutomation config id to fetch the latest trace for, bare or prefixed ('automation.<id>').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly/idempotent/non-destructive), yet the description adds substantive behavior: the internal trace/list → trace/get sequence, exact error payloads ({"error": "no_traces"|"no_failed_traces"}), and the latency cost (two sequential WebSocket round trips). That is well beyond what annotations provide.

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

Conciseness4/5

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

Labeled sections (Use when / Returns / Errors / Limits) keep it front-loaded and scannable, and every line carries information. It is slightly verbose in restating the internal call flow, but nothing is wasted 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?

With an output schema present the description needn't explain the trace payload, and it uses that space for errors, latency, and run-selection logic instead. An agent has everything needed to call it correctly and interpret failures.

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, but the description goes further by explaining the selection semantics of failed_only ('most recent whose script_execution isn't finished'), which sharpens an otherwise terse boolean flag.

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 ('fetch the most recent trace for an automation in one call') and immediately distinguishes itself from the sibling pair list_automation_traces/get_automation_trace by describing the two-step composition it collapses into one call.

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

Usage Guidelines4/5

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

Gives explicit when-to-use ('debugging "why didn't this fire?" without first listing traces and picking a run_id by hand'), which implicitly routes the agent away from the two-step workflow. It stops short of naming the sibling tools as alternatives, but the trigger condition is clear and specific.

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

automations_get_last_script_traceGet the most recent script traceA
Read-onlyIdempotent

Fetch the most recent (or most recent failed) trace for a script.

Calls trace/list for script_id, then picks a run_id (the most recent overall, or with failed_only=True the most recent whose script_execution isn't 'finished') and calls trace/get for it.

Use when: debugging why a script didn't behave as expected without first listing traces and picking a run_id by hand. Returns: dict with the full step-by-step trace for the picked run. Errors: returns {"error": "no_traces"|"no_failed_traces", "script_id": sid} when no matching run exists. Limits: blocks for two sequential WebSocket round trips.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesScript id to fetch the latest trace for, bare or prefixed ('script.<id>').
failed_onlyNoIf True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real behavioral context beyond them: the exact error payload shape for the no-traces cases, and that the call blocks for two sequential WebSocket round trips. That is non-obvious cost/behavior info 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?

Front-loaded with the core action, then organized into Use when / Returns / Errors / Limits blocks. Every line carries actionable information and nothing is padded.

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

Completeness5/5

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

For a read-only two-parameter tool with an output schema, the description covers usage context, return shape, failure modes, and latency characteristics. An agent has everything it needs to call this correctly without further exploration.

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 already 100%, so both parameters are documented structurally. The description still adds meaning, notably clarifying that failed_only selects the most recent run whose script_execution isn't 'finished', which is slightly richer than the schema's 'did not finish cleanly' phrasing.

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 action (fetch the most recent, or most recent failed, trace) for a specific resource (a script identified by script_id). It also spells out the internal trace/list + trace/get composition, so it is clearly distinguishable from siblings like automations_list_script_traces and automations_get_script_trace.

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

Usage Guidelines4/5

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

The 'Use when' line gives an explicit scenario (debugging a script's behavior) and implicitly frames the alternative it replaces (listing traces and hand-picking a run_id). It doesn't name a sibling tool directly, so routing relies on the agent inferring it, 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.

automations_get_scene_configGet a scene's stored configA
Read-onlyIdempotent

Get a scene's stored config (member entities and their target states).

Requests /api/config/scene/config/<id> over HTTP and returns the parsed JSON, or None on a 404.

Not for: the scene's current runtime state — use automations_list_scenes or entities_get_entity for that. Returns: dict with id, name and entities (mapping entity_id to its target state dict), or None when no scene has that id.

ParametersJSON Schema
NameRequiredDescriptionDefault
scene_idYesScene id to look up, bare (e.g. 'movie_night') or prefixed ('scene.movie_night'); the 'scene.' prefix is stripped if present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: the underlying HTTP route and that a 404 yields None rather than an error. It stops short of describing caching, permissions, or failure modes other than 404, so it is not a full 5.

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

Conciseness4/5

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

Front-loaded with purpose, then usage boundary, then return shape; each block is short and earns its place. The 'Returns:' block overlaps with the existing output schema, which is mild redundancy but not bloat.

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

Completeness5/5

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

For a one-parameter read tool with full annotations and an output schema, the description covers purpose, the exclusion case, the transport, and the empty-result behavior. Nothing an agent needs to invoke it correctly is missing.

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

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 scene_id parameter is already well documented in the schema, including the bare-vs-prefixed form and prefix stripping. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

Specific verb+resource ('Get a scene's stored config') with a parenthetical that names the contents (member entities and their target states), which separates it from runtime-state tools. The 'Not for' clause explicitly disambiguates it from automations_list_scenes and entities_get_entity.

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

Usage Guidelines5/5

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

Explicitly states what this tool is NOT for (current runtime state) and names two concrete alternatives for that use case. The when-to-use condition is unambiguous, and the 404 behavior is stated so the caller knows how absence is signalled.

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

automations_get_script_configGet a script's stored YAML configA
Read-onlyIdempotent

Get a script's stored YAML config as a dict.

Requests /api/config/script/config/<id> over HTTP and returns the parsed JSON, or None on a 404.

Not for: the script's current runtime state — use automations_list_scripts or entities_get_entity for that. Returns: dict with the script's alias, sequence, fields and mode, or None when no script has that id.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesScript id to look up, bare (e.g. 'goodnight') or prefixed ('script.goodnight'); the 'script.' prefix is stripped if present.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds substantive context beyond annotations: the underlying HTTP endpoint, the 404-to-None behavior, and the exact return shape. It stops short of mentioning permission requirements or caching, but adds real behavioral 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 tight sentences, front-loaded with the core action, then the exclusion, then the return contract. Every sentence adds information with no filler.

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

Completeness5/5

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

Covers the action, the sibling it is not, the transport endpoint, the 404 fallback, and the return shape. With an output schema present the description need not detail return values, yet it still names the top-level keys, making this more than sufficient for correct invocation.

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

Parameters4/5

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

Schema coverage is 100% and the schema already explains the bare/prefixed script_id handling thoroughly. The description adds no new parameter syntax but correctly identifies the return dict keys (alias, sequence, fields, mode), which indirectly signals what the id refers to. Baseline 3 applies when schema carries the load, but the explicit key mention is a small extra.

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

Purpose5/5

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

States a specific verb and resource ('Get a script's stored YAML config as a dict') and names the exact sibling to avoid ('automations_list_scripts', 'entities_get_entity') for a different concern. An agent can distinguish this from automations_list_scripts 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 defines the boundary: 'Not for: the script's current runtime state — use automations_list_scripts or entities_get_entity for that.' This tells the agent when not to use this tool and which alternatives to pick.

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

automations_get_script_traceGet one script traceA
Read-onlyIdempotent

Get a full script trace (steps, timing, action results) for a specific run.

Calls the trace/get WebSocket command for domain 'script', script_id and run_id.

Not for: finding which run_id to use — use automations_list_script_traces or automations_get_last_script_trace first. Returns: dict with the full step-by-step trace for that run. Limits: blocks for the WebSocket round trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYesRun id from `automations_list_script_traces`, identifying one specific run.
script_idYesScript id the trace belongs to, bare or prefixed ('script.<id>').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds real behavioral context beyond that: it names the underlying `trace/get` WebSocket command and warns that the call 'blocks for the WebSocket round trip', which is latency information the annotations do not convey.

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

Conciseness4/5

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

Front-loaded with the primary action and purpose, then a compact returns/limits block. Every sentence earns its place; the WebSocket command name is borderline implementation detail but useful for diagnostics, keeping it just short of a 5.

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

Completeness5/5

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

An output schema exists, yet the description still gives a one-line sense of the return shape ('dict with the full step-by-step trace'). With annotations covering safety and the schema covering params, nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented in the schema (run_id provenance, script_id prefix format). The description restates that the call takes script_id and run_id but adds no format or edge-case detail beyond the schema, matching the baseline of 3.

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

Purpose5/5

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

States a specific verb and resource ('Get a full script trace') and immediately enumerates what the trace contains (steps, timing, action results). It is clearly distinguishable from siblings like list_script_traces and get_last_script_trace, which it explicitly 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?

Contains an explicit 'Not for:' clause routing the agent to `automations_list_script_traces` or `automations_get_last_script_trace` when it does not yet have a run_id. The condition that selects the alternative is stated directly.

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

automations_list_automationsList automationsA
Read-onlyIdempotent

List all automations with their current state.

Reads ha.get_states() and keeps entries whose entity_id starts with 'automation.'.

Returns: list[dict] {"entity_id", "state", "friendly_name", "last_triggered"} per automation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real behavioral detail by revealing it reads ha.get_states() and filters on the 'automation.' prefix — implementation semantics that tell the agent what will and won't appear.

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

Conciseness4/5

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

Front-loaded with the purpose, then implementation detail, then return shape. The second sentence about ha.get_states() is slightly implementation-leaning but earns its place by explaining the filter. No filler.

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

Completeness4/5

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

An output schema exists, yet the description still names the returned fields (entity_id, state, friendly_name, last_triggered), which is helpful redundancy rather than a requirement. Everything an agent needs to call and interpret the result 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 tool has 0 parameters, so the baseline is 4. The description doesn't invent parameters and correctly presents this as an unfiltered list, which is appropriate for a zero-arg tool.

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

Purpose5/5

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

Starts with a specific verb + resource ("List all automations") and states scope ("with their current state"). It also discloses the underlying data source and filter ('automation.' entity_id prefix), which distinguishes it from the many sibling list tools.

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

Usage Guidelines4/5

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

The description makes clear this is a read-only enumeration of automations, which is enough context to prefer it over automations_list_scripts / automations_list_scenes / automations_list_groups. It does not explicitly contrast with those siblings or state when not to use it, so it falls short of a 5.

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

automations_list_automation_tracesList automation trace summariesA
Read-onlyIdempotent

List trace summaries (recent runs) for an automation.

Calls the trace/list WebSocket command for domain 'automation' and automation_id.

Returns: list[dict] of trace summaries (run_id, timestamps, script_execution outcome) — no step-by-step detail; use automations_get_automation_trace for one run's full detail. Limits: blocks for the WebSocket round trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
automation_idYesAutomation config id to list traces for, bare or prefixed ('automation.<id>').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered, and the description adds genuinely new context: the WebSocket round trip blocks, and only summary data is returned. It says nothing about default limits or pagination of the trace list, which would complete the picture.

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

Conciseness4/5

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

Front-loaded with the core purpose, then return shape, alternative, and limits in a tight structured block. The 'trace/list WebSocket command' detail is slightly implementation-heavy but small and useful for transparency.

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

Completeness5/5

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

With an output schema present, the description needn't re-document return values, yet it briefly characterizes the summary fields and disclaims step-by-step detail, plus notes the blocking behavior. Combined with the sibling routing, an agent has everything needed 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% and the schema already documents the bare-or-prefixed 'automation.<id>' format, so the baseline is 3. The description only names the parameter in the context of the underlying WebSocket command and adds no syntax or format meaning beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('List trace summaries (recent runs) for an automation') and explicitly distinguishes itself from the sibling automations_get_automation_trace, which returns one run's full detail. An agent can tell it apart from both the get and the get_last variants 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?

Explicitly routes the agent to automations_get_automation_trace when step-by-step detail for a single run is needed, which is exactly the sibling-selection decision this tool faces. It conveys the summary-vs-detail context clearly, though it doesn't state any prerequisite or when-not condition for listing traces.

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

automations_list_groupsList entity groupsA
Read-onlyIdempotent

List all Home Assistant entity groups (group.* entities).

Reads ha.get_states() and keeps entries whose entity_id starts with 'group.', with their members, icon and current state.

Returns: list[dict] {"entity_id", "state", "friendly_name", "entity_ids", "icon", "all", "order"} per group.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real context beyond that: the underlying data source (ha.get_states()), the filtering rule, and the exact per-group fields returned, which tells the agent the data is a point-in-time state snapshot rather than a registry lookup.

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

Conciseness4/5

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

Front-loaded with the purpose, followed by implementation and return shape in a compact three-part structure. The 'Returns:' field list is slightly redundant against the existing output schema, which keeps it from a 5.

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 parameterless read-only listing tool with an output schema and full annotation coverage, the description supplies everything an agent needs: what is listed, where the data comes from, how it is filtered, and the shape of each item.

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, and the input schema is a closed empty object, so there is nothing to disambiguate. Baseline for a parameterless tool is 4; the description correctly implies no arguments are accepted.

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

Purpose4/5

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

States a specific verb and resource ('List all Home Assistant entity groups') and narrows scope precisely with '(group.* entities)', which separates it from the broad entities_list_entities sibling. It does not explicitly name a sibling to route away from, so it falls just short of a 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: by explaining that it reads ha.get_states() and keeps group.* entries, it signals 'use this instead of scanning all states yourself.' There is no explicit when-to-use, when-not-to-use, or named alternative (e.g. entities_list_entities).

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

automations_list_scenesList scenesA
Read-onlyIdempotent

List all scenes.

Reads ha.get_states() and keeps entries whose entity_id starts with 'scene.'.

Returns: list[dict] {"entity_id", "friendly_name"} per scene.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing the implementation (reads ha.get_states() and filters by the 'scene.' entity_id prefix), telling the agent where the data comes from and why the result set is what it is.

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 purpose, then the data source, then the return shape. 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?

An output schema exists, so return values did not need spelling out, yet the description still names the fields. With annotations covering safety and a zero-parameter schema, nothing an agent needs in order to call this correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the schema carries nothing to explain; the baseline for a no-param tool is 4. The description adds nothing about parameters because there is nothing to add.

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

Purpose5/5

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

States a specific verb+resource ('List all scenes') and even names the underlying data source and filter ('ha.get_states()' entries whose entity_id starts with 'scene.'), which unambiguously separates it from siblings like automations_list_scripts or automations_list_automations.

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

Usage Guidelines3/5

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

Usage is implied by the name and the description — an agent can infer this is the read tool for the scenes collection — but there is no explicit statement of when to use it versus alternatives such as automations_get_scene_config or ws_get_states, and no prerequisites or exclusions.

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

automations_list_scriptsList scriptsA
Read-onlyIdempotent

List all scripts with their current state.

Reads ha.get_states() and keeps entries whose entity_id starts with 'script.'.

Returns: list[dict] {"entity_id", "state", "friendly_name", "last_triggered"} per script.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds genuinely new behavioral context beyond them: it discloses the data source (ha.get_states()) and the exact filtering rule (entity_id prefix 'script.'), which tells the agent what will and will not appear in the results.

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

Conciseness5/5

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

Three short, front-loaded sections: purpose, mechanism, return shape. No filler sentences and the essential information leads.

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-only listing tool with an output schema and full annotation coverage, the description is essentially complete. The only missing piece is routing guidance versus sibling list tools, which is a minor gap given the tool's simplicity.

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. The description correctly introduces no parameter discussion and instead explains the implicit scoping of results, which is the only 'parameter-like' semantics available here.

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

Purpose4/5

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

States a specific verb and resource ('List all scripts') plus the data they expose ('current state'). It is distinguishable from automations_list_automations and automations_list_scenes by resource name, though it never explicitly contrasts itself with those siblings.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no statement of when another tool (e.g. automations_list_automations, automations_get_script_config) is the better choice, and no preconditions. The implementation note about filtering script. entities implies usage but does not guide selection.

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

automations_list_script_tracesList script trace summariesA
Read-onlyIdempotent

List trace summaries (recent runs) for a script.

Calls the trace/list WebSocket command for domain 'script' and script_id.

Returns: list[dict] of trace summaries (run_id, timestamps, script_execution outcome) — no step-by-step detail; use automations_get_script_trace for one run's full detail. Limits: blocks for the WebSocket round trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesScript id to list traces for, bare or prefixed ('script.<id>').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds non-obvious context the annotations do not: the tool blocks on a WebSocket round trip, and the return contains no step-by-step detail. Useful disclosure beyond the structured fields.

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

Conciseness4/5

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

Front-loaded with the core purpose, then structured Returns/Limits sections. The content is efficient, though the return description is somewhat redundant given an output schema exists. No wasted sentences overall.

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

Completeness4/5

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

An output schema exists so return values needn't be described, yet the description still summarizes them (run_id, timestamps, script_execution) plus the blocking limit and the sibling alternative. Complete for a single-param read tool; only minor redundancy keeps it from a 5.

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

Parameters3/5

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

Only one parameter (script_id) with 100% schema description coverage, including the bare-or-prefixed format. The description adds no syntax or format meaning beyond the schema, so the baseline 3 applies – 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 (list) and resource (trace summaries / recent runs for a script), and explicitly distinguishes itself from the sibling automations_get_script_trace. An agent can tell what it does and how it differs from the full-detail tool 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?

Names the alternative explicitly ('use automations_get_script_trace for one run's full detail'), giving a clear condition that selects between summary listing and single-run detail. This mirrors the strongest calibration example's routing pattern.

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

automations_reload_automationsReload all automations from YAMLA
Idempotent

Reload all automations from YAML.

Calls the automation.reload service, which re-reads automations.yaml/packages and re-applies enabled/disabled state; any automations created only via automations_set_automation_config since the last reload are included too, since that tool writes through the same config store.

Returns: list[dict], the raw automation.reload service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With annotations already covering idempotentHint, destructiveHint, and readOnlyHint, the description still adds real value: it discloses that it calls the automation.reload service, that it re-reads automations.yaml/packages, re-applies enabled/disabled state, and pulls in config-store automations. It stops short of noting what in-memory state might be discarded, so it is strong but not exhaustive.

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

Conciseness4/5

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

Front-loaded with the core action in the first sentence, followed by useful elaboration. The 'Returns:' sentence is somewhat redundant given a dedicated output schema exists, but otherwise the text is tight and well-ordered.

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

Completeness5/5

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

For a zero-parameter tool with full annotation coverage and an output schema, the description supplies everything an agent needs: the mechanism (automation.reload), the data sources re-read, and the interaction with automations_set_automation_config. Return values are already covered by the output schema.

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 of 4 applies. There is no parameter surface for the description to clarify or obscure.

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+scope ('Reload all automations from YAML') and proceeds to name the underlying service. It is cleanly distinguishable from sibling reload tools such as automations_reload_scripts and automations_reload_scenes, which target different resources.

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

Usage Guidelines3/5

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

Usage context is implied (use after automations are created/edited in YAML or via automations_set_automation_config) but never stated as an explicit when-to-use rule. It doesn't contrast this tool with alternatives such as automations_set_automation_config, services_reload_config, or system_reload_all, so the agent must infer the choice.

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

automations_reload_scenesReload scenes from YAMLA
Idempotent

Reload scenes from YAML.

Calls the scene.reload service, which re-reads scenes.yaml and re-registers scene entities from it; scenes saved via automations_set_scene_config are included since that tool writes to the same config store.

Returns: list[dict], the raw scene.reload service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower; the description still adds real context by explaining that the config file is re-read from disk, scene entities are re-registered, and scenes written by `automations_set_scene_config` survive the reload. It does not mention failure behavior when the YAML is invalid, 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.

Conciseness4/5

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

Front-loaded with the action, then supporting detail, then a one-line return note. The final 'Returns: list[dict]' line duplicates what the output schema already covers, which is the only wasted sentence.

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, an output schema present, and annotations covering safety, the description supplies the missing behavioral layer well. The only unaddressed element is what happens on reload failure (invalid scenes.yaml), which an agent calling a config-reload tool would benefit from knowing.

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 clarify. It correctly avoids inventing parameter semantics.

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

Purpose5/5

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

States a specific verb and resource ('Reload scenes from YAML') and names the underlying mechanism (the `scene.reload` service), so it is clearly distinguishable from automations_reload_automations, automations_reload_scripts, and automations_set_scene_config. An agent knows exactly what this tool 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 Guidelines3/5

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

It explains the effect of the reload and clarifies that scenes saved via `automations_set_scene_config` are included, which is decision-relevant. However, it never states when an agent should choose this over `automations_set_scene_config` or `automations_reload_all`/`system_reload_all`, nor any prerequisite (e.g., valid scenes.yaml). Usage is implied rather than directed.

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

automations_reload_scriptsReload all scripts from YAMLA
Idempotent

Reload all scripts from YAML.

Calls the script.reload service, which re-reads scripts.yaml/packages and re-registers script entities.

Returns: list[dict], the raw script.reload service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description goes beyond that by naming the underlying service (script.reload) and disclosing the effect (re-reads scripts.yaml/packages, re-registers script entities), which tells the agent this is a safe state-refresh rather than a data mutation. It does not discuss any error or failure behavior, 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?

Front-loaded with the action, followed by the mechanism and the return type in three tight sentences with no filler. 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 parameterless reload tool with an output schema already present, the definition covers purpose, mechanism, side effects, and return shape. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to clarify here, and it correctly adds no redundant parameter prose.

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

Purpose5/5

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

States a specific verb (reload) and resource (all scripts from YAML), and the mention of scripts.yaml/packages makes it clearly distinct from siblings like automations_reload_automations and automations_reload_scenes. An agent can pick this apart from the other reload tools without opening any schema.

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

Usage Guidelines3/5

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

Explaining that it re-reads scripts.yaml/packages implies the use case (pick up file edits without restarting), but there is no explicit when-to-use, no statement of when to prefer it over automations_reload_automations or system_reload_all, and no prerequisites. Usage is only implied.

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

automations_remove_groupRemove a runtime entity groupA
DestructiveIdempotent

Remove a group created with automations_set_group.

Without confirm=True returns a safety prompt; with confirm=True calls the group.remove service with object_id. Groups defined in groups.yaml come back on the next restart or YAML reload — this only removes the runtime entity.

Returns: dict {"status": "removed", "group_id": "group.<id>"}. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is not True. Limits: requires confirm=True; has no effect on a group defined in groups.yaml beyond the next reload/restart.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to actually remove the group. False (default) returns a safety prompt instead of removing anything.
group_idYesBare group id or 'group.<id>' to remove.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds genuinely new behavioral detail: the confirmation gate, the exact return payload, the error shape for confirmation_required, and the reload/restart caveat for groups.yaml groups. This is exactly the extra context annotations cannot carry.

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

Conciseness5/5

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

Front-loads the action and its create-sibling, then separates Returns/Errors/Limits into scannable blocks. No filler sentences; every line conveys operative behavior.

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 mutation tool with an output schema, the description supplies the confirmation workflow, error contract, and persistence caveat that an agent needs to invoke it safely. 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%, so both confirm and group_id are already documented, establishing the baseline of 3. The description's mention of calling the group.remove service with object_id does not match the schema's group_id name, adding mild confusion rather than meaning.

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

Purpose5/5

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

States a specific verb (remove) and resource (runtime entity group), and anchors it to the sibling that created it (automations_set_group), letting an agent place it precisely among automations_list_groups/set_group.

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?

Clearly explains the two-mode usage (without confirm=True it returns a safety prompt; with confirm=True it actually removes) and the important caveat that YAML-defined groups reappear on reload. It does not explicitly say when to prefer this over a YAML edit, but the context is unambiguous.

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

automations_run_scriptStart a scriptA

Start a script and return immediately without waiting for it to finish.

Calls the script.turn_on service with entity_id and, when given, variables as the script's fields; the call returns as soon as Home Assistant accepts it and does not return the script's response variables.

Not for: getting the script's result — this tool never returns it, regardless of the script's own response_variable. Returns: list[dict], the raw script.turn_on service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull script entity ID to start, e.g. 'script.goodnight'.
variablesNoValues passed as the script's input fields. Omit to run with no variables.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower, yet the description adds real context beyond them: fire-and-forget semantics, the underlying `script.turn_on` service call, and the crucial caveat that the script's `response_variable` is never surfaced. It stops short of covering failure modes 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.

Conciseness4/5

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

Front-loads the key behavioral fact in the first sentence and is generally efficient. There is mild redundancy across the three sentences ('return immediately', 'does not return the script's response variables', and the Returns line all circle the same non-blocking/non-returning idea).

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 tool with a full output schema and annotations, the description covers what an agent needs: what it does, the async contract, and the missing-response caveat. Explaining the return value is slightly redundant given the output schema exists, but nothing essential is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both `entity_id` and `variables` are already documented in the schema; the description's statement that variables are passed as the script's fields largely restates the schema. 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+resource ('Start a script') and immediately qualifies the execution model ('return immediately without waiting for it to finish'), which is exactly what separates it from trigger/get-config siblings. An agent can distinguish it from automations_trigger_automation and automations_get_script_trace without opening any schema.

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

Usage Guidelines4/5

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

Gives an explicit negative case ('Not for: getting the script's result — this tool never returns it'), which is strong guidance. It does not, however, name the alternative tool the agent should use instead (e.g. a trace-listing tool), so the routing is implied rather than complete.

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

automations_set_automation_configCreate or overwrite an automation configA
DestructiveIdempotent

Create or replace the automation whose config id is automation_id.

Posts config to /api/config/automation/config/<id>, replacing the whole stored config at that id (or creating a new automation if the id is unused), then calls the automation.reload service.

Not for: editing a single field without resending the rest of the config — this tool always replaces the whole stored config. Returns: dict {"status": "saved", "automation_id", "result"}. Errors: returns {"error": "config must be a dict"} when config isn't a dict, or {"error": "config must contain at least 'alias' or 'trigger'/'triggers'"} when both are missing. Limits: no confirm parameter; an existing automation at automation_id is replaced without a prompt.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesFull automation config replacing whatever is stored at `automation_id` (alias, triggers, conditions, actions, mode). Must contain 'alias' or 'trigger'/'triggers'.
automation_idYesAutomation config id to create or replace — the entity's `id` attribute, not its entity_id. An id that does not exist yet creates a NEW automation instead of editing one; read the current id from `entities_get_entity(entity_id)` -> attributes.id before editing.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructive and idempotent behavior, but the description adds concrete operational detail: it posts to a specific endpoint, calls automation.reload, returns a status dict, describes error conditions, and critically states there is no confirmation prompt when replacing an existing automation. This goes well beyond the annotations.

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

Conciseness4/5

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

The description is front-loaded and structured with clear labels (Not for, Returns, Errors, Limits). It is somewhat long, and the Returns dict is partially redundant given an output schema exists, but most sentences add valuable behavioral or usage context.

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

Completeness5/5

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

Given the destructive mutation, complete parameter schema, annotations, and output schema, the description supplies everything an agent needs: full-replacement semantics, reload side effect, no confirmation behavior, and error contracts. No critical information 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%, so both parameters are already well described in the schema. The description mainly reinforces the full-replacement meaning of config and adds error wording, but it does not materially extend parameter semantics 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 precise verb (Create or replace) and resource (the automation whose config id is automation_id), and clarifies that it replaces the whole stored config. It is clearly distinguishable from siblings like automations_get_automation_config, automations_delete_automation, and automations_set_scene_config/script_config.

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 tells the agent when not to use the tool (editing a single field without resending the rest) and implies when to use it (full create or replace). However, it does not name a specific alternative tool or describe prerequisites beyond the config id.

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

automations_set_groupCreate or update a runtime entity groupA

Create or update an old-style group.* entity at runtime.

Calls the group.set service with object_id=group_id and whichever of name/entities/icon/all/add_entities/remove_entities were given. The group is NOT written to groups.yaml and disappears on restart or automations_reload_groups-style YAML reload; for a persistent group use a Group helper or add it to groups.yaml with the files_write_config_file tools. Does not create light/switch/cover group helpers.

Not for: a group that survives a restart — define it in groups.yaml instead (files_write_config_file) or create a Group helper. Returns: dict {"status": "set", "group_id": "group.<id>"}. Errors: returns {"error": "entities cannot be combined with add_entities/remove_entities — pass a full member list via entities, or incremental changes via add_entities/remove_entities, not both"} when entities is given together with add_entities or remove_entities; group.set is not called in that case. Limits: entities replaces the whole member list and must not be combined with add_entities/remove_entities in the same call.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoMDI icon string, e.g. 'mdi:lightbulb-group'. Omit to leave it unset/unchanged.
nameNoFriendly name for the group. Omit to leave it unset/unchanged.
entitiesNoFull list of entity_ids to set as the group's members, replacing the current member list. Omit to leave members unchanged (use add_entities/remove_entities instead).
group_idYesBare group id (e.g. 'living_room_lights') — no 'group.' prefix.
add_entitiesNoEntity_ids to add to the existing member list. Do not combine with `entities`.
all_entitiesNoIf True, the group's state is 'on' only when every member is on. False (default) does not clear an existing all:true.
remove_entitiesNoEntity_ids to remove from the existing member list. Do not combine with `entities`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), but the description adds real context beyond them: the group is not written to groups.yaml, it disappears on restart or YAML reload, it forwards to group.set, and it returns a specific error payload without calling the service when entities is combined with add/remove. The one gap is that replacing the entire member list via `entities` sits awkwardly beside destructiveHint=false, though the replacement semantics are at least disclosed.

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

Conciseness3/5

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

Front-loaded and sectioned, but repetitive: the persistence caveat and the files_write_config_file alternative appear twice, and the entities/add_entities/remove_entities exclusion is stated three times (service-call paragraph, Errors, Limits). Trimming the duplication would lose no 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 7-parameter mutation tool with an output schema already present, the description covers the essentials an agent needs: mutation semantics, persistence lifecycle, valid parameter combinations, error behavior, and the correct alternative for persistent groups. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds value by enumerating exactly which fields are forwarded to group.set and by spelling out the failure contract for the entities vs add_entities/remove_entities conflict. Minor wrinkle: it refers to the `all` parameter while the schema names it `all_entities`, which could momentarily confuse mapping.

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 or update an old-style group.* entity at runtime') and immediately draws the boundary against adjacent capabilities, explicitly noting it does not create light/switch/cover group helpers. Combined with the sibling set (automations_list_groups, automations_remove_group, helpers_*), an agent can place this tool precisely without opening the schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use (runtime group that need not survive restart) and when-not ('Not for: a group that survives a restart'), naming the concrete alternatives — groups.yaml via files_write_config_file or a Group helper. It also states the mutually exclusive parameter combinations, so the agent knows how to shape a valid call.

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

automations_set_scene_configCreate or overwrite a scene configA
DestructiveIdempotent

Create or overwrite a scene's stored config, then reload scenes.

Posts {id, name, entities} to /api/config/scene/config/<id>, replacing any existing config at that id, then calls the scene.reload service so the change takes effect immediately.

Not for: applying the scene's states right now — use automations_activate_scene. Returns: dict {"scene_id", "name", "entity_count", ...} merged with HA's save response. Errors: returns {"error": "entities must be a non-empty dict of {entity_id: state_dict}"} when entities is empty or not a dict. Limits: no confirm parameter; an existing scene at scene_id is replaced without a prompt.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFriendly name shown for the scene in the UI.
entitiesYesNon-empty mapping of entity_id to its target state dict for this scene, e.g. {'light.living_room': {'state': 'on', 'brightness': 76}}. Brightness is 0-255 (30% ~ 76, 50% ~ 128, 100% = 255).
scene_idYesScene id to create or overwrite, bare (e.g. 'movie_night') or prefixed ('scene.movie_night').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint/idempotentHint/readOnlyHint=false, but the description adds genuinely new behavior: the side-effecting call to `scene.reload`, the silent overwrite with no `confirm` prompt, the exact error shape on invalid `entities`, and the merged return payload. This is well beyond what the structured fields convey and is consistent with them.

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

Conciseness4/5

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

Front-loaded with the core action, then organized into labeled Not for/Returns/Errors/Limits sections that are easy to scan. It is longer than minimal and the second sentence restates the first at a lower level, but no section is filler.

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

Completeness5/5

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

For a destructive, idempotent write tool with nested-object parameters, the description covers the side effect, the no-confirmation risk, the error contract, and the response shape. An output schema exists, so the Returns section is a bonus rather than a necessity, and 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?

Schema description coverage is 100%, so baseline is 3. The description nonetheless adds the validation contract for `entities` ('non-empty dict of {entity_id: state_dict}') and the overwrite behavior tied to `scene_id`, giving meaning slightly beyond the schema text.

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+scope ('Create or overwrite a scene's stored config') and immediately distinguishes itself from the sibling that applies scenes. An agent can separate this from automations_activate_scene, automations_get_scene_config, and automations_delete_scene 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?

Explicit 'Not for: applying the scene's states right now — use automations_activate_scene' gives a named alternative and the condition that selects it. The overwrite semantics (existing config at id replaced without prompt) further define when this tool is the right call.

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

automations_set_script_configCreate or overwrite a script configA
DestructiveIdempotent

Create or overwrite a script's stored YAML config, then reload scripts.

Posts config to /api/config/script/config/<id>, replacing the whole stored config at that id (or creating a new script if the id is unused), then calls the script.reload service.

Not for: running the script — use automations_run_script. Returns: dict {"status": "saved", "script_id", "result"}. Errors: returns {"error": "config must be a dict"} when config isn't a dict, or {"error": "config must contain at least 'alias' or 'sequence'"} when both are missing. Limits: no confirm parameter; an existing script at script_id is replaced without a prompt.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesFull script config replacing whatever is stored at `script_id` (sequence, fields, alias, mode). Must contain at least 'alias' or 'sequence'.
script_idYesScript id to create or replace, bare (e.g. 'goodnight') or prefixed ('script.goodnight'). An id that does not exist yet creates a new script.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds concrete consequences: the whole stored config at that id is replaced (not merged), script.reload is invoked as a side effect, and there is no confirm step so an existing script is overwritten silently. It also documents two specific error payloads, which is exactly the kind of behavior an agent cannot infer from annotations.

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

Conciseness5/5

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

The first sentence front-loads the whole operation (write config, then reload) and every subsequent line is a labeled block (Not for / Returns / Errors / Limits). No filler, no repetition of the title, and the destructive-overwrite caveat is given its own line rather than buried.

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

Completeness5/5

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

For an idempotent-but-destructive config writer, it covers the alternative tool, the return shape, the failure modes, and the absence of a confirmation guard. With an output schema present it did not need to explain return values in detail, yet the one-line 'Returns' is a harmless reinforcement rather than padding.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns one more by spelling out replacement semantics and surfacing runtime validation failures tied to `config` ('config must be a dict', must contain 'alias' or 'sequence'). This tells the caller what a well-formed `config` actually needs before the call, which the schema alone only partially conveys.

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 opening sentence states a specific verb pair and resource (create or overwrite a script's stored YAML config) plus the follow-on effect (reload scripts). It also states the exact endpoint, which makes it trivially distinguishable from siblings like automations_get_script_config, automations_delete_script and automations_set_scene_config.

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

Usage Guidelines4/5

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

Explicitly names a near-miss sibling and when to prefer it: 'Not for: running the script — use automations_run_script.' The create-vs-overwrite condition is also covered by the schema/description ('an id that does not exist yet creates a new script'). It stops short of 5 because it doesn't compare against automations_get_script_config or the delete/reload siblings in the same family.

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

automations_trigger_automationTrigger an automation nowA

Run an automation's actions now, skipping its normal trigger.

Calls the automation.trigger service with entity_id; Home Assistant skips the automation's conditions by default (skip_condition=true), so this can fire actions the automation's own conditions would otherwise block.

Use when: testing or forcing an automation's actions on demand. Returns: list[dict], the raw automation.trigger service-call response from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull automation entity ID to run now, e.g. 'automation.morning_routine'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=false), and the description adds a genuinely non-obvious trait: it calls automation.trigger with skip_condition=true, so conditions that normally block the automation are bypassed. That warning is valuable beyond annotations; the only gap is not saying whether this can be reverted or what side effects are possible.

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

Conciseness4/5

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

Front-loaded with the core behavior, then a short 'Use when' and 'Returns' block — efficient and scannable. The Returns line is slightly redundant given an output schema exists, but it is brief.

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 action with annotations and an output schema, the description covers purpose, trigger semantics, and usage context well. It omits only minor details such as whether conditions can be honored and what side effects the fired actions may cause.

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 there is a single required entity_id, so the schema already documents the parameter fully. The description restates that entity_id is the target but adds no format or selection guidance beyond the schema's example.

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

Purpose5/5

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

States a specific verb and resource ('Run an automation's actions now, skipping its normal trigger') and contrasts with the normal trigger path, which cleanly separates it from siblings like automations_run_script or automations_activate_scene.

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 an explicit 'Use when: testing or forcing an automation's actions on demand,' which gives clear invocation context. It does not name a specific alternative tool or state when NOT to use it (e.g., vs. running a script), 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.

automations_validate_automation_referencesCross-check automation YAML against live HAA
Read-onlyIdempotent

Cross-check entity IDs and services used in automation YAML against the live registry.

Unlike automations_validate_best_practices (static), this calls ha.get_states() and ha.list_services() to verify that every literal entity_id value and every literal service:/action: string in yaml_content exists. It only looks at literal values — it does NOT resolve device_id, area_id, label_id, or any templated reference, not just the ones containing '{{ ... }}' (which are explicitly skipped and counted in template_refs_skipped).

Use when: checking that an automation's references are real before saving it with automations_set_automation_config. Not for: YAML syntax or authoring-rule checks — use automations_validate_best_practices. Returns: dict {valid_yaml, automations_checked, entities_checked, services_checked, missing_entities[], missing_services[], template_refs_skipped, entities_check, services_check, errors[], summary}. entities_check/services_check are 'ok' or 'unavailable'. Errors: returns {"valid_yaml": False, "error": "YAML parse error: ..."} for invalid YAML. When ha.get_states() or ha.list_services() raises, the matching entities_check/services_check is 'unavailable' and errors names which fetch failed; the corresponding missing_* list stays empty rather than reporting a false "nothing missing" or a false "everything is missing". Limits: fetches the full live state list and full service list on every call.

ParametersJSON Schema
NameRequiredDescriptionDefault
yaml_contentYesYAML text of a single automation dict or a list of automation dicts to check. Parsed with plain `yaml.safe_load`, so HA-only tags like '!input'/'!secret' are not resolved.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them: it names the exact upstream calls made (`ha.get_states()`, `ha.list_services()`), enumerates what is deliberately not resolved (device_id, area_id, label_id, templates), and specifies failure semantics — 'unavailable' checks with errors naming the failed fetch, and empty rather than misleadingly-empty missing_* lists. The per-call full-state/full-service fetch cost is also disclosed.

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

Conciseness4/5

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

Front-loaded with the core purpose, then cleanly blocked into Use when / Not for / Returns / Errors / Limits. Nearly every sentence carries information, though the parenthetical about templates ('not just the ones containing '{{ ... }}'') is awkwardly nested mid-sentence and could be tightened.

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

Completeness5/5

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

Despite an output schema existing, the description still enumerates the return keys and explains the 'ok'/'unavailable' check semantics and error shape, which the schema alone would not convey. Combined with limits and non-resolution rules, an agent has everything needed to call and interpret this tool correctly.

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

Parameters3/5

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

Only one parameter and schema description coverage is 100%, so the schema already documents `yaml_content` fully (including the plain `yaml.safe_load` parsing and unresolved HA-only tags). The description reinforces the literal-only inspection semantics, which is useful framing, but adds no new parameter-level syntax or format detail. 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 ('cross-check entity IDs and services used in automation YAML against the live registry') and immediately distinguishes itself from the similarly-named sibling `automations_validate_best_practices` by labeling that one static. An agent can select this tool 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?

Explicit 'Use when' clause ties it to a concrete workflow ('before saving it with automations_set_automation_config') and an explicit 'Not for' clause routes YAML syntax/authoring checks to the named alternative. Both the positive and negative conditions are stated rather than inferred.

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

automations_validate_best_practicesValidate automation YAML authoring rulesA
Read-onlyIdempotent

Validate automation YAML against static Home Assistant authoring rules.

Parses yaml_content with plain yaml.safe_load (HA-only tags like !input/!secret are NOT resolved and make parsing fail with a YAML parse error, same as any other unknown tag) and runs fixed checks: a state trigger without 'for:', a missing 'mode:', multiple triggers without 'id:', a missing 'alias:'/'id:', the deprecated 'service:' action key, 'restart' mode, and a missing 'description:'.

Use when: linting automation YAML before saving it with automations_set_automation_config. Not for: checking that referenced entities/services actually exist — use automations_validate_automation_references; blueprint content with unresolved '!input'/'!secret' tags — extract them to plain YAML first. Returns: dict {valid_yaml, automations_checked, issues_total, warnings, infos, issues[], summary}; each issue is {automation, rule, severity, message} with severity 'warning' (should fix) or 'info' (good to know). Errors: returns {"valid_yaml": False, "error": "YAML parse error: ...", "issues": []} for invalid YAML.

ParametersJSON Schema
NameRequiredDescriptionDefault
yaml_contentYesYAML text of a single automation dict or a list of automation dicts to lint. Parsed with plain `yaml.safe_load`, so HA-only tags like '!input'/'!secret' are not resolved.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial context: parsing uses plain `yaml.safe_load` so HA-only tags fail, the exact fixed rule set run, the return dict shape, and the specific error payload for invalid YAML. This is well beyond what the annotations convey.

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

Conciseness4/5

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

Front-loaded purpose sentence followed by clearly labeled Use when / Not for / Returns / Errors blocks. It is longer than typical, but each section carries distinct, non-redundant information (checks list, return shape, error contract) and is easy to scan.

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

Completeness5/5

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

For a one-param static linter with an output schema, the description covers the parse model, the rule set, the routing to alternatives, and the error contract. Nothing an agent needs to select or 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?

Single parameter with 100% schema coverage, so the schema already documents `yaml_content` including the safe_load/!input caveat. The description largely restates that parsing behavior rather than adding new parameter-level semantics, 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?

Opens with a specific verb+resource: 'Validate automation YAML against static Home Assistant authoring rules.' It immediately distinguishes itself from the sibling `automations_validate_automation_references` and enumerates the concrete static checks performed, so an agent knows exactly what class of validation this is.

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

Usage Guidelines5/5

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

Explicit 'Use when' (linting before saving with `automations_set_automation_config`) and 'Not for' clauses that name the alternative tool for reference checking and call out the blueprint/!input case with a prescribed workaround. Both when-to-use and when-not-to-use are stated with named siblings.

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

blueprints_delete_blueprintDelete an installed blueprintA
DestructiveIdempotent

Delete an installed blueprint by its relative path.

Calls the blueprint/delete WebSocket command for domain/path; the file under /config/blueprints// is removed and its content is lost, with no backup taken by this tool.

Not for: automations or scripts generated from this blueprint — they keep running with their already-substituted config; use automations_delete_automation or automations_delete_script for those. Returns: Home Assistant's blueprint/delete result (typically an empty success payload). Limits: blocks for the WebSocket round trip; the default 10 second response wait in ha._ws_call applies. No confirm parameter guards this deletion.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesBlueprint path relative to /config/blueprints/<domain>/ to delete, e.g. 'author/blueprint_name.yaml'.
domainNoBlueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'.automation

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: the underlying `blueprint/delete` WebSocket command, that the file under /config/blueprints/<domain>/ is removed with content lost and no backup, that there is no confirm guard, and that it blocks on a ~10s round trip. These are exactly the behavioral traits an agent needs before invoking an irreversible delete.

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

Conciseness4/5

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

Front-loaded with the core action, then clearly partitioned into Not-for / Returns / Limits blocks, so no sentence is wasted. It is on the verbose side for a two-parameter delete, but the structure makes the length scannable rather than padded.

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

Completeness5/5

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

Even though an output schema exists, the description notes the return is typically an empty success payload, and it covers destructive semantics, timing limits, and the absence of a confirm parameter. For a destructive two-param tool, 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.

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 still adds value by framing `path` as relative to /config/blueprints/<domain>/ and tying `domain` to the file location, reinforcing the relationship between the two parameters beyond their individual schema descriptions.

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

Purpose5/5

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

States a specific verb ('Delete') and resource ('an installed blueprint') plus the locating key ('by its relative path'). It is immediately distinguishable from sibling blueprints tools (import/save/substitute) and from the automations_delete_* tools it explicitly routes to.

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 negative case ('Not for: automations or scripts generated from this blueprint') and the exact alternatives to use instead (`automations_delete_automation`, `automations_delete_script`), including the reason (they keep running with substituted config). This is textbook when/when-not/alternative guidance.

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

blueprints_import_blueprintImport and validate a blueprint from a URLA
Read-onlyIdempotent

Fetch a blueprint from a URL and validate it without saving it.

Calls the blueprint/import WebSocket command, which has Home Assistant download url and validate its YAML. This only downloads and validates — it does NOT save anything to disk.

Use when: previewing a blueprint (its metadata and validation errors) before deciding to persist it. Not for: persisting the fetched blueprint — pass its raw_data and suggested_filename to blueprints_save_blueprint. Returns: dict with suggested_filename, raw_data (the blueprint YAML text), blueprint.metadata, validation_errors and exists (whether a blueprint already sits at that path). Limits: blocks for the WebSocket round trip plus the remote download time; the default 10 second response wait in ha._ws_call applies.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesHTTP(S) URL to fetch the blueprint YAML from, e.g. a GitHub raw file link or a community forum export link.
domainNoBlueprint domain the fetched blueprint belongs to, 'automation' or 'script'. Defaults to 'automation'.automation

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), yet the description adds non-obvious behavior: it downloads and validates but never persists, the round trip includes a remote download, and the default 10-second ha._ws_call wait applies. That timing/bounding context is genuinely value-add beyond structured fields.

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

Conciseness4/5

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

Front-loaded with the core action, then cleanly sectioned into Use/Not for/Returns/Limits. Slightly repetitive in stating non-persistence twice ('does NOT save anything to disk' and 'Not for: persisting'), but every block still carries useful information.

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

Completeness5/5

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

For a two-param, output-schema-bearing tool, the description covers purpose, routing to the alternative, return shape summary, and blocking/timeout limits. Nothing an agent needs in order to call and interpret 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 url and domain are already fully documented with examples and defaults in the schema. The description adds no syntax or format detail beyond that, so the baseline 3 applies; the return-value fields it mentions are outputs, not parameters.

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

Purpose5/5

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

States a specific verb+resource+scope: 'Fetch a blueprint from a URL and validate it without saving it.' It also names the WebSocket command invoked and contrasts with blueprints_save_blueprint, so an agent can distinguish it from siblings without opening schemas.

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

Usage Guidelines5/5

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

Includes explicit 'Use when:' (previewing metadata and validation errors before persisting) and 'Not for:' clauses that route the agent to blueprints_save_blueprint with the exact fields (raw_data, suggested_filename) to pass along. Both the when and the alternative are stated, not inferred.

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

blueprints_list_blueprintsList installed blueprintsA
Read-onlyIdempotent

List all installed blueprints for a domain over the WebSocket API.

Calls the blueprint/list WebSocket command via ha._ws_call for the given domain and returns Home Assistant's response unchanged; nothing is read from disk directly here.

Use when: enumerating what blueprints exist under /config/blueprints/ before importing, substituting or deleting one. Returns: dict keyed by blueprint path, each value the blueprint's metadata (name, description, domain, source_url) as returned by HA. Limits: blocks for the WebSocket round trip; the default 10 second response wait in ha._ws_call applies.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoBlueprint domain folder under /config/blueprints/ to list, 'automation' or 'script'. Defaults to 'automation'.automation

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real operational context on top: it discloses the underlying `blueprint/list` WebSocket command via `ha._ws_call`, that nothing is read from disk, and that the call blocks for the round trip with a default 10 second wait. That timeout/blocking behavior is exactly 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?

Purpose is front-loaded in the first sentence, followed by compact labeled sections (Use when / Returns / Limits). Every sentence carries information; nothing is redundant padding despite the multi-line length.

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

Completeness5/5

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

Even though an output schema exists (so Returns needn't be spelled out), the description proactively summarizes the return shape, and adds mechanism, usage trigger, and a blocking/timeout caveat. For a low-complexity single-parameter list tool this is more than sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so the single 'domain' parameter is fully documented in the schema itself (type, default, folder semantics). The description restates the domain scoping ('for the given domain') but adds no syntax or format detail beyond the schema. 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 (List), resource (installed blueprints), scope (for a domain), and mechanism (over the WebSocket API). An agent can distinguish it from blueprints_import_blueprint, blueprints_save_blueprint, blueprints_delete_blueprint, and blueprints_substitute_blueprint purely from the description.

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 trigger condition ('Use when: enumerating what blueprints exist under /config/blueprints/<domain>') and ties it to the sibling actions that follow (importing, substituting, deleting). It leaves nothing to inference about when this tool is the right one.

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

blueprints_save_blueprintSave a blueprint fileA
DestructiveIdempotent

Save blueprint YAML to /config/blueprints//.

Calls the blueprint/save WebSocket command with yaml_content as the payload and overwrite mapped to HA's allow_override flag; with overwrite=False (default) it does not replace an existing file at path, and with overwrite=True it does, losing the previous content.

Not for: fetching a blueprint from the internet first — use blueprints_import_blueprint to get raw_data/suggested_filename. Returns: Home Assistant's blueprint/save result (typically an empty success payload). Errors: Home Assistant raises a WebSocket error, surfaced by ha._ws_call as a RuntimeError, when overwrite=False and a file already exists at path. Limits: blocks for the WebSocket round trip; the default 10 second response wait in ha._ws_call applies. No confirm parameter — the only overwrite guard is the overwrite flag itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesBlueprint path relative to /config/blueprints/<domain>/, e.g. 'author/blueprint_name.yaml'. Typically the `suggested_filename` from `blueprints_import_blueprint`.
domainNoBlueprint domain folder to save under, 'automation' or 'script'. Defaults to 'automation'.automation
overwriteNoIf True, replace an existing file at `path`. If False (default), Home Assistant refuses the save when a file already exists there.
source_urlNoOrigin URL to record as the blueprint's source_url metadata. Omit to save without one.
yaml_contentYesRaw blueprint YAML text to persist, e.g. the `raw_data` field returned by `blueprints_import_blueprint`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: overwrite=False (default) refuses to replace an existing file while overwrite=True loses the previous content, the RuntimeError surfaced by ha._ws_call on conflict, the blocking WebSocket round trip with a 10s default wait, and the explicit absence of a confirm parameter. This is rich behavioral disclosure.

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

Conciseness5/5

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

The description is front-loaded with the purpose and destination, then cleanly partitioned into Not for / Returns / Errors / Limits sections. Every sentence carries operational value, and length is justified by a mutation tool with several edge conditions.

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

Completeness5/5

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

An output schema exists, so return values need not be re-explained, and the description still notes the typical empty success payload. Combined with the error and timeout coverage, an agent has everything required to invoke the tool correctly, including the path convention tied to blueprints_import_blueprint.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still adds cross-system meaning beyond the schema by explaining that overwrite maps to Home Assistant's allow_override flag, which an agent invoking the underlying WebSocket command would not learn from the schema alone.

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

Purpose5/5

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

The first line states a specific verb and resource with the exact destination ('Save blueprint YAML to /config/blueprints/<domain>/<path>'), and the description explicitly names what this tool is NOT for, routing fetching-from-internet cases to blueprints_import_blueprint. An agent can distinguish this from the sibling import/delete blueprint tools without opening any schema.

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

Usage Guidelines5/5

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

The 'Not for:' clause names the alternative tool (blueprints_import_blueprint) and the condition that selects it (getting raw_data/suggested_filename from the internet first). The overwrite semantics also clarify when a destructive save is intended versus refused, 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.

blueprints_substitute_blueprintRender a blueprint with given inputsA
Read-onlyIdempotent

Render a blueprint with given inputs into a plain automation or script.

Calls the blueprint/substitute WebSocket command, which resolves input against the blueprint's input: placeholders and returns the resulting config; nothing is saved or reloaded by this tool.

Use when: previewing the concrete triggers/conditions/actions a blueprint would produce before saving it via automations_set_automation_config or automations_set_script_config. Returns: dict with the substituted automation/script YAML content as a dict. Limits: blocks for the WebSocket round trip; the default 10 second response wait in ha._ws_call applies.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesBlueprint path relative to /config/blueprints/<domain>/ to render, e.g. 'author/blueprint_name.yaml'.
inputYesInput values keyed by the input name declared in the blueprint's own `input:` section.
domainNoBlueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'.automation

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuine context beyond them: the underlying blueprint/substitute command, that inputs resolve against the blueprint's input: placeholders, that nothing is saved or reloaded, and a 10-second WebSocket blocking limit. This is rich behavioral disclosure.

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

Conciseness5/5

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

Front-loaded with the action, then labeled sections (Use when, Returns, Limits) make it scannable. Every sentence carries distinct information 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?

Even though an output schema exists, the description still clarifies return shape, usage context, and runtime limits. For a read-only render/preview tool with nested input objects, nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so path/input/domain are fully documented in the schema itself. The description adds only conceptual context about how input maps to placeholders, so the baseline of 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 ('Render') and resource ('a blueprint with given inputs') and specifies the output form ('plain automation or script'). It is clearly distinguishable from sibling config-writers like automations_set_automation_config.

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

Usage Guidelines5/5

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

Explicitly provides a 'Use when:' clause (previewing concrete triggers/conditions/actions before saving) and names the exact alternatives (automations_set_automation_config, automations_set_script_config) that apply after this step. The routing condition is unambiguous.

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

calendar_create_eventCreate a calendar eventA

Create a new event on a calendar via the calendar.create_event service.

Maps start/end to the service's start_date_time/end_date_time fields. Calling this twice with identical arguments creates two separate events, since HA assigns each a new uid.

Use when: adding a new event to a calendar that supports creation (local or CalDAV calendars). Not for: removing an event — use calendar_delete_event. Returns: {"entity_id", "summary", "start", "end", "result": ...} where result is the service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesEvent end as an ISO 8601 datetime, e.g. '2026-04-28T11:00:00'.
startYesEvent start as an ISO 8601 datetime, e.g. '2026-04-28T10:00:00'.
summaryYesEvent title, e.g. 'Dentist appointment'.
locationNoOptional event location text. Omit for none.
entity_idYesCalendar entity ID to add the event to, e.g. 'calendar.family'.
descriptionNoOptional longer event description/notes. Omit for none.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=false, destructive=false. The description adds real behavioral context beyond annotations: it explains the non-idempotency mechanism (two identical calls yield two events because HA assigns a new `uid`) and the parameter-to-service field mapping (start/end -> start_date_time/end_date_time).

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

Conciseness4/5

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

Front-loaded with the core verb+resource, then structured into mapping, when/not-for, and returns sections. Slightly verbose, and the Returns section partly duplicates the output schema, but every sentence carries usable 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 mutation tool with a full output schema and full annotation coverage, the description supplies the missing behavioral pieces (non-idempotency, service field mapping, sibling routing). The Returns restatement is redundant given the output schema, but nothing needed to call it correctly is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are documented in the schema; baseline is 3. The description adds marginal value by clarifying how start/end map to the underlying service fields, but adds no syntax beyond the ISO 8601 examples already in the schema.

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

Purpose5/5

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

States a specific verb (Create) and resource (new event on a calendar), and names the sibling it is not for removal (`calendar_delete_event`). An agent can distinguish it from calendar_list_events and calendar_delete_event without opening schemas.

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

Usage Guidelines5/5

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

Explicit `Use when:` clause (adding an event to a calendar that supports creation, local or CalDAV) and an explicit `Not for:` clause routing deletion to `calendar_delete_event`. Both the when and when-not conditions are stated.

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

calendar_delete_eventDelete a calendar eventA
DestructiveIdempotent

Delete a calendar event by its uid via WS calendar/event/delete.

Only works for calendar platforms that declare CalendarEntityFeature.DELETE_EVENT (e.g. local/CalDAV calendars); read-only integrations such as Google Calendar reject it, and this returns ok: False with HA's error instead of raising.

Use when: removing an event or a recurring instance from a calendar that supports deletion. Not for: creating an event — use calendar_create_event; not for read-only calendar integrations, which will fail here regardless of arguments. Returns: {"entity_id", "uid", "result": ..., "ok": True} on success. Errors: {"entity_id", "uid", "ok": False, "error": str(e)} when the platform rejects the deletion or the WS call otherwise raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesEvent UID to delete, as returned by `calendar_list_events`.
entity_idYesCalendar entity ID the event belongs to, e.g. 'calendar.family'.
recurrence_idNoNarrows deletion to one instance of a recurring event. Omit to target the whole event/series.
recurrence_rangeNoExtends `recurrence_id` deletion to a range, e.g. 'THISANDFUTURE'. Omit for a single-instance deletion.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, yet the description adds significant context beyond them: the `CalendarEntityFeature.DELETE_EVENT` platform gate, the fact that read-only integrations (e.g. Google Calendar) reject it, and the critical error contract that failures return `ok: False` rather than raising. This materially changes how an agent should handle the call.

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

Conciseness4/5

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

Well front-loaded with labeled sections (Use when / Not for / Returns / Errors) and no filler. Slight redundancy: the 'Returns' line restates the success shape even though an output schema exists, and the platform-gate sentence is a touch verbose.

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

Completeness5/5

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

For a destructive, entity-gated mutation tool, the definition covers the feature-gate prerequisite, failure mode, alternative tool, and return contract. An agent has everything needed to call it correctly and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (uid, entity_id, recurrence_id, recurrence_range) are already documented in the schema. The description only references `uid` and adds no syntax or format detail beyond what the schema provides, 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+resource ('Delete a calendar event by its `uid`') and even names the underlying WS endpoint. It explicitly distinguishes itself from the `calendar_create_event` sibling, so an agent can identify it without inspecting other schemas.

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

Usage Guidelines5/5

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

Provides explicit 'Use when' and 'Not for' sections, naming the alternative tool (`calendar_create_event`) and the condition under which this tool will fail (read-only integrations regardless of arguments). Routing is unambiguous.

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

calendar_list_calendarsList calendar entitiesA
Read-onlyIdempotent

List every calendar.* entity known to HA.

Calls GET /api/calendars over HTTP.

Use when: discovering which entity_id to pass to calendar_list_events/calendar_create_event/calendar_delete_event. Not for: the events within a calendar — use calendar_list_events. Returns: list of {"entity_id", "name"} dicts, or an empty list if the response isn't a JSON list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=false, so safety profile is covered. The description adds the HTTP endpoint and the return shape, but does not disclose pagination, rate limits, or authentication requirements. With annotations carrying the safety profile, this is adequate 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?

Front-loads the purpose, then the HTTP call, then use/not-for, then returns. Each section is a short, distinct sentence that 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 zero-param, read-only list tool with full annotations, the description covers everything: what it lists, the endpoint, when to use it, the alternative, and the return shape. Nothing essential is missing.

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

Parameters4/5

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

Zero parameters, so baseline is 4. The description correctly notes no parameters are needed and adds meaning about the returned dicts, which is beyond what the empty schema says.

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

Purpose5/5

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

States a specific verb and resource ('List every calendar.* entity'), and explicitly names the sibling tools it is not (calendar_list_events), making clear it returns calendar entities, not events. An agent can distinguish it from the three calendar siblings 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?

Provides explicit 'Use when' (to discover entity_id for calendar_list_events/create/delete) and 'Not for' (events within a calendar) guidance, with the exact alternative named. No inference required.

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

calendar_list_eventsList events on a calendarA
Read-onlyIdempotent

List events on one calendar between start and end.

Calls GET /api/calendars/{entity_id} over HTTP with start/end as query parameters.

Use when: reading a calendar's upcoming or past events for a known date range. Not for: listing the calendar entities themselves — use calendar_list_calendars. Returns: list of event dicts as returned by HA (fields include summary, start, end, uid), or an empty list if the response isn't a JSON list.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRange end as an ISO 8601 datetime, e.g. '2026-05-05T00:00:00'.
startYesRange start as an ISO 8601 datetime, e.g. '2026-04-28T00:00:00'.
entity_idYesCalendar entity ID, e.g. 'calendar.family', from `calendar_list_calendars`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds the underlying HTTP call shape and a notable fallback behavior (returns an empty list when the response isn't a JSON list), which is genuine context beyond annotations.

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

Conciseness4/5

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

Front-loaded with purpose, then endpoint, then usage, then returns — a clean, scannable structure. The HTTP endpoint line is somewhat incidental detail, but every other 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?

Despite an output schema existing (so return-value documentation is not strictly required), the description still conveys return shape and the empty-list edge case. An agent has everything needed to call this correctly and interpret results.

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 all three parameters are fully documented with types, required status, and examples. The description only restates start/end as query parameters, adding little beyond the schema. 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?

Specific verb (List) + resource (events) + scope (one calendar, between start and end). It explicitly names the sibling it is not (calendar_list_calendars), so an agent can distinguish it 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?

Uses explicit 'Use when' and 'Not for' structure with a named alternative sibling. Both the positive condition (known date range) and the exclusion (listing calendar entities) 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.

card_builder_build_from_recipeBuild card config from recipeA
Read-onlyIdempotent

Materialise a recipe shorthand into a full DocumentData (config) dict.

Builds a canvas root wrapping one block-container, recursively turns recipe["blocks"] into the block tree via _build_block_tree (auto-inserting block-drop-zone children for layout blocks and auto-wrapping raw prop scalars in {"value": ...}), and returns the assembled {version, rootId, slots, blocks} dict. Pure computation — makes no call to Home Assistant.

Use when: turning a recipe (hand-written or from card_builder_get_card_template) into the config to pass to card_builder_create_card/card_builder_update_card. Not for: hand-crafted low-level DocumentData — assemble that directly instead; a template-driven one-shot creation — use card_builder_make_template_card. Returns: a dict ready to pass as config to card_builder_create_card. Errors: raises ValueError when recipe["root_slot"] isn't defined in recipe["slots"], when a block in recipe["blocks"] has an unknown or internal type, or when a non-container block type is given children. Limits: run card_builder_validate_config on the result before saving — this tool does not validate the produced tree itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
recipeYesRecipe shorthand: {slots, root_slot|root_entity, blocks, root_styles, root_dz_styles, canvas_styles, action_slots, ...} — see card_builder_recipe_guide for the full shape.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare read-only/idempotent/non-destructive, and the description corroborates while adding context annotations cannot: it is pure computation making no Home Assistant call, and it lists the exact ValueError conditions (undefined root_slot, unknown/internal block type, children on a non-container). It also discloses the 'does not validate the tree' limitation and the validate_config follow-up.

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

Conciseness5/5

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

Front-loads the core purpose, then uses labeled sections (Use when / Not for / Returns / Errors / Limits) that each carry distinct, non-redundant information. No filler sentences; the length is justified by the tool's complexity.

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

Completeness5/5

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

For a complex nested-input tool this covers purpose, routing, transformation behavior, error modes, and the required post-step (validate_config). With an output schema present it needn't explain return values, yet it still notes the result is ready to pass as config.

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 single param has 100% schema coverage and the schema already describes the recipe shape, so baseline is 3. The description goes further by explaining what happens to recipe['blocks'], root blocks, and scalars, and by pointing to card_builder_recipe_guide for the full shape, adding real value 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 transformation: 'Materialise a recipe shorthand into a full DocumentData (config) dict,' and details the internal work (_build_block_tree, drop-zone insertion, scalar wrapping). It also names the siblings it complements (card_builder_create_card/update_card) and contrasts with card_builder_make_template_card, so an agent can distinguish 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?

Explicit 'Use when' (turning a recipe, hand-written or from card_builder_get_card_template, into config for create/update) and 'Not for' clauses (hand-crafted low-level DocumentData, template-driven one-shot creation via card_builder_make_template_card). Alternatives and exclusions are fully spelled out.

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

card_builder_build_stylesCompose styles from snippetsA
Read-onlyIdempotent

Compose a styles object from one or more built-in snippets plus optional overrides.

Merges each named entry from STYLE_SNIPPETS in order, then extra, at the property level — later entries override earlier ones for the same category/property; makes no call to Home Assistant.

Use when: assembling a block's styles/dz_styles from reusable presets instead of hand-writing the full envelope. Returns: {<target>: {containers: {<container>: {<category>: {<prop>: <value>, ...}, ...}}}}. Errors: {"error": "unknown_snippet", "name": ..., "known": [...]} when a name in snippet_names isn't a known snippet.

ParametersJSON Schema
NameRequiredDescriptionDefault
extraNoExtra ContainerStyleData ({category: {prop: {value, unit}}}) merged in last, overriding the snippets. Omit for none.
targetNoStyle target key to wrap the result under, e.g. 'block' or 'state'. Defaults to 'block'.block
containerNoResponsive container to wrap the result under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'.desktop
snippet_namesYesOrdered list of snippet names from card_builder_list_style_snippets to merge, e.g. ['card_padded', 'vertical_stack'].

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds genuinely new behavior: property-level merge order (later entries override earlier for the same category/property), the explicit 'makes no call to Home Assistant' guarantee, and the unknown_snippet error shape with its known list.

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

Conciseness5/5

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

Front-loaded with the core action, then cleanly separated Use when / Returns / Errors blocks. Every sentence carries distinct information; nothing is redundant 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 pure-computation composer with full schema coverage and an output schema, the definition covers purpose, usage condition, merge semantics, and error behavior. An agent has everything needed to select and invoke it correctly; the Returns line is mildly redundant given the output schema but not harmful.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by spelling out merge precedence between ordered snippet_names and the trailing extra object, which the schema only hints at, adding real semantic value on how the inputs interact.

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 (compose) and resource (a styles object from built-in snippets plus overrides), and names the underlying STYLE_SNIPPETS source. It is clearly distinguishable from sibling style tools like card_builder_get_style_snippet or card_builder_list_style_presets.

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

Usage Guidelines4/5

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

The 'Use when' clause gives concrete context — assembling a block's styles/dz_styles from reusable presets rather than hand-writing the full envelope — and points at card_builder_list_style_snippets as the source of names. It stops short of naming an explicit alternative tool to use when the condition is false, so it is clear but not fully routing.

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

card_builder_check_schema_syncCheck embedded schema against upstreamA
Read-onlyIdempotent

Compare the embedded block schema against upstream Card Builder's main branch on GitHub.

Fetches custom_components/card_builder/manifest.json and frontend/src/common/blocks/loader.ts from raw.githubusercontent.com/{UPSTREAM_REPO}/main over HTTP and diffs the upstream version/block list against this module's BLOCK_TYPES and UPSTREAM_SCHEMA_SYNC constants. Reaches outside the HA instance and its host.

Use when: a recipe that used to work stops producing the expected card — the upstream integration may have shipped a breaking schema change. Returns: {status: "ok"|"drift"|"fetch_failed", upstream_version, embedded_version, version_matches, missing_block_types, extra_embedded_block_types, advice, embedded_schema, ...}. Errors: {"status": "fetch_failed", "error": <exception text>, "embedded": ...} when the manifest request itself fails (a timeout or network error); a failed loader fetch instead sets loader_fetch_error and still returns status. Limits: two GitHub requests with a 10-second timeout each.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, openWorld, non-destructive), the description discloses that it reaches outside the HA instance and host, makes two GitHub HTTP requests with a 10-second timeout each, and specifies distinct error behaviors for manifest vs loader fetch failures. This is exactly the extra behavioral context annotations cannot carry.

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

Conciseness5/5

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

Well front-loaded: purpose first, then Use when / Returns / Errors / Limits sections. Each block is information-dense and specific, with no filler sentences.

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 no-arg diagnostic tool that touches the network, the definition covers purpose, trigger, return shape, error modes, and rate/timeout limits. Even though an output schema exists (so return values needn't be restated), the added detail is accurate and useful rather than redundant padding.

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

Parameters4/5

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

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to clarify beyond the schema, and it correctly focuses its prose elsewhere.

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

Purpose5/5

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

The description opens with a specific verb and resource — 'Compare the embedded block schema against upstream Card Builder's main branch on GitHub' — and names the exact upstream files involved. An agent can distinguish this diagnostic tool from siblings like card_builder_get_block_schema or card_builder_validate_config 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?

'Use when: a recipe that used to work stops producing the expected card — the upstream integration may have shipped a breaking schema change' gives a concrete triggering scenario. It stops short of naming alternatives or explicit when-not conditions, so it is clear but not a full routing guide.

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

card_builder_create_cardCreate Card Builder cardA

Create a new Card Builder card from a DocumentData config.

Sends config and the metadata fields to card_builder/cards/create, which assigns a new id server-side (confirmed in upstream storage.py: every create path generates a fresh uuid4) — repeating this call with identical arguments creates a second, distinct card rather than updating the first.

Use when: saving a card built with card_builder_build_from_recipe or card_builder_make_template_card's underlying recipe. Not for: changing an existing card — use card_builder_update_card. Returns: the created card dict, including its new id. Limits: run card_builder_validate_config on config first; this tool does not validate the block tree before sending it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new card, e.g. 'AC Salon'.
tagsNoFreeform tags for filtering in the Card Builder UI. Omit for no tags.
authorNoAuthor name to store on the card. Empty string if omitted.
configYesFull DocumentData v3 block tree (version/rootId/slots/blocks). Build it with `card_builder_build_from_recipe` rather than hand-writing it.
categoriesNoCategory labels (e.g. domain names) for the Card Builder UI. Omit for none.
descriptionNoFree-text card description. Empty string if omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false and idempotentHint=false, but the description adds concrete consequences: every create path generates a fresh uuid4, so repeating with identical arguments creates a second distinct card rather than updating. It also discloses that the block tree is not validated before sending and that the created card dict including the new id is returned.

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

Conciseness5/5

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

The description is front-loaded with the core action, then cleanly segmented into Use when, Not for, Returns, and Limits. Every sentence adds operational value with no repetition or filler.

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

Completeness5/5

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

Given the tool's mutation nature, full schema coverage, output schema, and annotations, the description is complete. It covers creation semantics, non-idempotency, prerequisite validation, routing to siblings, and return behavior, leaving no critical gap for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented in the schema. The description adds only high-level framing ('sends config and the metadata fields') without new syntax, format, or constraint details beyond what the schema provides. 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?

The description states a specific verb and resource ('Create a new Card Builder card from a DocumentData config') and distinguishes the tool from siblings by naming update_card, build_from_recipe, make_template_card, and validate_config. An agent can identify the exact operation 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?

Explicit 'Use when' and 'Not for' sections route the agent: use for saving a card built via recipes/templates, not for changing existing cards (use card_builder_update_card). It also states a prerequisite ('run card_builder_validate_config first'), covering when-not and alternatives.

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

card_builder_create_css_custom_propertyCreate CSS custom propertyA

Register a new CSS custom property (@property) for use in card styles.

Sends the four fields to card_builder/css_custom_properties/create, which assigns a new id server-side (confirmed in upstream storage.py: every create path generates a fresh uuid4) — repeating this call registers a second, distinct property rather than updating the first.

Use when: defining an animatable/typed CSS variable (e.g. a themeable accent color) that card styles can reference by name. Returns: the created CSS-custom-property dict, including its new id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCSS custom property name, e.g. '--card-accent-color' (with the leading '--').
syntaxYesCSS @property syntax descriptor, e.g. '<color>' or '<length>'.
inheritsNoWhether the property inherits from parent elements, per the CSS @property spec. Defaults to false.
initial_valueYesInitial value matching `syntax`, e.g. '#2196f3' for a <color>.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and idempotentHint=false, so the description goes further by spelling out the practical consequence of non-idempotency (a repeat call creates a second property) and the server-side id assignment. It doesn't cover auth/permission needs, but the behavioral disclosure is solid beyond the hints.

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

Conciseness4/5

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

Purpose is front-loaded and the when-to-use and returns notes are well ordered. The parenthetical citing the upstream storage.py uuid4 implementation is slightly gratuitous detail that adds length without much agent-facing value.

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

Completeness5/5

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

With annotations covering safety and an output schema covering return values, the description supplies the remaining essentials: purpose, when to use it, and the non-idempotent creation behavior. Nothing an agent needs in order to call it correctly is missing.

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

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 (name, syntax, inherits, initial_value) are already documented in the schema. The description only alludes to 'the four fields' without adding syntax, format, or validation meaning beyond the schema, so the baseline 3 applies.

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

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 CSS custom property (@property)' — and names the backing endpoint. It also clarifies it is a create, not an update ('registers a second, distinct property rather than updating the first'), which distinguishes it from the list/delete/update CSS-property siblings.

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 when-to-use trigger: 'defining an animatable/typed CSS variable (e.g. a themeable accent color) that card styles can reference by name.' There are no explicit exclusions or named alternative tools, but the non-idempotency note steers usage clearly.

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

card_builder_create_style_presetCreate Card Builder style presetA

Create a new reusable Card Builder style preset.

Sends data and the metadata fields to card_builder/style_presets/create, which assigns a new id server-side (confirmed in upstream storage.py: every create path generates a fresh uuid4) — repeating this call creates a second, distinct preset rather than updating the first.

Use when: packaging a reusable set of style properties (e.g. a card theme) to apply across multiple cards. Not for: changing an existing preset — use card_builder_update_style_preset. Returns: the created style-preset dict, including its new id.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesCSS-style configuration blob, shaped like a style category map (see card_builder_list_style_categories).
nameYesDisplay name for the new preset, e.g. 'Dark Hero'.
descriptionNoFree-text preset description. Empty string if omitted.
extends_preset_idNoId of another style preset this one extends/inherits from. Omit for no inheritance.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and idempotentHint=false, so the write/non-idempotent profile is partially covered. The description goes beyond that by explaining the mechanism ('assigns a new id server-side... every create path generates a fresh uuid4') and the practical consequence ('repeating this call creates a second, distinct preset rather than updating the first'), which tells the agent retry semantics. It does not cover permissions or whether the created preset is immediately persisted/visible, 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.

Conciseness4/5

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

Front-loads the action, then uses labeled 'Use when' / 'Not for' / 'Returns' structure that is easy to scan. The parenthetical aside about upstream storage.py is slightly more detail than needed, but it is short and it justifies the non-idempotency claim rather than 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 4-param mutation tool with full schema coverage, an output schema, and annotations covering the safety profile, the description supplies everything the agent additionally needs: the action, the routing alternative, non-idempotency consequences, and the existence of a new generated id. 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 description coverage is 100%, so all four parameters (name, data, description, extends_preset_id) are already documented in the schema, including the inheritance semantics of extends_preset_id — baseline is 3. The description adds only loose context ('a set of style properties, e.g. a card theme') and 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 ('Create a new reusable Card Builder style preset') and immediately distinguishes itself from the sibling it is not ('Not for: changing an existing preset — use card_builder_update_style_preset'). An agent can pick between the two create/update 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 Guidelines5/5

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

Gives an explicit 'Use when' condition (packaging reusable style properties to apply across multiple cards) and an explicit 'Not for' exclusion that names the alternative tool. This is the full when/when-not/alternative pattern; nothing is left to inference.

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

card_builder_delete_cardDelete Card Builder cardA
DestructiveIdempotent

Permanently delete one Card Builder card by id.

Calls card_builder/cards/delete; Home Assistant's WebSocket handler returns an empty payload on success. Any dashboard still referencing this card_id via custom:card-builder-renderer-card will show a broken/empty card afterwards — this tool does not check for or update such references.

Use when: removing a card that is no longer used on any dashboard. Returns: {"status": "deleted", "card_id": ..., "result": ...} on success. Errors: on failure, returns {"status": "error", "card_id": ..., "error": <exception text>} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesId of the card to delete, from card_builder_list_cards.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuine context beyond that: the empty-payload success behavior of the WebSocket handler, the downstream consequence for dashboards referencing the card_id via custom:card-builder-renderer-card, and that no reference cleanup is performed.

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

Conciseness4/5

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

Front-loads the destructive consequence in the first sentence, then structures the rest as 'Use when'/'Returns'/'Errors' labels. Slightly long, and the Returns/Errors detail partly duplicates the output schema, but every sentence carries real 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?

Although an output schema exists, the description still pre-empts the two questions an agent would have for a destructive one-param tool: what happens to referencing dashboards, and how failures surface. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% with a single required card_id, whose schema description already points at card_builder_list_cards as the source. The description restates 'by id' without adding format or retrieval 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 (permanently delete), resource (one Card Builder card), and scope (by id), and names the underlying `card_builder/cards/delete` call. An agent can distinguish this from card_builder_list_cards, card_builder_get_card, card_builder_update_card, and the delete_style_preset/delete_media siblings 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 use condition: 'Use when: removing a card that is no longer used on any dashboard,' which also implies when not to use it (a card still referenced). No alternative tool is named, but for a deletion operation there is no plausible alternative to route to, so the gap is minor.

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

card_builder_delete_css_custom_propertyDelete CSS custom propertyA
DestructiveIdempotent

Permanently delete one registered CSS custom property by id.

Calls card_builder/css_custom_properties/delete. Any card style still referencing this property's name keeps that reference — the browser falls back to an unset CSS variable — this tool does not check for or update such references.

Use when: removing a custom property that is no longer used by any card style. Returns: {"status": "deleted", "custom_property_id": ..., "result": ...} on success. Errors: on failure, returns {"status": "error", "custom_property_id": ..., "error": <exception text>} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
custom_property_idYesId of the property to delete, from card_builder_list_css_custom_properties.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint, idempotentHint): it discloses that dangling references in card styles are left intact and that the browser falls back to an unset variable, notes the underlying call path, and documents both the success and error payload shapes with the fact that errors are returned rather than raised. This is exactly the kind of consequence-level detail an agent needs before a destructive call.

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

Conciseness4/5

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

Front-loaded with the action and permanence, then clips into labeled Use when / Returns / Errors blocks, so it is easy to scan. The Returns section largely restates the output schema, which is mild redundancy rather than waste.

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

Completeness5/5

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

For a single-parameter destructive tool with annotations plus an output schema, nothing an agent needs is missing: the side effects on referencing styles, the non-throwing error contract, and the precondition (property no longer used) are all present.

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

Parameters3/5

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

One parameter with 100% schema description coverage, so the schema already carries the semantics. The description adds only 'by id,' which duplicates the schema and adds no format or lookup guidance. 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 scope: 'Permanently delete one registered CSS custom property by id.' The 'one' and 'by id' constrain the operation, and among siblings it is clearly distinguishable from card_builder_create_css_custom_property, card_builder_update_card, and the general delete_card/delete_style_preset 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?

Explicit 'Use when: removing a custom property that is no longer used by any card style,' and it warns that references are not checked or updated. It does not name a sibling alternative (e.g., update_card or build_styles when a property is still in use), so the routing 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.

card_builder_delete_mediaDelete Card Builder media fileA
DestructiveIdempotent

Permanently delete one file from the Card Builder media directory.

Calls card_builder/media/delete with path relative to www/card_builder/. Any card whose mediaReference points at this file (e.g. via block-image or block-weather-background) will fail to load it afterwards — this tool does not check for or update such references.

Use when: removing an uploaded image/SVG that no card uses anymore. Returns: {"status": "deleted", "path": ..., "result": ...} on success. Errors: on failure, returns {"status": "error", "path": ..., "error": <exception text>} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath of the file to delete, relative to www/card_builder/ (see card_builder_list_media).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes further: it explains that references are NOT checked or updated and that referencing cards will break, and it discloses the exact success/error response shapes and that errors are returned rather than raised. This is meaningful behavioral context beyond the annotations.

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

Conciseness4/5

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

Front-loaded with the core action, then mechanics, usage condition, and return/error contract in a clean sequence. The explicit return-value description is somewhat redundant given an output schema exists, but nothing is padded or out of order.

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 delete, the description covers purpose, the underlying call, the reference-breakage caveat, when to use it, and both success and failure responses. Nothing an agent needs to invoke it safely is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single path parameter is already documented as relative to www/card_builder/. The description reinforces the same path semantics and adds the consequence of deleting a referenced file, but adds no new syntax or format detail beyond the schema. 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 (permanently delete) and resource (one file from the Card Builder media directory), with a precise scope that separates it from card_builder_delete_card and card_builder_list_media. An agent can identify exactly what this tool operates on 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?

The 'Use when: removing an uploaded image/SVG that no card uses anymore' line gives clear context and an implicit precondition (nothing may reference the file). It does not name alternative sibling tools, so it falls short of full when/when-not/alternatives coverage.

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

card_builder_delete_style_presetDelete Card Builder style presetA
DestructiveIdempotent

Permanently delete one Card Builder style preset by id.

Calls card_builder/style_presets/delete. Any card whose style data references this preset via extends_preset_id keeps that dangling id — this tool does not check for or update such references.

Use when: removing a preset that is no longer extended by any card or other preset. Returns: {"status": "deleted", "style_preset_id": ..., "result": ...} on success. Errors: on failure, returns {"status": "error", "style_preset_id": ..., "error": <exception text>} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
style_preset_idYesId of the preset to delete, from card_builder_list_style_presets.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantive context they cannot carry: the underlying endpoint, the fact that dangling extends_preset_id references are left intact and unchecked, the exact success payload, and the error payload shape instead of raising.

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

Conciseness4/5

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

Front-loaded with the destructive action statement, then the side-effect warning, usage condition, and return/error contracts in a compact labeled block. Slightly long for one parameter, but 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 single-parameter destructive tool, the definition covers action, scope, side effects, invocation condition, and both success and failure response shapes. Even accounting for the existing output schema and annotations, nothing an agent needs to call this safely 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 is already documented with a pointer to card_builder_list_style_presets. The description only restates that deletion is keyed by id, adding no new semantics such as format or source constraints.

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

Purpose5/5

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

States a specific verb and resource ('Permanently delete one Card Builder style preset') plus the addressing key ('by id'). The word 'permanently' and the resource naming cleanly separate it from card_builder_update_style_preset and card_builder_list_style_presets.

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

Usage Guidelines4/5

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

The 'Use when: removing a preset that is no longer extended by any card or other preset' line gives a concrete selection condition, and the dangling-reference warning reinforces it. It does not name a sibling alternative (e.g. update instead of delete), so it falls short of explicit when-not/alternative routing.

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

card_builder_design_for_intentRecommend a design pattern for intentA
Read-onlyIdempotent

Score curated design patterns against a free-text intent and recommend the top match.

Scores each entry in DESIGN_PATTERNS by domain match (weight 5) and intent-keyword overlap (weight 1.5 per hit against intent.lower()), then returns the top scorer plus up to three runners-up; makes no call to Home Assistant.

Use when: turning a user's free-text card request into a concrete pattern/template recommendation. Not for: the full pattern body — call card_builder_get_design_pattern(name) on the recommendation; the underlying design rules — call card_builder_design_principles. Returns: {intent, domain, entity_id, recommendation, score, label, description, ux_notes, recommended_template, anti_patterns, next_steps, alternatives}, or {..., "recommendation": None, "note": ...} when nothing scores above zero.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoHA entity domain to weight the match toward, e.g. 'sensor'. Omit to infer from entity_id or match on keywords alone.
intentYesFree-text description of what the card should do, e.g. 'show battery level'.
entity_idNoFull entity id, e.g. 'sensor.battery'; used to infer domain when domain is omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, closed-world behavior, but the description goes further by disclosing the scoring algorithm (domain weight 5, keyword overlap 1.5), the fact that no Home Assistant call is made, and the zero-score edge case returning recommendation: None. The remaining gap is the ranking of runners-up (says 'up to three' but not ordering or tie-breaking).

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?

Strongly front-loaded: purpose first, then mechanics, then use/not-for routing, then return shape. The scoring-weight sentence and the enumerated return keys are dense but each earns its place; the lengthy return list is the only mild redundancy given an output schema exists.

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 recommendation tool with 3 params, annotations, and a full output schema, the description covers trigger, alternatives, follow-up actions, and failure mode. It is slightly over-complete in restating the return object, and it does not explain how alternatives are ordered or truncated, but nothing essential for invocation is missing.

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

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, but the description adds real meaning beyond the schema by explaining how each parameter influences scoring (domain match weighted at 5, intent keyword hits at 1.5 against intent.lower()) and that entity_id is used to infer domain. That is more than the schema's static field descriptions.

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

Purpose5/5

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

The description states a specific verb (score/recommend) and resource (curated design patterns) and immediately differentiates itself from siblings by naming card_builder_get_design_pattern and card_builder_design_principles. An agent can route correctly 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?

Explicit 'Use when' clause defines the trigger (free-text card request -> pattern recommendation), and 'Not for' names both alternatives plus the exact follow-up call to make with the returned recommendation. When-to-use and when-not-to-use are both covered.

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

card_builder_design_principlesGet Card Builder design principlesA
Read-onlyIdempotent

Get the embedded UX design playbook for Card Builder cards.

Returns the static _DESIGN_PRINCIPLES_MD constant; makes no call to Home Assistant.

Use when: deciding hierarchy, state feedback, spacing, typography, or layout choices for a card, before or after using card_builder_recipe_guide for the mechanics. Not for: HOW to build the block tree itself — use card_builder_recipe_guide. Returns: markdown text covering hierarchy, state feedback via binding, spacing rhythm, typography scale, semantic colors, layout choice (grid vs flow vs absolute), state badges, background images, empty states, and anti-patterns that produce flat-feeling cards.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: it explicitly states it returns a static constant and makes no HA call. It stops short of describing output size or whether content is stable across versions.

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

Conciseness4/5

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

Front-loaded with purpose, then when-to-use, then not-for, then a returns list. The returns enumeration is fairly long but each item (hierarchy, state feedback, spacing, typography, colors, layout, badges, backgrounds, empty states, anti-patterns) is substantive. Slight verbosity in the final sentence.

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

Completeness5/5

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

For a zero-param read-only knowledge tool with an output schema already present, the description covers purpose, routing to the sibling, and a topic list of what the markdown contains. Nothing an agent needs to decide to call it 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?

Zero parameters, so per the rubric the baseline is 4. No param semantics are needed and the description correctly does not invent any.

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

Purpose5/5

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

States a specific verb+resource ('Get the embedded UX design playbook for Card Builder cards') and immediately distinguishes itself from the sibling by clarifying it returns a static constant and makes no call to Home Assistant. An agent can tell exactly what this returns versus card_builder_recipe_guide.

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

Usage Guidelines5/5

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

Provides explicit 'Use when' conditions (hierarchy, state feedback, spacing, typography, layout choices) and a clear 'Not for' exclusion routing the block-tree mechanics to card_builder_recipe_guide. The when/when-not/alternative triad is fully present.

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

card_builder_get_block_schemaGet Card Builder block schemaA
Read-onlyIdempotent

Get the full embedded schema for one Card Builder block type.

Looks up block_type in the module-level BLOCK_TYPES constant and adds its style targets from STYLE_TARGETS; makes no call to Home Assistant.

Use when: checking a block's exact prop names, types, defaults, enum values, and supported entity domains before writing a recipe. Returns: {type, category, label, accepts_children, requires_entity, props, notes, supported_domains, style_targets, ...} — the same entry as in BLOCK_TYPES plus style_targets. Errors: {"error": "unknown_block_type", "block_type": ..., "known": [...]} when block_type isn't in the embedded schema.

ParametersJSON Schema
NameRequiredDescriptionDefault
block_typeYesBlock type id, e.g. 'block-slider', from card_builder_list_block_types.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover safety (readOnly, idempotent, non-destructive, not open-world), and the description adds genuine context beyond them: it explains the internal lookup source (BLOCK_TYPES + STYLE_TARGETS), that no HA call is made, the return shape, and the exact error payload for unknown block types.

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

Conciseness5/5

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

Front-loads purpose in the first sentence, then a mechanics paragraph, a 'Use when:' line, a Returns line, and an Errors line. No filler sentences; each block 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?

Though an output schema exists, the description helpfully names the top-level keys an agent will inspect, and it documents the failure mode with a concrete error object. For a read-only lookup tool with one param, nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter's description already names the format ('block-slider') and points to card_builder_list_block_types. The description adds no syntax or format detail beyond the schema, 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 (Get) and resource (full embedded schema for one Card Builder block type) and contrasts with siblings by noting it makes no Home Assistant call, unlike runtime data tools. An agent can distinguish this from card_builder_list_block_types (which lists ids) and card_builder_get_card.

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

Usage Guidelines5/5

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

Explicit 'Use when: checking a block's exact prop names, types, defaults, enum values, and supported entity domains before writing a recipe.' This gives a concrete trigger and ties it to a workflow (recipe authoring) with the sibling procedure implied.

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

card_builder_get_cardGet Card Builder card by IDA
Read-onlyIdempotent

Get one Card Builder card by id, including its full config.

Fetches the whole card collection via card_builder/cards/list and matches on id or the legacy card_id field client-side — there is no dedicated get-by-id WebSocket command.

Use when: inspecting or copying one card's config before calling card_builder_update_card or card_builder_renderer_card_config. Returns: the matching card dict (same shape as one entry from card_builder_list_cards). Errors: {"error": "not_found", "card_id": ...} when no card matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesCard id or card_id from card_builder_list_cards, e.g. a UUID string.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds genuinely non-obvious behavior: there is no dedicated get-by-id WebSocket command, so it fetches the whole collection via card_builder/cards/list and matches client-side. It also documents the exact not_found error payload, which neither annotations nor the schema convey.

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

Conciseness4/5

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

Well front-loaded and sectioned (behavior, Use when, Returns, Errors), so an agent can scan it quickly. Slightly verbose in re-explaining the client-side fallback matching, but every line still carries signal.

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

Completeness5/5

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

For a single-parameter read tool with an output schema, the description covers what is returned ('same shape as one entry from card_builder_list_cards') and the error case. Nothing needed to invoke or interpret the 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 description coverage is 100% and the single card_id parameter is fully documented there, so the baseline is 3. The description only lightly reinforces this by noting that matching accepts the legacy card_id field, which is useful but marginal 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 ('Get one Card Builder card by id, including its full config'), which cleanly separates it from siblings like card_builder_list_cards or card_builder_update_card. An agent can identify the operation 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?

Provides an explicit 'Use when' clause tying the tool to a downstream action (inspecting/copying config before update_card or renderer_card_config). It lacks an explicit when-not or a direct contrast against card_builder_list_cards, which is the nearest alternative.

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

card_builder_get_card_templatePreview a card template configA
Read-onlyIdempotent

Resolve one built-in template into a full DocumentData config, without saving anything.

Calls the template's recipe function and, if it returned a recipe shorthand rather than a full DocumentData, runs it through card_builder_build_from_recipe. Makes no call to Home Assistant.

Use when: inspecting or hand-editing a template's config before calling card_builder_create_card yourself. Not for: saving the card directly — use card_builder_make_template_card to skip this step. Returns: the full DocumentData config dict for the template. Errors: {"error": "unknown_template", "name": ..., "known": [...]} when name isn't a known template.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTemplate name, e.g. 'sensor_hero', from card_builder_list_card_templates.
slotNoOverride the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds real behavioral context beyond them: it explains the internal flow (calls the template's recipe function, may route through card_builder_build_from_recipe), confirms 'Makes no call to Home Assistant', and documents the error shape for unknown templates.

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

Conciseness4/5

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

Well front-loaded with the core action in the first line, then cleanly organized under Use when / Not for / Returns / Errors labels. Slightly verbose with some line-wrapping and an implementation detail (the internal recipe function call) that is informative but not essential.

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 preview tool with a full annotation set and an output schema, the description covers everything needed: what it does, when to use it, the alternative for the save path, and the failure mode. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both 'name' and 'slot' with examples and defaults. The description only references 'name' obliquely in the error section and adds no syntax or format 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 ('Resolve one built-in template into a full DocumentData config, without saving anything') and immediately clarifies the non-persistent nature of the operation. An agent can distinguish it from card_builder_create_card and card_builder_make_template_card 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?

Explicit 'Use when: inspecting or hand-editing a template's config before calling card_builder_create_card yourself' and 'Not for: saving the card directly — use card_builder_make_template_card to skip this step.' Names both the intended context and the sibling alternative with the condition that selects it.

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

card_builder_get_design_patternGet one design patternA
Read-onlyIdempotent

Get one curated design pattern by name, in full.

Looks up name in the module-level DESIGN_PATTERNS constant; makes no call to Home Assistant.

Use when: reading the full rationale/anti-patterns for one pattern already picked (e.g. via card_builder_design_for_intent). Returns: same fields as one entry from card_builder_list_design_patterns. Errors: {"error": "unknown_pattern", "name": ..., "known": [...]} when name isn't a known pattern.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPattern name, e.g. 'sensor_hero', from card_builder_list_design_patterns.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, and the description still adds genuine value: it discloses that this is a local constant lookup with no Home Assistant call, and it specifies the exact error payload shape for the unknown-pattern case.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then clearly segmented into lookup behavior, usage, return, and error sections. Slightly sectioned/long for a one-parameter read tool, but each block contributes information and none is redundant.

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

Completeness5/5

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

For a single-param local read with an output schema present, the definition covers purpose, trigger condition, return parity with the list sibling, and the exact failure mode. An agent has everything needed to call and recover from it.

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

Parameters3/5

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

Schema description coverage is 100% for the single required `name` parameter, so the schema already carries the example ('sensor_hero') and source (card_builder_list_design_patterns). The description's only extra is the error `known` list, which is behavioral rather than semantic, 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 ('Get one curated design pattern by name, in full') and explicitly positions it against the list and intent-matching siblings, so an agent can pick it without inspecting schemas.

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

Usage Guidelines5/5

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

The 'Use when' clause names the exact scenario (reading full rationale/anti-patterns for a pattern already chosen) and even routes the agent to the discovery sibling card_builder_design_for_intent. Nothing about when-not is left ambiguous because the alternative (list/design_for_intent) is implied as the selection phase.

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

card_builder_get_style_snippetGet one style snippetA
Read-onlyIdempotent

Fetch one built-in style snippet wrapped in the full target/container envelope.

Looks up name in STYLE_SNIPPETS and wraps it as {target: {containers: {container: <snippet>}}}; makes no call to Home Assistant.

Use when: assigning exactly one snippet to a block's styles without composing several via card_builder_build_styles. Returns: {<target>: {containers: {<container>: <snippet>}}} — ready to assign to a block's styles directly. Errors: {"error": "unknown_snippet", "name": ..., "known": [...]} when name isn't a known snippet.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSnippet name, e.g. 'card_padded', from card_builder_list_style_snippets.
targetNoStyle target key to wrap the snippet under, e.g. 'block' or 'state'. Defaults to 'block'.block
containerNoResponsive container to wrap the snippet under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'.desktop

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint false, and destructiveHint false, so the safety profile is covered. The description adds rich context beyond annotations: it is a pure lookup that makes no Home Assistant call, never mutates state, and documents the exact error shape on failure. It also describes the return envelope precisely.

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

Conciseness5/5

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

Front-loaded with the core action and transformation in the first sentence, then structured sections for use when, returns, and errors. Every sentence earns its place with no redundancy.

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

Completeness5/5

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

Given an output schema exists, the description needn't explain return values but still provides the exact envelope shape for direct assignment. It documents error behavior, confirms no HA call, and covers the single required parameter. Complete for a simple lookup tool.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all three parameters including defaults and examples. The description reinforces the name lookup (STYLE_SNIPPETS) and the wrapping behavior of target/container beyond what the schema provides. However, it does not add syntax or format details for target/container values that the schema lacks.

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

Purpose5/5

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

States a specific verb (Fetch) and resource (one built-in style snippet), plus the exact transformation applied (wrapping in target/container envelope). It names the sibling it differs from (card_builder_build_styles) and clarifies it makes no Home Assistant call, distinguishing it from other card_builder siblings.

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

Usage Guidelines5/5

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

Explicit when-to-use: assigning exactly one snippet to a block's styles without composing several via card_builder_build_styles. The alternative is named and the condition that selects it is made explicit.

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

card_builder_list_block_typesList Card Builder block typesA
Read-onlyIdempotent

List every block type from the embedded Card Builder schema (BLOCK_TYPES).

Reads the module-level BLOCK_TYPES constant synced from upstream Card Builder (see card_builder_check_schema_sync); makes no call to Home Assistant.

Use when: discovering which block types exist before writing a recipe for card_builder_build_from_recipe. Not for: full prop details of one type — use card_builder_get_block_schema. Returns: list of {type, category, label, accepts_children, requires_entity, prop_count}, one entry per block type.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoBlock category to filter to: basic, layout, entities, controls, advanced, or weather. Omit for every category.
include_internalNoIf true, also list internal-only block types (e.g. block-drop-zone) that a recipe must not use directly.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/non-open-world, so safety is covered. The description adds genuine context beyond that: it reads a module-level constant synced from upstream, makes no call to Home Assistant, and points to card_builder_check_schema_sync for freshness. This is useful behavioral disclosure, though it omits any note on staleness handling.

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

Conciseness4/5

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

Front-loaded purpose with clean Use-when / Not-for / Returns labeling. Slightly longer than needed: the inline return-shape restatement overlaps with the existing output schema, and the embedded-constant paragraph is more detail than selection requires.

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 listing tool with an output schema, full annotation coverage, and a routing pointer to the sibling for depth, the description is complete. An agent has everything needed to choose and invoke it, including the data source and its non-HA nature.

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 category filter and include_internal flag are already fully documented in the schema. The description adds no parameter-level detail (e.g., what counts as 'internal'), so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('List every block type from the embedded Card Builder schema') and names the sibling it is not (card_builder_get_block_schema for full prop details). An agent can distinguish it from the other card_builder schema tools without opening a schema.

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

Usage Guidelines5/5

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

Explicit when ('before writing a recipe for card_builder_build_from_recipe'), explicit when-not ('full prop details of one type'), and names the alternative tool to use instead. Nothing is left to inference.

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

card_builder_list_button_toggle_featuresList button-toggle feature IDsA
Read-onlyIdempotent

List the feature IDs accepted by block-button-toggle / block-select-menu.

Reads the module-level FEATURE_DEFINITIONS constant; makes no call to Home Assistant. Feature IDs are namespaced by domain — e.g. climate_hvac_mode for an AC, cover_state for a blind, light_power for a bulb.

Use when: picking an explicit feature value for a block-button-toggle/block-select-menu prop instead of the default "auto", which lets Card Builder pick the first available feature for the entity at runtime. Returns: list of {domain, id, label} dicts.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoHA entity domain to filter to, e.g. 'climate' or 'cover'. Omit to list every domain's features.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/openWorldHint=false, but the description adds real value: it states the data comes from a module-level FEATURE_DEFINITIONS constant with no Home Assistant call, and explains the domain-namespaced ID scheme with concrete examples.

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

Conciseness4/5

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

Front-loaded with the purpose, then Use-when and Returns blocks; every sentence carries information. The Returns line is mildly redundant given an output schema exists, but it is brief.

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

Completeness5/5

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

For a single-optional-param, read-only, idempotent lookup with an output schema and full annotation coverage, the description supplies everything needed: purpose, data source, ID naming convention, and when to prefer it over the default.

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 `domain` filter is already documented, but the description adds the semantics of why domain matters (IDs are namespaced by domain, e.g. climate_hvac_mode vs cover_state), which is meaningful context beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('List the `feature` IDs accepted by block-button-toggle / block-select-menu') and scopes it to those two block types, so it is clearly distinguishable from the many other card_builder_* listing tools.

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

Usage Guidelines4/5

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

The 'Use when' clause gives an explicit trigger — picking an explicit `feature` value instead of the default 'auto' — and explains what 'auto' does at runtime. It lacks an explicit 'do not use' case or a named alternative tool, so it falls just short of a 5.

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

card_builder_list_cardsList Card Builder cardsA
Read-onlyIdempotent

List every Card Builder card stored on this Home Assistant instance.

Calls the card_builder/cards/list WebSocket command and returns the raw collection: each entry carries id, name, description, config (the DocumentData block tree), version, tags and categories.

Use when: discovering existing cards before reading one in full with card_builder_get_card or editing one with card_builder_update_card. Returns: list of card dicts, in storage order, unfiltered.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered. The description adds genuine context beyond that: it identifies the underlying WebSocket command and notes the result is unfiltered and in storage order, which tells the agent what to expect from the collection.

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

Conciseness4/5

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

Front-loaded with the action, then labeled 'Use when:' and 'Returns:' sections, which is easy to scan. The enumeration of every returned field is slightly redundant given a full output schema exists, making it a touch longer than strictly necessary.

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

Completeness5/5

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

For a zero-parameter, read-only list tool with an output schema already present, the description supplies everything the agent needs: scope, the routing alternatives, and the nature of the returned collection. Nothing required to invoke it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, which is the baseline case for a 4. The description correctly implies no filtering or pagination arguments are available ('unfiltered'), aligning with the empty 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 ('List every Card Builder card') scoped to 'this Home Assistant instance', and names the underlying WebSocket command. The sibling tools card_builder_get_card and card_builder_update_card are referenced so an agent can distinguish listing from reading or editing.

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

Usage Guidelines4/5

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

The 'Use when:' clause gives explicit context (discovering existing cards) and names the two alternative tools for follow-up actions. It lacks an explicit 'when not to use' or a note about why no filtering alternative exists, so it is clear but not fully exhaustive.

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

card_builder_list_card_templatesList built-in card templatesA
Read-onlyIdempotent

List built-in Card Builder recipe templates (CARD_RECIPES).

Reads the module-level CARD_RECIPES constant; makes no call to Home Assistant.

Use when: browsing available templates before previewing one with card_builder_get_card_template or instantiating it with card_builder_make_template_card. Returns: list of {name, label, description, domains} dicts.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoHA entity domain to filter to, e.g. 'climate' or 'light'. Omit to list every template.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world. The description adds genuine context beyond them: it reads a module-level constant and makes no Home Assistant call, signalling a fast, side-effect-free local read. It stops short of richer behavioral detail (e.g. ordering, caching), hence a 4 rather than 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 front-loaded sentences with clear Purpose / Use when / Returns structure and zero filler. The source constant is called out immediately, before the routing and return details.

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

Completeness5/5

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

For a simple filtered-list tool, the description covers source, usage routing, and returns. Annotations carry the safety profile and an output schema exists, so the return-shape mention is bonus rather than a 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 the sole `domain` filter is already fully documented by the schema. The description adds no additional syntax or semantics for it, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (list built-in Card Builder recipe templates) and names the underlying source (`CARD_RECIPES`). It also distinguishes itself from the closely-named siblings by clarifying it makes no Home Assistant call, unlike most read tools in this namespace.

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 workflow: browse here, then preview with `card_builder_get_card_template` or instantiate with `card_builder_make_template_card`. This routes the agent to the correct sibling at each subsequent step, 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.

card_builder_list_css_custom_propertiesList Card Builder CSS custom propertiesA
Read-onlyIdempotent

List every registered CSS custom property (@property registration).

Calls card_builder/css_custom_properties/list and returns the raw collection: each entry has id, name, syntax (e.g. <color>), initial_value and inherits.

Use when: checking which custom properties already exist before registering a new one with card_builder_create_css_custom_property. Returns: list of CSS-custom-property dicts, unfiltered.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds the 'unfiltered' nature of the result and the underlying backend call path, which is mildly useful context, but the field-level return detail largely duplicates the existing output schema.

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

Conciseness4/5

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

Front-loads the action and scope, then the call path, then the usage condition, then the return contract — a sensible ordering. The field enumeration in the middle is somewhat verbose given an output schema exists, but nothing is padding.

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

Completeness4/5

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

With no parameters and a dedicated output schema, an agent has everything needed to invoke this correctly, and the description supplies the routing context. The only gap is mild redundancy in restating return fields the output schema already defines.

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; baseline 4 applies. The absence of parameters is implicitly conveyed by the description's list-only framing.

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

Purpose5/5

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

States a specific verb ('List') and resource ('registered CSS custom properties') and names the sibling it complements ('card_builder_create_css_custom_property'). An agent can distinguish it from card_builder_list_cards and card_builder_list_style_presets 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?

Contains an explicit 'Use when:' clause tying the tool to the precondition of registering a new property, and names the alternative sibling tool to call next. This is exactly the when/when-not/alternative structure the dimension rewards.

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

card_builder_list_design_patternsList curated design patternsA
Read-onlyIdempotent

List curated UX design patterns, each pairing a recipe recommendation with the reasoning behind it.

Reads the module-level DESIGN_PATTERNS constant; makes no call to Home Assistant.

Use when: browsing available design patterns before picking one by hand, rather than letting card_builder_design_for_intent score them. Returns: list of pattern dicts, each with name, intent_keywords, domains, label, description, ux_notes, recommended_template, anti_patterns.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoHA entity domain to filter to, e.g. 'climate' or 'sensor'. Omit to list every pattern.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=false, idempotentHint=true, and destructiveHint=false. The description adds 'Reads the module-level DESIGN_PATTERNS constant; makes no call to Home Assistant,' which is useful extra context about the source and lack of external calls, though it doesn't discuss pagination or rate limits (not applicable for a static list).

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?

Information is front-loaded: what it lists, then where data comes from, then when to use, then return structure. Slightly verbose but every sentence adds value; no unnecessary repetition.

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

Completeness4/5

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

Given the tool is a simple read-only list with one optional parameter and an output schema, the description covers purpose, source, usage distinction, and return shape. It doesn't need to explain the output schema further, but it could omit the return field details since an output schema exists.

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

Parameters3/5

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

Schema description coverage is 100%, so the single domain parameter is fully documented in the schema. The description doesn't add any parameter-specific information beyond what the schema provides, which is acceptable given high coverage.

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

Purpose5/5

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

States a specific verb (List) and resource (curated UX design patterns), and clarifies the unique output shape: each pattern pairs a recipe recommendation with reasoning. Unlike siblings such as card_builder_list_cards or card_builder_list_block_types, the description makes clear this returns design patterns with UX notes and template recommendations.

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 'Use when: browsing available design patterns before picking one by hand, rather than letting card_builder_design_for_intent score them.' This directly contrasts with the sibling design_for_intent tool and gives the condition for choosing this list over automated scoring.

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

card_builder_list_mediaList Card Builder media filesA
Read-onlyIdempotent

List files and folders in the Card Builder media directory.

Calls card_builder/media/list, scoped to www/card_builder/<path>.

Use when: checking what's already uploaded before calling card_builder_upload_media or card_builder_delete_media. Returns: dict with the media-browser entries HA's WS handler returns for that path (files and sub-folders).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoSub-folder relative to www/card_builder/ to list. Empty string lists the root.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds the underlying WS handler name and the path scoping ('www/card_builder/<path>'), which is genuine extra context, though the return-shape sentence partly overlaps the existing output schema.

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

Conciseness5/5

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

Four short lines, each with a distinct job (purpose, mechanism, usage, return), and the primary purpose is front-loaded. No filler.

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

Completeness4/5

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

With rich annotations, an output schema, and a single well-documented parameter, the description is essentially complete for a read-only list operation. Only marginal value would be added by describing pagination or entry fields, which the output schema already handles.

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

Parameters3/5

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

Only one optional parameter with 100% schema coverage, which already documents that empty string lists the root. The description reinforces the path prefix but adds no format or behavior the schema lacks; 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 (List) and resource (files and folders in the Card Builder media directory) plus the exact backing call card_builder/media/list and its path scope. An agent can distinguish this from card_builder_upload_media and card_builder_delete_media without opening a schema.

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

Usage Guidelines5/5

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

Explicit 'Use when' clause names the concrete condition (checking what's already uploaded) and the two sibling tools it precedes. This is a routing instruction, not an inference.

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

card_builder_list_style_categoriesList Card Builder style categoriesA
Read-onlyIdempotent

List CSS style categories with their property names and unit conventions.

Reads the module-level STYLE_CATEGORIES constant; makes no call to Home Assistant. Property names are camelCase (e.g. flexDirection, backgroundColor) — anything else is silently discarded by Card Builder's CSS resolver.

Use when: looking up the exact property names/units for a style category before hand-writing a styles/dz_styles blob. Not for: ready-to-use presets — use card_builder_list_style_snippets. Returns: list of {category, properties, length_units, legacy_aliases, notes} dicts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, closed-world, non-destructive behavior, so the bar is lower. The description adds real value beyond them: it states it reads a module-level constant with no Home Assistant call, and warns that non-camelCase property names are silently discarded by the CSS resolver — a non-obvious failure mode.

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

Conciseness4/5

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

Front-loaded with the purpose, then clearly delineated Use/Not-for/Returns sections; every part earns its place except the Returns line, which overlaps with the existing output schema and is mildly redundant.

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

Completeness5/5

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

For a zero-parameter, read-only list tool with an output schema and full annotation coverage, the description supplies everything an agent needs: purpose, routing to the right sibling, and the camelCase pitfall. Nothing material is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify beyond what the schema trivially conveys.

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

Purpose5/5

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

States a specific verb (List) and resource (CSS style categories) with scope detail (property names and unit conventions). It is clearly distinguishable from the nearest sibling, card_builder_list_style_snippets, via the explicit 'Not for' line.

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

Usage Guidelines5/5

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

Gives explicit 'Use when' (looking up exact property names/units before hand-writing a styles/dz_styles blob) and 'Not for' (ready-to-use presets, routed to card_builder_list_style_snippets). The selection condition between the two tools is unambiguous.

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

card_builder_list_style_presetsList Card Builder style presetsA
Read-onlyIdempotent

List every reusable Card Builder style preset.

Calls card_builder/style_presets/list and returns the raw collection: each entry has id, name, description, data (the CSS-style configuration blob) and, if present, extends_preset_id.

Use when: picking an existing preset to extend, or checking presets before creating a new one with card_builder_create_style_preset. Returns: list of style-preset dicts, unfiltered.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds that the result is a 'raw collection' and 'unfiltered', which is useful behavioral context, but the per-entry field listing largely overlaps with the existing output schema.

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

Conciseness4/5

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

The purpose is front-loaded in the first sentence, and the rest is informative. However, the 'Returns:' sentence partially restates the earlier field enumeration, and given an output schema already exists, that content is slightly redundant.

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

Completeness5/5

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

For a zero-parameter, read-only list tool with both annotations and an output schema, the description supplies everything an agent needs: what it lists, when to use it, and the sibling to use for creation. No meaningful gap remains.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to convey; baseline 4 applies. The empty schema with additionalProperties=false means no input ambiguity exists to clarify.

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

Purpose5/5

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

The description gives a specific verb+resource ('List every reusable Card Builder style preset') and enumerates the entry fields returned, so an agent can distinguish it from sibling list tools immediately. It also names the underlying endpoint, pinning down exactly what is being fetched.

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

Usage Guidelines5/5

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

It provides an explicit 'Use when' clause with two concrete scenarios (picking a preset to extend, checking presets before creating one) and names the alternative action 'card_builder_create_style_preset'. Nothing is left to inference about when this tool is the right choice.

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

card_builder_list_style_snippetsList built-in style snippetsA
Read-onlyIdempotent

List built-in Card Builder style snippets by name and style category.

Reads the module-level STYLE_SNIPPETS constant; makes no call to Home Assistant.

Use when: browsing ready-made style presets (padding, flex layout, typography scale) before composing them with card_builder_build_styles. Not for: the full property list per category — use card_builder_list_style_categories; the full body of one snippet — use card_builder_get_style_snippet. Returns: list of {name, categories} dicts, where categories are the style-category keys that snippet sets.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds genuinely new context: it reads the module-level `STYLE_SNIPPETS` constant and makes no Home Assistant call, which tells the agent this is an instant, offline lookup. It stops short of richer traits (cost, ordering guarantees) but goes beyond what structured fields provide.

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

Conciseness4/5

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

Front-loads the purpose then a short behavioral note and clearly labeled Use/Not-for/Returns sections. Every line is load-bearing, though the 'Returns:' line slightly duplicates the existing output schema and is marginally redundant.

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

Completeness5/5

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

With a 0-parameter schema, full annotation coverage, and an output schema present, the description supplies exactly the missing routing and no-I/O context. 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.

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 with no compensating explanation required. The description correctly adds no invented parameter semantics.

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

Purpose5/5

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

States a specific verb+resource ('List built-in Card Builder style snippets') plus the shape of the returned data (name and style category). It explicitly distinguishes itself from `card_builder_list_style_categories` and `card_builder_get_style_snippet`, so an agent can route correctly 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?

Uses explicit 'Use when:' and 'Not for:' blocks, naming the alternative tools for each excluded case and the downstream tool (`card_builder_build_styles`) it composes with. Nothing about selection is left to inference.

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

card_builder_list_style_targetsList style targets for a block typeA
Read-onlyIdempotent

List the style targets (sub-components) one block type supports.

Looks up block_type in STYLE_TARGETS (defaulting to the single "block" target); makes no call to Home Assistant. Example: block-entity-field-state has state and unit targets so you can colour the number and the unit differently.

Use when: styling a sub-component of a block (e.g. a slider's thumb) rather than the whole block. Returns: {block_type, targets} where targets is the list of valid keys for that block's styles dict. Errors: {"error": "unknown_block_type", "block_type": ...} when block_type isn't in the embedded schema.

ParametersJSON Schema
NameRequiredDescriptionDefault
block_typeYesBlock type id, e.g. 'block-entity-field-state', from card_builder_list_block_types.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint, openWorldHint), so the bar is lower. The description still adds real value beyond them: it declares 'makes no call to Home Assistant,' that the lookup is against an embedded schema, the exact return shape, and the error contract. Only minor gaps (e.g. whether unknown types fall back to 'block') remain.

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

Conciseness5/5

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

Front-loads the core purpose in the first sentence, then uses compact labeled clauses (Use when / Returns / Errors) to add only actionable detail. No filler sentences and nothing wasted.

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

Completeness5/5

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

Covers purpose, usage condition, a concrete example, the return object, and the error shape. An output schema exists so return values need not be repeated, and the description is still complete for a one-parameter read tool.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is fully documented in the schema, so the baseline is 3. The description adds only a redundant example value ('block-entity-field-state') and clarifies that the value originates from card_builder_list_block_types, which the schema already states.

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

Purpose5/5

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

States a specific verb and resource ('List the style targets (sub-components) one block type supports') and immediately clarifies the internal mechanism via the STYLE_TARGETS lookup. An agent can distinguish this from sibling card_builder_list_block_types and card_builder_build_styles 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 states 'Use when: styling a sub-component of a block (e.g. a slider's thumb) rather than the whole block,' which gives clear context and a contrast with the whole-block case. It does not name a specific sibling tool as the alternative, so it falls just short of the 5-tier 'when/when-not/alternatives' bar.

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

card_builder_make_template_cardCreate card from templateA

Resolve a built-in template and save it as a new Card Builder card in one call.

Resolves template the same way as card_builder_get_card_template, then passes the config straight to card_builder_create_card — which assigns a new id server-side, so repeating this call creates a second, distinct card.

Use when: turning a built-in template into a saved card without the separate preview/create steps. Not for: previewing the config first without saving — use card_builder_get_card_template; a fully custom recipe — use card_builder_build_from_recipe and card_builder_create_card directly. Returns: the created card dict, including its new id. Use that id with card_builder_renderer_card_config(card_id, slot_entities= {<slot>: ...}) to place the card on a dashboard. Errors: {"error": "unknown_template", "template": ..., "known": [...]} when template isn't a known template.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new card, e.g. 'Battery Salon'.
slotNoOverride the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default.
tagsNoReplacement tag list. Omit to default to ['nexus-template', template].
templateYesTemplate name, e.g. 'sensor_hero', from card_builder_list_card_templates.
categoriesNoReplacement category list. Omit to default to the template's first domain, or 'tile' if it has none.
descriptionNoCard description. Empty string uses the template's own description instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), yet the description still adds real value: it states the new id is assigned server-side and that repeating the call creates a second distinct card, which concretely operationalizes the non-idempotent hint. It also documents the error shape ({"error": "unknown_template", ...}), 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?

Front-loaded with the core action, then cleanly sectioned into Use when / Not for / Returns / Errors. Every sentence carries distinct information; there is no filler or restatement of the schema.

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

Completeness5/5

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

For a mutating, non-idempotent tool with a rich 6-parameter schema and an output schema, the definition covers the action, the side effect, the routing alternatives, the error contract, and the downstream chaining step. 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.

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, but the description adds meaning beyond the schema by stating that `template` resolves identically to card_builder_get_card_template, and by tying the returned `id` to card_builder_renderer_card_config usage. It does not elaborate on slot/tags/categories defaults, which the schema already handles.

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

Purpose5/5

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

The description states a specific verb+resource ('Resolve a built-in template and save it as a new Card Builder card in one call') and explicitly frames itself as a composition of two siblings. An agent can distinguish it from card_builder_get_card_template, card_builder_create_card, and card_builder_build_from_recipe 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?

Explicit 'Use when' and 'Not for' sections name the alternatives directly: preview-only goes to card_builder_get_card_template, custom recipes go to card_builder_build_from_recipe + card_builder_create_card. The selection condition is fully spelled out, 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.

card_builder_recipe_guideGet Card Builder recipe guideA
Read-onlyIdempotent

Get the embedded how-to for building Card Builder cards programmatically.

Returns the static _RECIPE_GUIDE_MD constant; makes no call to Home Assistant.

Use when: starting a card build and needing the DocumentData shape, prop-wrapping rules, slots, or recipe shorthand before calling card_builder_build_from_recipe. Not for: UX/visual guidance — use card_builder_design_principles. Returns: markdown text covering DocumentData layout, the block tree, entity inheritance, slots, drop-zones, dashboard embedding, and the recipe shorthand consumed by card_builder_build_from_recipe.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real value by disclosing that it returns a static constant and makes no call to Home Assistant, which is behavior the annotations cannot convey.

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

Conciseness4/5

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

Front-loaded and structured with clear Use when / Not for / Returns labels, which is easy to scan. There is mild redundancy between the opening sentence, the 'Returns' list, and the 'Use when' content, but nothing that obscures the point.

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

Completeness5/5

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

For a parameterless guide-fetch tool with an output schema present, the description is fully sufficient: it explains what is returned, when to reach for it, and what to use instead. Nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so there are no parameter semantics to explain and the baseline of 4 applies. The description correctly adds nothing spurious about inputs.

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

Purpose5/5

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

States a specific verb ('Get') and resource (the embedded recipe guide) and immediately scopes it as building 'Card Builder cards programmatically'. It explicitly distinguishes itself from the sibling `card_builder_design_principles`, so 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?

Provides an explicit 'Use when' clause (starting a card build, needing DocumentData shape, prop-wrapping, slots, recipe shorthand) and an explicit 'Not for' clause routing UX work to `card_builder_design_principles`. It even names the downstream tool, `card_builder_build_from_recipe`, that consumes its output.

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

card_builder_renderer_card_configBuild renderer card configA
Read-onlyIdempotent

Build the Lovelace card config dict that renders a Card Builder card.

Pure computation — assembles {"type": "custom:card-builder-renderer-card", "card_id": ...} plus the optional slot_entities/slot_actions keys; makes no call to Home Assistant.

Use when: embedding an existing Card Builder card on a dashboard. Not for: adding the resulting config to a dashboard — pass it as card_config to dashboards_add_card_to_section (sections views) or dashboards_add_card_to_view (masonry/panel views). Returns: {"type": "custom:card-builder-renderer-card", "card_id": ..., "slot_entities": {...}, "slot_actions": {...}} — the latter two keys are omitted when not provided.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesId of the Card Builder card to render, from card_builder_list_cards.
slot_actionsNoPer-instance overrides for the card's action slots. Omit to use the card's own defaults.
slot_entitiesNoMaps each slot id defined in the card to a HA entity_id, e.g. {'climate': 'climate.salon'}. Omit for no slot bindings.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world. The description adds meaningful context beyond that: 'Pure computation — makes no call to Home Assistant,' which tells the agent this cannot fail on HA connectivity or cause side effects, plus an explicit return shape. Not a full 5 since it doesn't discuss validation errors or edge cases, but the added context is genuinely useful.

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

Conciseness5/5

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

Front-loads the core purpose, then uses labeled 'Use when', 'Not for', and 'Returns' segments. Every sentence carries routing or output 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?

Given an output schema exists, the description need not detail return values further, and the annotations cover safety. Combined with precise routing to the two dashboard-insertion siblings, an agent has everything needed to invoke this correctly in a pipeline.

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 the schema already documents card_id, slot_entities, and slot_actions in detail. The description restates the optional keys and their omission behavior ('omitted when not provided'), which echoes the schema defaults rather than adding new syntax or format guidance. 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 ('Build the Lovelace card config dict that renders a Card Builder card') and pins down the exact output shape. It clearly distinguishes itself from dashboard-mutation siblings by naming them explicitly.

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

Usage Guidelines5/5

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

Provides explicit 'Use when' and 'Not for' guidance, including the exact follow-up tools (dashboards_add_card_to_section for sections views, dashboards_add_card_to_view for masonry/panel views). Nothing is left to inference about when to pick this tool.

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

card_builder_update_cardUpdate Card Builder cardA
Destructive

Update fields of an existing Card Builder card.

Sends only the parameters that are not omitted to card_builder/cards/update; every omitted parameter's prior value in storage is left untouched, but any parameter that is supplied (including config) fully replaces the previous value for that field with no way to recover it afterwards.

Use when: renaming a card, editing its config, or retagging it. Not for: creating a new card — use card_builder_create_card. Returns: the updated card dict as returned by the WebSocket command.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew display name. Omit to leave the current name unchanged.
tagsNoReplacement tag list. Omit to leave tags unchanged.
configNoNew DocumentData v3 block tree, replacing the whole config. Omit to keep the current config.
card_idYesId of the card to update, from card_builder_list_cards.
categoriesNoReplacement category list. Omit to leave categories unchanged.
descriptionNoNew description text. Omit to leave it unchanged.
skip_version_bumpNoIf true, do not bump the card's stored version counter for this change.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and idempotentHint=false; the description goes well beyond them by explaining the partial-update mechanics: omitted params are left untouched, but any supplied value (including config) fully replaces the prior value with no recovery. That 'no way to recover it afterwards' clause is exactly the irreversibility context an agent needs before a destructive write.

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

Conciseness5/5

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

Front-loaded with purpose, then behavioral contract, then Use-when / Not-for routing, then return value. Every sentence earns its place and there is no redundancy.

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

Completeness5/5

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

For a 7-param destructive mutation with full schema coverage and an output schema present, the description closes the key gaps: replacement semantics, irreversibility, and the create-vs-update routing. Nothing an agent needs to invoke it safely is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the description adds genuinely new semantics beyond the per-field 'Omit to leave unchanged' notes: it clarifies the whole-object replacement behavior for config and the write mechanism (only non-omitted params are sent to the update command). That is value the schema does not convey.

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

Purpose5/5

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

Opens with a specific verb+resource ('Update fields of an existing Card Builder card') and immediately distinguishes itself from the create sibling ('Not for: creating a new card — use card_builder_create_card'). An agent can route between card_builder_create_card and this tool 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 enumerates the valid scenarios ('renaming a card, editing its config, or retagging it') and names the exclusion plus the alternative tool. Nothing is left to inference; when-to-use and when-not-to-use are both spelled out.

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

card_builder_update_style_presetUpdate Card Builder style presetA
Destructive

Update fields of an existing Card Builder style preset.

Sends only the parameters that are not omitted to card_builder/style_presets/update; any parameter that is supplied (including data) fully replaces the previous value for that field, with no way to recover the prior value afterwards.

Use when: adjusting an existing preset's style data or metadata. Not for: creating a new preset — use card_builder_create_style_preset. Returns: the updated style-preset dict as returned by the WebSocket command.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoReplacement CSS-style configuration blob. Omit to leave the current data unchanged.
nameNoNew display name. Omit to leave the current name unchanged.
descriptionNoNew description text. Omit to leave it unchanged.
style_preset_idYesId of the preset to update, from card_builder_list_style_presets.
extends_preset_idNoReplacement parent preset id to inherit from. Omit to leave inheritance unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds critical detail: only supplied parameters are sent, each supplied parameter fully replaces the prior value for that field, and the prior value is unrecoverable. This explains the destructive mechanics beyond the annotation flag.

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

Conciseness5/5

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

Front-loads the core purpose, then explains replacement mechanics, then supplies use/not-for routing, then notes the return. The roughly 100-word description has no filler and each 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?

An output schema exists, so detailed return documentation is not required, but the description still summarizes the return type. Annotations cover safety, the schema covers parameters, and the description adds irreversibility semantics and usage routing, making it complete for this destructive update tool.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful update semantics not stated in the schema: omitted parameters are not sent, and any supplied parameter (including `data`) fully replaces the previous field value, which is important for correct invocation.

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 ('Update') and resource ('Card Builder style preset') and scopes it to an 'existing' preset. It explicitly routes creation to the sibling `card_builder_create_style_preset`, so an agent can tell it apart from create without opening schemas.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when' condition (adjusting an existing preset's style data or metadata) and a 'Not for' exclusion pointing to the alternative create tool. The routing is unambiguous for the main alternative.

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

card_builder_upload_image_from_urlDownload and upload image from URLA
DestructiveIdempotent

Download an image from an http(s) URL and upload it to the Card Builder media library.

Only http/https schemes are accepted. The response must declare an image/* Content-Type (covers image/svg+xml) and stay within _MAX_URL_IMAGE_BYTES, else nothing is uploaded. image/svg+xml is sanitized (see sanitize_svg) regardless of filename, since the remote server controls the bytes. The file becomes public under /local/ with no authentication, and an existing path/ filename is silently overwritten.

The URL and every redirect hop are resolved and rejected on a loopback, link-local, unspecified, multicast or other reserved address (incl. ::ffff:127.0.0.1) — host_network: true means 127.0.0.1/localhost here can reach host services that trust it as a local peer. Private LAN ranges stay allowed (e.g. a camera snapshot on your own network).

Use when: mirroring a remote image into the media library. Not for: bytes already in memory — use card_builder_upload_media; a file on disk — use card_builder_upload_media_from_path. Returns: {reference, path, url}. Errors: {"error": "scheme_not_allowed" | "target_not_allowed" | "dns_resolution_failed" | "too_many_redirects" | "content_type_not_allowed" | "file_too_large" | "download_failed" | "invalid_svg" | ...}. Limits: 30-second timeout, _MAX_URL_IMAGE_BYTES (15 MiB) cap, up to _MAX_URL_REDIRECTS (5) redirects, each re-validated.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYeshttp(s) URL of the image to download, e.g. 'https://example.com/bg.png'.
pathNoSub-folder under www/card_builder/ to upload into. Empty string uploads to the root.
filenameNoTarget filename to store as. Omit to derive one from the URL's last path segment.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, idempotentHint=true, and openWorldHint=true, but the description goes far beyond them. It discloses scheme restrictions, content-type enforcement, SVG sanitization, public no-auth placement under /local/, silent overwrite of existing path/filename, SSRF rejection rules for loopback/link-local/reserved addresses, timeout, byte cap, and redirect limits. This is exceptionally rich behavioral context with no contradiction of 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?

Dense but well-structured with labeled sections (Use when/Not for, Returns, Errors, Limits). Every sentence adds actionable information about network safety, failure modes, or constraints. Front-loaded with the core action before the caveats.

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

Completeness5/5

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

Given the tool's complexity (network fetch, SSRF surface, overwrite behavior), the description covers what an agent needs: error codes, return shape, limits, and security model. An output schema exists so return values are not over-explained, and nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents url, path, and filename. The description does not add syntax or format detail for individual parameters beyond what the schema provides, 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 precise verb+resource: 'Download an image from an http(s) URL and upload it to the Card Builder media library.' Explicitly distinguishes from siblings by naming card_builder_upload_media (in-memory bytes) and card_builder_upload_media_from_path (file on disk). No ambiguity about what it 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?

Provides explicit 'Use when: mirroring a remote image' and 'Not for' clauses that route the agent to the correct sibling for in-memory or on-disk sources. The selection conditions are stated rather than inferred.

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

card_builder_upload_mediaUpload media to Card Builder libraryA
DestructiveIdempotent

Upload base64-encoded bytes as a file in the Card Builder media directory.

Decodes content_base64 and writes it under www/card_builder/<path>/ <filename> via card_builder/media/upload. filename must be a bare name (no /, \, or ..) with an allowed extension — .png, .jpg, .jpeg, .gif, .webp, .svg, .avif (case-insensitive). A .svg filename gets its decoded content sanitized (script/handler/ unsafe-URL stripping, element-count cap) — see sanitize_svg. The file becomes **public** under /local/ with **no authentication**, same origin as the HA frontend. Upstream's _write_media_file writes with no existence check, so uploading onto an existing filename/ path silently overwrites it, with no backup.

Use when: the file bytes are already in memory (e.g. generated inline). Not for: a file already on the HA config filesystem — use card_builder_upload_media_from_path; a remote image — use card_builder_upload_image_from_url; raw SVG you'd rather not base64-encode — use card_builder_upload_svg. Returns: {reference, path, url} — reference is the cb-media://local/card_builder/<filename> URI for a block-image's mediaReference prop. Errors: {"error": "extension_not_allowed" | "invalid_base64" | "file_too_large" | "invalid_svg" | ...} (plus sanitize_svg errors) when validation or sanitization rejects the input. Limits: decoded content over _MAX_MEDIA_UPLOAD_BYTES (15 MiB) is refused.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoSub-folder under www/card_builder/ to upload into. Empty string uploads to the root.
filenameYesBare target filename with an allowed image/SVG extension, e.g. 'bg-1.png'. No path separators.
content_base64YesRaw file bytes, base64-encoded.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations (destructiveHint=true, idempotentHint=true, openWorldHint=false) cover the safety profile, and the description adds substantial context beyond them: files become public under /local/ with no authentication, existing files are silently overwritten with no backup (matching destructiveHint), SVG content is sanitized, and the 15 MiB limit plus error codes are disclosed. No contradiction with idempotentHint/destructiveHint.

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

Conciseness4/5

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

Front-loaded with the core action, then layered into constraints, use/not-for, returns, errors, and limits. Dense but well-structured; a few phrases (e.g. repeating the path template) border on redundancy, keeping it short of a 5.

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

Completeness5/5

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

Even though an output schema exists, the description supplies the public-exposure/authentication implication, overwrite semantics, sanitization behavior, size cap, and error taxonomy — everything an agent needs to call this correctly and predict side effects. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real constraints not in the schema: filename must be a bare name with no '/', '\' or '..', the exact allowed extension list is enumerated, and extension matching is case-insensitive. It also clarifies path is the sub-folder under www/card_builder/. Marginal gain over the schema, but genuine.

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 (upload), resource (base64-encoded bytes as a file), and target location (Card Builder media directory under www/card_builder/<path>/<filename>). It also explicitly distinguishes itself from the three sibling upload tools (upload_media_from_path, upload_image_from_url, upload_svg) without the agent needing to open any schema.

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

Usage Guidelines5/5

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

Contains an explicit 'Use when: the file bytes are already in memory' plus a 'Not for' list naming the correct alternative for each excluded case (on-disk file, remote image, raw SVG). This is exactly the when/when-not/alternatives pattern.

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

card_builder_upload_media_from_pathUpload local file to Card Builder mediaA
DestructiveIdempotent

Read a local file under the HA config directory and upload it as Card Builder media.

local_path must resolve (after following symlinks) under <config>/www or <config>/media, and have an image/SVG extension — see _ALLOWED_MEDIA_EXTENSIONS. Anything else (e.g. secrets.yaml, /data/options.json, a sibling directory) is refused before the file is read. .svg files are sanitized (script/event-handler/unsafe-URL stripping) before upload — see sanitize_svg. The uploaded file becomes public under Home Assistant's /local/ path with no authentication. Upstream's _write_media_file writes with no existence check, so uploading onto a path/filename that already holds a file silently overwrites it, with no backup.

Use when: re-publishing a file that already exists on the config filesystem (e.g. under www/) into the Card Builder media library. Not for: bytes already in memory — use card_builder_upload_media; a remote URL — use card_builder_upload_image_from_url. Returns: {reference, path, url} on success, same shape as card_builder_upload_media. Errors: {"error": "invalid_path" | "path_not_allowed" | "extension_not_allowed" | "file_not_found" | "invalid_svg" | ...} (plus the sanitize_svg errors) when the source path is outside the allowed roots, has a disallowed extension, doesn't exist, or fails sanitization.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoSub-folder under www/card_builder/ to upload into. Empty string uploads to the root.
filenameNoTarget filename to store as. Omit to reuse local_path's own filename.
local_pathYesAbsolute or relative path to the source file; must resolve under <config>/www or <config>/media.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses critical behaviors the agent could not infer: the uploaded file becomes public under /local/ with no authentication, no existence check means a silent overwrite with no backup, symlinks are followed before validation, and SVGs are sanitized. It also enumerates the exact error codes and the return shape. This is exactly the additional context the annotations alone do not provide.

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

Conciseness4/5

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

Front-loaded with the core action, then organized into bolded Use when / Not for / Returns / Errors segments, so it is scannable and every section carries decision-relevant content. It is somewhat long and leans on internal identifiers (_ALLOWED_MEDIA_EXTENSIONS, _write_media_file, sanitize_svg) that add jargon without much agent benefit, costing a point.

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

Completeness5/5

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

Even though an output schema exists, the description summarizes the return shape ({reference, path, url}), documents the error taxonomy, and covers the constraints, sanitization, visibility, and overwrite behavior an agent needs to invoke this mutation safely. Nothing material is missing for a tool with side effects and no auth on the resulting asset.

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, but the description adds real semantics for local_path beyond the schema: symlink resolution semantics, the extension allow-list, and the fact that disallowed paths are refused before the file is read. It also ties path/filename behavior to the silent-overwrite risk, which the schema's parameter descriptions do not convey.

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

Purpose5/5

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

States a precise verb+resource (read a local file and upload it as Card Builder media) along with the exact scope constraints (must resolve under <config>/www or <config>/media with an image/SVG extension). It clearly distinguishes itself from the in-memory and remote-URL siblings by name. An agent can identify this tool's unique role without opening the schema.

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

Usage Guidelines5/5

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

Explicit 'Use when' (re-publishing a file already on the config filesystem) and 'Not for' clauses that route to the two named alternatives: card_builder_upload_media for in-memory bytes and card_builder_upload_image_from_url for remote URLs. Conditions for choosing each path are unambiguous.

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

card_builder_upload_svgUpload SVG markup to Card Builder mediaA
DestructiveIdempotent

Sanitize SVG markup and upload it to the Card Builder media directory.

svg_content must start with <svg or <?xml. .svg is appended to filename if missing; the result is stored under www/card_builder/<path>/<filename>. svg_content is always sanitized first: <script>, <style>, <foreignObject>, <iframe>, <embed>, <object> and other non-presentation elements are stripped with their subtree, along with every on*= handler and any href/xlink:href pointing at javascript: or an external/ data:image/svg+xml URL — see sanitize_svg for the allowlist. This matters because the file becomes public, unauthenticated, under /local/, where an unsanitized SVG opened directly executes embedded script as stored XSS into an admin session. _write_media_file writes with no existence check, so uploading onto an existing path/ filename silently overwrites it, with no backup.

Use when: publishing generated or hand-written SVG markup as media. Not for: an SVG file on disk — use card_builder_upload_media_from_path; a remote SVG URL — use card_builder_upload_image_from_url. Returns: {reference, path, url} — reference is the cb-media://local/card_builder/<filename> URI for a block-image's mediaReference prop. Errors: {"error": "not_svg" | "file_too_large" | "path_not_allowed" | "svg_too_complex"} on invalid, unsafe, or oversized input. Limits: capped at _MAX_MEDIA_UPLOAD_BYTES (15 MiB), then _SVG_MAX_ELEMENTS elements after parsing.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoSub-folder under www/card_builder/ to upload into. Empty string uploads to the root.
filenameYesBare target filename, e.g. 'gradient-bg'. '.svg' is appended if missing.
svg_contentYesRaw SVG markup, starting with '<svg' or '<?xml ...'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true): it names the elements/attributes stripped during sanitization, explains the public-unauthenticated stored-XSS consequence that motivates it, and warns that _write_media_file performs no existence check so re-uploading silently overwrites with no backup. Operational limits (15 MiB, _SVG_MAX_ELEMENTS) and the exact error codes are also disclosed.

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?

Long but front-loaded and segmented with explicit 'Use when:', 'Not for:', 'Returns:', 'Errors:' and 'Limits:' markers, so an agent can stop reading after the first sentence if it only needs the gist. Every sentence carries distinct information; the security rationale earns its length by justifying the sanitization behavior.

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, security-sensitive write tool, the description covers prerequisites (svg_content format), side effects (sanitization, silent overwrite), limits, error codes, and the return shape's use for a block-image mediaReference prop. Even though an output schema exists, the extra detail on the reference URI adds task-level context rather than redundancy.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3, but the description still adds value: it specifies the resulting storage location 'www/card_builder/<path>/<filename>' and the sanitization applied to svg_content. The remaining param facts ('.svg' auto-append, '<svg'/'<?xml' prefix) largely restate the schema, so it only modestly exceeds 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 precise verb+resource ('Sanitize SVG markup and upload it to the Card Builder media directory') and draws boundaries against two named siblings ('an SVG file on disk — use card_builder_upload_media_from_path; a remote SVG URL — use card_builder_upload_image_from_url'). An agent can identify and disambiguate this tool 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?

Explicit 'Use when: publishing generated or hand-written SVG markup as media' plus an explicit 'Not for:' clause routing to card_builder_upload_media_from_path and card_builder_upload_image_from_url. The condition that selects each alternative is 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.

card_builder_validate_configValidate Card Builder configA
Read-onlyIdempotent

Run lightweight structural validation on a Card Builder config (DocumentData).

Checks version, rootId presence, that every block has a known type, that parent/child links are mutually consistent, that entity-required blocks resolve an entity provider (inherited, slot, or fixed) by walking up the tree, and that prop values use the {value: ...}/{binding: ...} wrapper Card Builder requires. Pure computation — makes no call to Home Assistant and does not check against the live upstream schema (see card_builder_check_schema_sync for that).

Use when: sanity-checking a config before card_builder_create_card/card_builder_update_card. Returns: {ok: bool, errors: [...], warnings: [...], block_count, slot_count} — ok is false only when errors is non-empty; warnings flags renamed/unwrapped/unknown props without failing.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesDocumentData config to check, as produced by card_builder_build_from_recipe or returned by card_builder_get_card.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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 idempotentHint=true, so safety and idempotency are covered. The description adds valuable behavioral context beyond annotations: it's pure computation with no Home Assistant call, does not check the live upstream schema, defines what `ok` means (false only when errors is non-empty), and clarifies that warnings do not fail validation.

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

Conciseness4/5

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

Well-structured with a definition, an enumerated check list, a usage directive, and a return contract. It is longer than strictly necessary but every sentence earns its place by specifying a distinct check or behavior. The 'Use when' and 'Returns' sections are clearly front-loaded.

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

Completeness5/5

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

Given one required parameter, 100% schema coverage, an output schema, and annotations covering safety/idempotency, the description fills all remaining gaps: it specifies the checks, the pure-computation boundary, the absence of upstream schema comparison, and the exact semantics of the returned status fields. 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.

Parameters4/5

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

Schema coverage is 100% and the schema describes the single `config` parameter, so the schema does the heavy lifting (baseline 3). The description adds meaning by naming the config format (DocumentData) and clarifying its origin (as produced by card_builder_build_from_recipe or returned by card_builder_get_card), which helps the agent supply a correct value.

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

Purpose5/5

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

The description states a specific verb (validate) and resource (Card Builder config / DocumentData) and enumerates the exact structural checks performed. It distinguishes itself from card_builder_check_schema_sync by explicitly noting it does not check against the live upstream 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 'when to use' condition: sanity-checking a config before card_builder_create_card/card_builder_update_card. It also names the alternative (card_builder_check_schema_sync) for upstream schema checks, giving the agent a clear routing decision.

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

dashboards_add_card_to_sectionAdd card to dashboard sectionA

Insert a card into one section of a type: sections view, leaving every other view intact.

Resolves the view via _load_view, requires it to be a sections view, inserts card_config into that section's cards list at position (or the end), and saves the whole dashboard back. This is the only way to make a card visible on a sections view — dashboards_add_card_to_view writes to view.cards, which such a view renders only in edit mode. When expected_config_hash is given, it is checked against the dashboard's hash right after the read and before any change, so a stale caller never overwrites the wrong section.

Use when: adding a card to a specific section of a sections view. Pass expected_config_hash whenever section_index/position came from an earlier read that might now be stale. Not for: a masonry/panel view — use dashboards_add_card_to_view. Returns: {status: "added", url_path, view_index, view_title, section_index, card_index, cards_in_section, config_hash} — config_hash is re-read from HA after the save (not the locally built dict), ready to chain into the next call's expected_config_hash. Errors: raises ValueError when card_config has no type key, the view can't be resolved, isn't a sections view, or section_index is out of range. Returns {"error": "config_changed", "expected_config_hash", "current_config_hash", "action"} without saving when expected_config_hash doesn't match.

ParametersJSON Schema
NameRequiredDescriptionDefault
positionNoZero-based index within the section to insert at. Omit to append at the end.
url_pathYesDashboard url_path, or a view path in the default dashboard (e.g. 'living-room').
view_indexNoZero-based view index; needed only when url_path names a dashboard rather than a view path.
card_configYesLovelace card config with a 'type' key, e.g. {'type': 'tile', 'entity': 'sensor.power'}.
section_indexYesZero-based target section index, from dashboards_get_view_sections.
expected_config_hashNoOptional guard: the config_hash from a recent dashboards_get_view_sections or section-tool response. If the dashboard's current hash differs, this call returns 'config_changed' and saves nothing, since section_index/position are positions, not stable ids, and a change since your read may target the wrong section. Omit to skip the check (today's behaviour).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations cover mutation/safety (readOnly=false, destructive=false, idempotent=false), but the description adds critical context: the internal resolve/insert/save sequence, the reason positional indices are risky, the config-version guard behavior, and both the success payload and the ValueError/'config_changed' failure modes. It stops short of stating permission requirements or whether the dashboard must exist, so not a 5.

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

Conciseness4/5

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

Front-loads purpose, then mechanics, then the explicit Use when/Not for/Returns/Errors blocks. It is longer than most MCP descriptions, but every clause carries a distinct fact; only slight tightening of the mechanics paragraph would help.

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 mutation tool with a nested card_config object and a ConcurrencyGuard parameter, the description supplies returns, error contract, hash semantics, and sibling routing. An agent has everything needed to call it correctly, including recovery from 'config_changed'.

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 parameters are already well-documented. The description reinforces meaning (position, expected_config_hash, section_index) but adds no format details beyond what the schema states, which matches the baseline for 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?

States a specific verb+resource with exact scope: 'Insert a card into one section of a type: sections view, leaving every other view intact.' It explicitly differentiates from the sibling dashboards_add_card_to_view by naming its behavior on a sections view.

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

Usage Guidelines5/5

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

Provides explicit 'Use when' and 'Not for' sections naming the alternative (dashboards_add_card_to_view) for masonry/panel views, plus the condition for passing expected_config_hash. The routing logic is unambiguous.

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

dashboards_add_card_to_viewAdd card to dashboard viewA

Append a card to one view's cards list and save the whole dashboard.

Reads the dashboard via dashboards_get_dashboard_config, appends card_config to views[view_index]["cards"] (creating that key if absent), and writes the whole dashboard back with dashboards_save_dashboard_config — every other view and card is round-tripped unchanged.

Use when: adding a card to a masonry/panel view. Not for: a type: sections view — there, cards in view.cards render only in edit mode; use dashboards_add_card_to_section instead. Returns: {"status": "saved", "url_path": ...} from the underlying save. Errors: raises ValueError when view_index is out of range for the dashboard's view count.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_pathYesDashboard url_path (not a view path), from dashboards_list_dashboards.
view_indexYesZero-based index of the target view within the dashboard's 'views' list.
card_configYesLovelace card config, e.g. {'type': 'entities', 'entities': ['light.living_room']}.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already specify readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false. The description adds valuable mechanism context: it reads via dashboards_get_dashboard_config, appends the card, writes the whole dashboard back, round-trips other views unchanged, returns a saved status, and raises ValueError on an out-of-range view_index. This is richer than the annotations alone, though it does not cover concurrency or every edge case.

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

Conciseness5/5

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

The description is front-loaded with the core action, then structured with mechanism, use cases, exclusions, return value, and errors. Every sentence serves a purpose and the block format makes it easy to scan.

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

Completeness5/5

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

Given the tool's complexity, annotations, full schema coverage, and existing output schema, the description supplies everything an agent needs: mechanism, when to use it, when not to, return shape, and error behavior. Nothing essential is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents url_path, view_index, and card_config. The description explains that card_config is appended to views[view_index]["cards"] and that an out-of-range index raises an error, but it adds only limited semantics beyond the schema descriptions.

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

Purpose5/5

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

The description states a specific verb and resource: append a card to one view's cards list and save the dashboard. It explicitly distinguishes the operation from dashboards_add_card_to_section for sections views, so an agent can identify the tool without confusion.

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 gives explicit use conditions ('Use when: adding a card to a masonry/panel view') and exclusions ('Not for: a type: sections view') with the correct alternative. This leaves no ambiguity about when to choose this tool versus its sibling.

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

dashboards_add_dashboard_resourceAdd Lovelace resourceA

Register a custom JS or CSS resource that loads on every Lovelace dashboard page.

Sends url/resource_type to lovelace/resources/create, which stores a new resource entry with a server-generated id — repeating this call registers a second, distinct resource rather than updating one. The tool itself only stores the URL string; it never fetches url — the browser loads it later, from /local/, /hacsfiles/, or any external CDN the URL names.

Use when: registering a custom card, theme, or script so it becomes available on every dashboard. Not for: changing an existing resource's URL/type — use dashboards_update_dashboard_resource. Returns: {"status": "added", "url": ..., "resource_type": ..., "result": ...} on success. Errors: {"error": "resource_type must be 'module', 'js', or 'css'"} when resource_type is anything else.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesResource URL, e.g. '/local/my-card.js' or '/hacsfiles/mini-graph-card/mini-graph-card-bundle.js'.
resource_typeNoResource kind: 'module' (ES module JS), 'js' (legacy script), or 'css'. Defaults to 'module'.module

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial context beyond annotations: it discloses that the call is non-idempotent (repeating registers a second distinct resource), that the server generates the id, and that the URL is only stored, never fetched, with the browser loading it later from /local/, /hacsfiles/, or a CDN. It also documents the error payload for an invalid resource_type.

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

Conciseness4/5

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

Front-loaded and clearly segmented with Use when / Not for / Returns / Errors labels, so an agent can scan it. However, the explicit 'Returns:' block restates what the output schema already provides, which is mild redundancy.

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

Completeness5/5

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

Given a mutation tool with an output schema and full annotation coverage, the description supplies exactly the missing pieces: non-idempotency, side-effect scope, the not-for alternative, and the failure mode. Nothing an agent needs to call it correctly is absent.

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

Parameters4/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, giving a baseline of 3. The description still adds meaning by clarifying that `url` is an opaque string never fetched by the tool, and by restating the enum constraint on `resource_type` for callers who don't read 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 ('Register a custom JS or CSS resource that loads on every Lovelace dashboard page') and names the sibling it is not, `dashboards_update_dashboard_resource`. An agent can distinguish it from the update/remove siblings 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?

Explicit 'Use when' (registering a custom card, theme, or script) and 'Not for' (changing an existing resource's URL/type) clauses, with the alternative tool named by exact identifier. Nothing is left to inference.

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

dashboards_add_section_to_viewAdd section to dashboard viewA

Insert a new section into a type: sections view.

Resolves the view via _load_view, requires it to be a sections view, defaults section_config to {"type": "grid", "cards": []} when omitted, inserts it into that view's sections list at position (or the end), and saves the whole dashboard back. When expected_config_hash is given, it is checked against the dashboard's hash right after the read and before any change.

Use when: adding a whole new section (a card group with its own grid) to a sections view, before populating it with dashboards_add_card_to_section. Pass expected_config_hash whenever position came from an earlier read that might now be stale. Returns: {status: "added", url_path, view_index, view_title, section_index, sections_in_view, config_hash} — config_hash is re-read from HA after the save, ready to chain into the next call's expected_config_hash. Errors: raises ValueError when section_config["cards"] isn't a list, or the view can't be resolved/isn't a sections view. Returns {"error": "config_changed", "expected_config_hash", "current_config_hash", "action"} without saving when expected_config_hash doesn't match.

ParametersJSON Schema
NameRequiredDescriptionDefault
positionNoZero-based index within the view to insert the section at. Omit to append at the end.
url_pathYesDashboard url_path, or a view path in the default dashboard (e.g. 'living-room').
view_indexNoZero-based view index; needed only when url_path names a dashboard rather than a view path.
section_configNoSection body, e.g. {'cards': [{'type': 'heading', 'heading': 'Living Room'}]}. Omit for an empty grid section.
expected_config_hashNoOptional guard: the config_hash from a recent dashboards_get_view_sections or section-tool response. If the dashboard's current hash differs, this call returns 'config_changed' and saves nothing, since position is a plain index and a change since your read may insert the new section somewhere unintended. Omit to skip the check (today's behaviour).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false, but the description adds significant context: it explains the read-modify-write flow, the default section_config behavior, the config hash guard and its race-condition rationale, exact error conditions (ValueError for non-list cards or unresolvable view), and the structured return value including config_hash for chaining. This goes well beyond annotation hints.

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

Conciseness4/5

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

Well-structured with clear sections ('Use when', 'Returns', 'Errors'). Front-loaded with the core action. The description is long but every sentence adds distinct, actionable information; no obvious fluff. Slightly verbose for an agent, but justified by the complexity of the operation.

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

Completeness5/5

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

Given the mutation nature (destructiveHint=false but read-modify-write), the presence of an output schema, and 5 parameters, the description covers all critical aspects: default behavior, error conditions, return shape, chaining with config_hash, and the optional concurrency guard. Nothing essential is missing for correct invocation.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds nuanced context beyond the schema: it clarifies that section_config defaults to empty grid, that position is zero-based and appends if omitted, and that expected_config_hash guards against stale reads. This is more than repeating schema text.

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 ('Insert a new section'), resource ('type: sections view'), and scope ('Resolves the view via _load_view, requires it to be a sections view'). Clearly distinguishes from sibling dashboards_add_card_to_section by naming the correct sequence (add section, then populate with cards).

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

Usage Guidelines5/5

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

Explicit 'Use when' section names the scenario and routing: 'adding a whole new section (a card group with its own grid) to a sections view, before populating it with dashboards_add_card_to_section.' Also advises when to pass expected_config_hash ('whenever position came from an earlier read that might now be stale').

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

dashboards_add_view_to_dashboardAdd view to dashboardA

Append a new view to a dashboard and save the whole dashboard.

Reads the dashboard via dashboards_get_dashboard_config, appends view_config to its views list, and writes the whole dashboard back with dashboards_save_dashboard_config — every existing view and card is round-tripped unchanged.

Use when: adding a whole new tab/view to a dashboard. Not for: adding a card to an existing view — use dashboards_add_card_to_view or dashboards_add_card_to_section. Returns: {"status": "saved", "url_path": ...} from the underlying save.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_pathYesDashboard url_path to add the view to, from dashboards_list_dashboards.
view_configYesLovelace view config, e.g. {'title': 'Bedroom', 'icon': 'mdi:bed', 'cards': []}.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare the read/write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower, yet the description adds genuine mechanism detail: it reads via get_dashboard_config, appends view_config to the views list, and writes the entire dashboard back with every existing view and card round-tripped unchanged. That read-modify-write disclosure matters for a non-idempotent mutation and reassures against data loss. It does not cover auth/permissions or failure modes, so not 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?

Front-loaded with the core action, then mechanism, then use/not-for, then return shape. Four tight blocks, no filler, 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 2-parameter mutation with an output schema present, the description covers action, mechanism, sibling routing, and return value ({"status": "saved", "url_path": ...}), which is all an agent needs to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100% and view_config even carries an inline example, so the baseline is 3. The description adds semantics beyond the schema by stating that view_config is appended to the dashboard's `views` list and that url_path identifies the target dashboard returned by dashboards_list_dashboards.

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 ('append') and resource ('view to a dashboard') and immediately clarifies scope versus the sibling card-adding tools. An agent can distinguish this from dashboards_add_card_to_view and dashboards_add_section_to_view without opening a schema.

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

Usage Guidelines5/5

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

Contains explicit 'Use when: adding a whole new tab/view' and 'Not for: adding a card to an existing view — use dashboards_add_card_to_view or dashboards_add_card_to_section.' This is textbook routing guidance with named alternatives.

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

dashboards_get_dashboard_configGet Lovelace dashboard configA
Read-onlyIdempotent

Get one Lovelace dashboard's config, or a read-only excerpt of one view.

Calls lovelace/config for url_path as a dashboard; if that raises config_not_found, re-fetches the default dashboard and returns the matching view instead, since url_path may instead be that view's own path.

Use when: reading a dashboard's views/sections before editing it, or inspecting one view without the surrounding dashboard. Not for: passing the view-path result back into dashboards_save_dashboard_config — that excerpt is not a full dashboard config and would delete every other view. Returns: the full dashboard dict (with views) for a dashboard url_path; {"view": ..., "source": "default_dashboard_view", "path": ...} for a view path in the default dashboard. Errors: raises RuntimeError when url_path matches neither a dashboard nor a view in the default dashboard.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_pathNoDashboard url_path (e.g. 'map', from dashboards_list_dashboards) or a view path inside the default dashboard (e.g. 'living-room', from /lovelace/living-room). Omit for the full default dashboard.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, but the description goes well beyond them by disclosing the config_not_found fallback that re-fetches the default dashboard, the exact error condition (RuntimeError when url_path matches neither), and a data-safety warning about the view excerpt. That is substantive behavioral context not derivable 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?

Front-loaded purpose sentence followed by labeled Returns/Errors/Use when/Not for blocks. Every sentence carries operational information (fallback path, return shapes, error condition) with no filler.

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

Completeness5/5

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

Even though an output schema exists, the description usefully names the two distinct return shapes and the failure mode. Combined with annotations and a fully documented single parameter, an agent has everything needed to call this correctly and interpret the result.

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

Parameters4/5

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

Schema coverage is 100% and the schema already explains that url_path may be a dashboard url_path or a view path, so the description largely restates that. It does add value by tying each interpretation to a distinct return shape, clarifying what the single parameter actually controls.

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

Purpose5/5

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

States a specific verb and resource ('Get one Lovelace dashboard's config') and immediately adds the dual-mode nuance ('or a read-only excerpt of one view'). This distinguishes it from siblings like dashboards_get_view_sections and dashboards_list_dashboards without the agent needing to open a schema.

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

Usage Guidelines5/5

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

Contains explicit 'Use when' clauses (reading views/sections before editing, inspecting a single view in isolation) and a 'Not for' clause naming the exact alternative (dashboards_save_dashboard_config) plus the consequence of misuse. This is textbook when/when-not/alternatives guidance.

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

dashboards_get_dashboard_resourcesGet Lovelace resourcesA
Read-onlyIdempotent

List every registered Lovelace resource (custom cards, CSS).

Calls lovelace/resources and returns the raw collection: each entry has id, type (module/js/css), and url.

Use when: finding a resource's numeric id before calling dashboards_update_dashboard_resource or dashboards_remove_dashboard_resource. Returns: list of resource dicts, unfiltered.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds real value beyond them: it names the underlying endpoint (lovelace/resources), states the result is raw and unfiltered, and enumerates the entry fields. It stops short of pagination or error behavior, so not 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 labeled lines (summary, Use when, Returns) with the scope stated first and zero filler. Every sentence earns its place and the structure is skimmable.

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

Completeness5/5

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

For a zero-parameter read with full annotation coverage and an output schema, this is complete: it identifies the source endpoint, the return shape, and the downstream workflow. 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.

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 disambiguate. It correctly signals the no-argument nature by describing an unfiltered, unconditional listing.

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

Purpose5/5

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

States a specific verb (List) and resource (every registered Lovelace resource), with a parenthetical clarifying scope (custom cards, CSS). Clearly distinct from dashboards_list_dashboards and the resource mutation siblings.

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

Usage Guidelines5/5

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

Explicit 'Use when' clause names the exact precondition (finding a resource's numeric id) and the two downstream tools that consume it, dashboards_update_dashboard_resource and dashboards_remove_dashboard_resource. No inference required.

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

dashboards_get_view_sectionsList sections of a dashboard viewA
Read-onlyIdempotent

List the sections of one type: sections view, with real indexes, headings and card counts.

Resolves the view via _load_view (dashboard config or default- dashboard view path), requires it to be a sections view, and reports each section's position, a fallback-derived heading (its heading card, or title), and card count.

Use when: reading current section indexes before calling dashboards_add_card_to_section / dashboards_update_card_in_section / dashboards_remove_card_from_section, or before re-sending expected_config_hash to one of them after their previous call changed it. Returns: {status, url_path, view_index, view_title, view_path, sections: [{section_index, heading, card_count}, ...], config_hash} — pass config_hash back as expected_config_hash to dashboards_add_card_to_section / _update_card_in_section / _remove_card_from_section / _add_section_to_view to detect a dashboard change before your write lands. Errors: raises ValueError when the view can't be resolved (bad index/path) or is not a type: sections view.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_pathNoDashboard url_path (e.g. 'map') or a view path in the default dashboard (e.g. 'living-room'). Omit for the default dashboard's first view.
view_indexNoZero-based view index; required when url_path names a dashboard rather than a view path. Omit when url_path already identifies the view.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description goes further: it explains view resolution via `_load_view`, the requirement that the view be `type: sections`, heading fallback derivation, and that `ValueError` is raised on bad index/path or wrong view type. That is meaningful behavioral detail beyond the annotations.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, returns, and errors in a scannable structure. Slightly long — the config_hash purpose is restated across the returns and paragraph sections — but every block carries operational value.

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

Completeness5/5

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

For a zero-required-parameter read tool with an output schema, this covers resolution prerequisites, error modes, and how the returned config_hash feeds downstream write tools. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds resolution semantics not in the schema: url_path can be a dashboard url_path or a default-dashboard view path, and the view_index requirement depends on that. This clarifies the interaction between the two otherwise-optional parameters.

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

Purpose5/5

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

The description opens with a specific verb+resource+scope: 'List the sections of one `type: sections` view.' It also specifies what is reported (indexes, headings, card counts), which cleanly distinguishes it from sibling writers like dashboards_add_card_to_section and dashboards_add_section_to_view.

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 contains an explicit 'Use when' clause naming the exact conditions (reading current section indexes before add/update/remove card, or before re-sending expected_config_hash) and names the downstream sibling tools. No inference required.

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

dashboards_list_dashboardsList Lovelace dashboardsA
Read-onlyIdempotent

List every registered Lovelace dashboard.

Calls lovelace/dashboards/list and returns the raw collection: each entry has id, url_path, title, mode (storage or yaml), and related flags.

Use when: discovering a dashboard's url_path before calling dashboards_get_dashboard_config or dashboards_screenshot. Returns: list of dashboard dicts, unfiltered. The default dashboard is not included — it has no url_path entry here.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover safety (readOnly, idempotent, non-destructive), and beyond that the description discloses that the default dashboard is excluded because it has no url_path. That is a non-obvious exclusion an agent must know to avoid a false negative.

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

Conciseness5/5

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

Front-loaded verb statement, then API call, then fields, then a labeled 'Use when' and 'Returns' clause. Every sentence carries information; no 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?

Complete for a zero-param list tool: purpose, API endpoint, return fields, the one important edge case (default dashboard excluded), and routing to downstream tools. Output schema covers return values; nothing material is missing.

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

Parameters4/5

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

Zero parameters, so per the rubric the baseline is 4. The description also documents the return shape (id, url_path, title, mode values) which is useful even though an output schema exists.

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

Purpose5/5

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

States a specific verb+resource ('List every registered Lovelace dashboard') and even names the underlying API call. Distinguished from siblings by scoping to dashboards, not entities/areas/etc.

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

Usage Guidelines5/5

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

Explicit when-to-use: 'discovering a dashboard's url_path before calling dashboards_get_dashboard_config or dashboards_screenshot.' Names the exact downstream tools and the precondition, 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.

dashboards_remove_card_from_sectionRemove card from dashboard sectionA
Destructive

Delete one card from a section of a type: sections view.

Resolves the view and section via _load_view/_require_section, pops the card at card_index from that section's cards list, and saves the whole dashboard back. card_index is a position, not a stable id — repeating this call with the same section_index/ card_index after a first successful removal deletes whatever card has shifted into that position next, not a no-op, unless expected_config_hash is also passed and now points at the pre-removal hash, in which case the repeat is rejected with config_changed instead of deleting the wrong card.

Use when: removing a card that's no longer wanted on a sections view. Pass expected_config_hash whenever section_index/card_index came from an earlier read that might now be stale. Returns: {status: "removed", url_path, view_index, view_title, section_index, card_index, removed_card, cards_in_section, config_hash} — removed_card can be passed back to dashboards_add_card_to_section to restore it; config_hash is re-read from HA after the save, ready to chain into the next call's expected_config_hash. Errors: raises ValueError when the view/section/card can't be resolved (bad index/path). Returns {"error": "config_changed", "expected_config_hash", "current_config_hash", "action"} without saving when expected_config_hash doesn't match.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_pathYesDashboard url_path, or a view path in the default dashboard (e.g. 'living-room').
card_indexYesZero-based card index within the section, from dashboards_get_view_sections/inspection.
view_indexNoZero-based view index; needed only when url_path names a dashboard rather than a view path.
section_indexYesZero-based section index, from dashboards_get_view_sections.
expected_config_hashNoOptional guard: the config_hash from a recent dashboards_get_view_sections or section-tool response. If the dashboard's current hash differs, this call returns 'config_changed' and removes nothing — this is what makes a repeated call with a now-stale hash safe instead of deleting whatever shifted into that position. Omit to skip the check (today's behaviour).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the annotations: it discloses that repeating the call after a successful removal will delete a different card unless expected_config_hash guards it, describes the internal resolution steps, the return shape, and specific error conditions (ValueError for bad indices, config_changed error without saving). This is critical context for a destructive, non-idempotent operation.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and key caveat about positional indexing, then details usage, return, and errors in a structured way. It is somewhat lengthy but every sentence adds valuable information, making it well-organized and useful despite the length.

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

Completeness5/5

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

Given the destructive and non-idempotent nature, the description covers all essential aspects: usage, safety guard with expected_config_hash, return format, error behavior, and the non-obvious positional deletion risk. Combined with an output schema, it is fully complete for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; however, the description adds significant semantic nuance by clarifying that card_index is a position not a stable ID and explaining the role of expected_config_hash in preventing accidental deletion, which enhances understanding beyond the schema descriptions.

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

Purpose5/5

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

The description states a specific verb (delete/remove) and resource (a card from a section of a type: sections view), and distinguishes itself from siblings like dashboards_add_card_to_section and dashboards_update_card_in_section by noting the removal action and the positional nature of the operation.

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

Usage Guidelines4/5

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

It provides a clear 'Use when' clause and an important warning about passing expected_config_hash when indices come from a potentially stale read. It doesn't explicitly name alternative tools for related tasks, but the primary usage condition and a key safety condition are covered.

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

dashboards_remove_dashboard_resourceRemove Lovelace resourceA
DestructiveIdempotent

Remove a registered Lovelace resource by its numeric id.

Requires confirm=True; without it, returns a confirmation prompt and makes no change. With confirm=True, calls lovelace/resources/delete, which drops the resource from every dashboard page that loaded it — any custom card/theme it provided stops rendering until the resource is re-added.

Use when: removing a resource that is no longer needed (e.g. after uninstalling a HACS frontend card). Returns: {"status": "removed", "resource_id": ..., "result": ...} on success. Errors: {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to actually remove the resource; false (the default) returns a confirmation prompt instead.
resource_idYesNumeric resource id, from dashboards_get_dashboard_resources.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the confirm gate (no change unless confirm=True), the blast radius (drops the resource from every dashboard page that loaded it), and the downstream effect (custom card/theme stops rendering until re-added). Annotations only give the generic destructiveHint=true; the description supplies the concrete consequences.

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

Conciseness4/5

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

Front-loaded with purpose and the mandatory confirm requirement, then structured into Use when / Returns / Errors blocks that are easy to scan. Slightly long, with the confirm behavior repeated across the prose and schema, but no filler sentences.

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 two-parameter tool with an output schema and full annotation coverage, the description supplies everything an agent needs: when to use it, the confirm prerequisite, the destructive consequence, and error shape. 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 description coverage is 100%, so the schema already defines both parameters, including the confirm semantics and the source of resource_id. The description largely restates this, so the baseline 3 is appropriate.

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

Purpose5/5

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

The first sentence states a specific verb (Remove), a specific resource type (registered Lovelace resource), and the identifier basis (numeric id). This clearly separates it from dashboards_add_dashboard_resource and dashboards_update_dashboard_resource without needing to open either schema.

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

Usage Guidelines4/5

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

"Use when: removing a resource that is no longer needed (e.g. after uninstalling a HACS frontend card)" gives a concrete trigger scenario. It does not, however, name the alternative tools (update vs. remove) or state when-not to use it, so it stops short of full routing guidance.

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

dashboards_save_dashboard_configSave Lovelace dashboard configA
DestructiveIdempotent

Replace the entire config of one storage-mode Lovelace dashboard.

Sends config as-is to lovelace/config/save, fully overwriting that dashboard's stored views/sections with no validation, backup, or undo — keep the previous config (e.g. from dashboards_get_dashboard_config) if you need to restore it.

Use when: writing back a dashboard object built or fetched in full. Not for: a single card or section change — use dashboards_add_card_to_section/dashboards_update_card_in_section/ dashboards_remove_card_from_section (sections views) or dashboards_add_card_to_view (masonry/panel views), which read-modify- write the config for you. Returns: {"status": "saved", "url_path": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesFull dashboard object with a 'views' list, as returned by dashboards_get_dashboard_config for a dashboard path — never the {view, source, path} excerpt it returns for a view path.
url_pathNoDashboard url_path to save, from dashboards_list_dashboards. Omit for the default dashboard.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds concrete consequences beyond them: no validation, no backup, no undo, and explicit guidance to retain the prior config from `dashboards_get_dashboard_config` for restoration. That is exactly the behavioral context a caller needs before a full overwrite.

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

Conciseness5/5

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

Front-loaded with the core action, then the overwrite warning, then the routing guidance, then the return shape. Every sentence earns its place; nothing is redundant 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 destructive, nested-object write with an output schema, the description covers the overwrite semantics, the no-undo risk, the correct source for the payload, sibling alternatives, and even the return shape. An agent has everything needed to call it safely.

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 both `config` and `url_path` are already documented, including the warning about the view-path excerpt. The description reinforces that `config` is sent as-is but adds no new syntax or format detail beyond the schema, so the baseline of 3 applies.

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

Purpose5/5

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

The first sentence states a specific verb and resource: 'Replace the entire config of one storage-mode Lovelace dashboard.' It further distinguishes scope (storage-mode, full replacement) and names the sibling alternatives to use for granular edits, so an agent can identify 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 Guidelines5/5

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

Explicit 'Use when' and 'Not for' sections. It names the exact alternatives (`dashboards_add_card_to_section`, `dashboards_update_card_in_section`, `dashboards_remove_card_from_section`, `dashboards_add_card_to_view`) and the view types they apply to, leaving no inference to the agent.

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

dashboards_screenshotScreenshot a Lovelace dashboard viewA
Read-onlyIdempotent

Capture a PNG screenshot of one Lovelace dashboard view via the Puppet add-on engine.

Resolves url_path to a concrete frontend route (see the parameter description), rejects paths containing unsafe characters, then calls the Puppet engine (discovered via Supervisor or NEXUS_SCREENSHOT_ENGINE_URL) over HTTP with the resolved viewport/ zoom/wait parameters and returns its PNG response as base64. Deciding between a dashboard route and a default-dashboard view path costs one lovelace/dashboards/list call (skipped when url_path already starts with lovelace). Reaches only a local/LAN add-on, not the public internet.

Use when: visually verifying a dashboard or view after editing it. Returns: {url_path, engine, format: "png", width, height, image_base64, size_bytes} on success — url_path echoes the resolved route, not the raw argument, and image_base64 can be large, especially with full_page=True (fixed 4096px height). Errors: {"error": "dashboard_list_unavailable" | "invalid_path" | "engine_not_available" | "engine_unreachable" | "engine_http_<code>" | "empty_response", "detail": ..., ...} when the dashboard list can't be fetched, the path is unsafe, the Puppet engine isn't installed/ started, or the engine request itself fails. Limits: 60-second engine timeout; full_page=True only approximates full-scroll capture since the engine does not measure actual page height, so it can crop tall pages or leave blank space on short ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
zoomNoBrowser zoom factor applied by the engine. Defaults to 1.0 (no zoom).
widthNoViewport width in pixels. Defaults to 1280.
heightNoViewport height in pixels. Ignored when full_page=True. Defaults to 800.
wait_msNoSettle time in milliseconds after page load before capturing — increase for heavy chart cards. Defaults to 2500.
url_pathNoFrontend route to capture. A registered dashboard's own url_path (e.g. 'dashboard-porch', optionally with a view path appended: 'dashboard-porch/porch-tests') is used as-is. A path already starting with 'lovelace' (e.g. 'lovelace/0') is also used as-is. Anything else is treated as a view of the default dashboard and gets 'lovelace/' prepended (e.g. 'living-room' -> 'lovelace/living-room'). Omit for the default dashboard's root.
full_pageNoIf true, use a fixed 4096px-tall viewport instead of height, approximating a full-scroll capture. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld status, yet the description adds substantial behavior: unsafe-character rejection, engine discovery order, one extra lovelace/dashboards/list call for ambiguous paths, LAN-only reach, all error variants, and the 60s timeout plus full_page approximation caveat.

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

Conciseness4/5

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

Front-loads the core action, then organizes the rest into Use/Returns/Errors/Limits blocks, so every section earns its place. It is dense but not padded, though it is longer than strictly necessary given the output schema exists.

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

Completeness5/5

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

For a screenshot tool with six parameters, an output schema, and annotations, the description covers resolution behavior, error taxonomy, and limits without contradicting structured fields. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already fully documented, including url_path resolution and full_page semantics. The description largely restates the url_path resolution rule rather than adding new syntax beyond the schema, 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 (capture PNG screenshot), resource (Lovelace dashboard view), and mechanism (Puppet add-on engine). An agent can distinguish this from siblings like dashboards_list_dashboards or snapshot_get_snapshot 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?

Explicit 'Use when: visually verifying a dashboard or view after editing it' gives clear triggering context. No explicit when-not or named alternative is offered, but the usage condition is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dashboards_update_card_in_sectionUpdate card in dashboard sectionA
Destructive

Change one existing card inside a section of a type: sections view.

Resolves the view and target card via _load_view/_require_card, then merges card_config's keys into the existing card (merge=True, the default) or replaces it outright (merge=False), and saves the whole dashboard back. The previous card is only recoverable via card_before in this call's own response — storage itself keeps no history. With expected_config_hash, the dashboard's hash is checked right after the read and before any change, so a stale caller can't edit the wrong card.

Use when: tweaking or replacing one card already placed in a section. Pass expected_config_hash when section_index/card_index came from a read that might now be stale. Not for: adding a new card — use dashboards_add_card_to_section; removing one — use dashboards_remove_card_from_section. Returns: {status: "updated", url_path, view_index, view_title, section_index, card_index, card_before, card_after, config_hash} — config_hash is re-read from HA after the save, for the next call's expected_config_hash. Errors: raises ValueError when card_config is empty, merge=False lacks a type key, or the view/section/card can't be resolved. Returns {"error": "config_changed", ...} without saving when expected_config_hash doesn't match.

ParametersJSON Schema
NameRequiredDescriptionDefault
mergeNoIf true (default), merge card_config's keys into the existing card. If false, replace the card wholesale.
url_pathYesDashboard url_path, or a view path in the default dashboard (e.g. 'living-room').
card_indexYesZero-based card index within the section, from dashboards_get_view_sections/inspection.
view_indexNoZero-based view index; needed only when url_path names a dashboard rather than a view path.
card_configYesCard fields to apply. With merge=true, a partial update (only these keys change); with merge=false, the full replacement card (needs a 'type' key).
section_indexYesZero-based section index, from dashboards_get_view_sections.
expected_config_hashNoOptional guard: the config_hash from a recent dashboards_get_view_sections or section-tool response. If the dashboard's current hash differs, this call returns 'config_changed' and saves nothing, since section_index/card_index are positions, not stable ids, and a change since your read may target the wrong card. Omit to skip the check (today's behaviour).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations: explains merge vs. replace semantics, that no history exists so the prior card is recoverable only via `card_before` in this response, that the hash check occurs after read and before any write, and the exact failure modes (`config_changed`, ValueError conditions).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then behavior, usage routing, return shape, and errors in labeled blocks; dense but nearly every sentence carries unique information, with only minor overlap against the schema's merge description.

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, non-idempotent mutation with a nested config object, the description covers side effects, rollback limits, guard semantics, error cases, and return fields; an output schema exists, so summarizing returns is a bonus rather than a requirement.

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; the description adds meaning beyond the schema by tying `expected_config_hash` to stale-index risk and clarifying that `merge=True` is the default partial-update path while `merge=False` requires a `type` key.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource with scope ('Change one existing card inside a section of a `type: sections` view'), and explicitly names the sibling tools for adjacent operations (add/remove), so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' clauses naming `dashboards_add_card_to_section` and `dashboards_remove_card_from_section`, plus conditional guidance on when to pass `expected_config_hash` (stale index risk).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dashboards_update_dashboard_resourceUpdate Lovelace resourceA
DestructiveIdempotent

Replace the URL and type of an existing Lovelace resource.

Sends resource_id, url and resource_type to lovelace/resources/update, replacing both fields of that resource entry — the previous URL/type are not recoverable afterwards. Like dashboards_add_dashboard_resource, this tool never fetches url itself.

Use when: repointing an existing resource entry at a new file or changing its declared type. Not for: registering a brand-new resource — use dashboards_add_dashboard_resource. Returns: {"status": "updated", "resource_id": ..., "url": ..., "resource_type": ..., "result": ...} on success. Errors: {"error": "resource_type must be 'module', 'js', or 'css'"} when resource_type is anything else.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesNew resource URL, replacing the current one.
resource_idYesNumeric resource id to update, from dashboards_get_dashboard_resources.
resource_typeNoResource kind: 'module' (ES module JS), 'js' (legacy script), or 'css'. Defaults to 'module'.module

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds what is destroyed ('the previous URL/type are not recoverable afterwards') and a non-obvious trait not captured by any annotation: 'this tool never fetches url itself'. It also documents the error response format and the resource_type constraint, giving concrete operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then well-labeled Use when / Not for / Returns / Errors sections that make it easy to scan. Slightly long, and the Returns block partially duplicates the existing output schema, but no line is truly wasteful.

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, 3-parameter, single-purpose mutation with annotations and an output schema, the description covers purpose, routing, irreversibility, side-effect scope, and error cases. An agent has everything needed 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% and all three parameters (resource_id, url, resource_type) are already documented in the schema, so the description's mention of them is largely confirmatory. The error-string detail for resource_type echoes what the schema enum description already states. Baseline 3 is correct 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?

Opens with a specific verb+resource: 'Replace the URL and type of an existing Lovelace resource', and even names the backend endpoint (lovelace/resources/update). It explicitly contrasts with the sibling dashboards_add_dashboard_resource, so an agent can distinguish update vs create 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?

Contains explicit 'Use when: repointing an existing resource entry' and 'Not for: registering a brand-new resource — use dashboards_add_dashboard_resource'. Both the triggering condition and the named alternative are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devices_list_devicesList devices (slim fields)A
Read-onlyIdempotent

List all devices with a slimmed set of common fields.

Calls WS config/device_registry/list and projects each entry down to id, name_by_user, name, area_id, manufacturer, model, entry_type, plus config_entries and disabled_by when present.

Use when: you need the device registry without every raw field. Not for: the full unfiltered registry — use areas_list_devices; devices scoped to one area — use devices_list_devices_in_area; fuzzy name-based search — use search_search_devices. Returns: list of slimmed device dicts as described above.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value beyond that by disclosing the underlying WS call (`config/device_registry/list`) and the projection behavior, including which fields are conditionally present (config_entries, disabled_by when present). It omits pagination/size behavior, 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?

Front-loads the core purpose, then the field projection, then routing guidance, then returns. Every sentence earns its place and the structure maps cleanly onto how an agent reads a definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no elaboration beyond the field list given. For a zero-parameter read tool with annotations and an output schema, 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.

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; the baseline of 4 applies. No parameter guidance is required or expected here.

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 all devices") and immediately scopes it ("slimmed set of common fields"). It enumerates the projected fields and explicitly distinguishes itself from the three closest siblings by name, so an agent can select it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit "Use when" condition and a "Not for" list naming three alternatives (`areas_list_devices`, `devices_list_devices_in_area`, `search_search_devices`) with the condition that routes to each. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devices_list_devices_in_areaList devices in areaA
Read-onlyIdempotent

List devices currently assigned to one area.

Calls WS config/device_registry/list and filters the slimmed device list (see devices_list_devices) down to entries whose area_id matches.

Use when: you need only the devices in one area rather than the whole registry. Not for: the whole device registry — use devices_list_devices or areas_list_devices; fuzzy name-based search — use search_search_devices. Returns: list of slimmed device dicts (see devices_list_devices) whose area_id equals the given area_id. Limits: devices without an area are never returned here.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_idYesArea registry ID to filter by; obtain it from areas_list_areas.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe read-only, idempotent profile, so the bar is lower. The description still adds real behavioral context: the underlying WS call (config/device_registry/list), the client-side filtering step, and the important limit that devices with no assigned area are never returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by clearly labelled When/Not for/Returns/Limits blocks. Slightly redundant: the Returns line largely repeats the opening sentence's filtering rule, and the return value is already covered by the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with a full output schema, the description covers implementation source, selection guidance, return shape pointer, and the key edge case (area-less devices excluded). 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% and the single parameter already documents that the area ID comes from areas_list_areas. The description only restates that filtering is an exact match on area_id, adding little beyond the schema, 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 with scope: 'List devices currently assigned to one area.' It also names the sibling it is not (devices_list_devices, areas_list_devices, search_search_devices), so an agent can disambiguate 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?

Explicit 'Use when' clause plus a 'Not for' clause that routes each excluded case to a named alternative tool. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devices_remove_deviceRemove device from config entryA
DestructiveIdempotent

Remove a device from one of its config entries.

Calls WS config_entries/remove_device with both IDs; if the device belongs to other config entries it keeps existing under those.

Use when: detaching a device from one integration without touching its other config entries. Returns: dict with device_id, config_entry_id and the raw WS result. Limits: both device_id and config_entry_id are required — there is no way to remove a device from every config entry in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesDevice registry ID to remove; obtain it from devices_list_devices.
config_entry_idYesConfig entry ID the device is attached to; the device is detached only from this entry.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds the key blast-radius nuance: the device survives under its other config entries (partial destruction), and names the underlying WS contract. It does not discuss permissions or confirmation, so 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose, then cleanly segmented into Use when / Returns / Limits. Slightly padded by the WS method name line, which largely duplicates the title, but nothing is genuinely wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive operation with a full output schema and rich annotations, the description covers purpose, scope, blast radius, and limits. Return-value detail is redundant given the output schema but harmless; 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are documented richly in the schema (including how to obtain device_id and that config_entry_id scopes the detachment). The description restates the required-both constraint but adds no new parameter semantics, 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 (remove) plus resource (device) plus precise scope (from one of its config entries), and explicitly clarifies it is not a full device deletion. An agent can distinguish this from devices_update_device and integrations_remove_integration 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?

Contains an explicit 'Use when' clause (detaching a device from one integration without touching its other config entries) and a Limits clause that acts as a when-not (no single call removes across every config entry). This leaves little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devices_update_deviceUpdate device registry entryA
Destructive

Update fields on an existing device registry entry.

Calls WS config/device_registry/update; only the parameters you pass are sent, so omitted or null fields are left unchanged.

Use when: renaming a device, moving it to another area, or enabling or disabling it. Returns: dict with device_id and result (the updated device, slimmed like devices_list_devices). Limits: area_id can only be set here, not cleared — there is no parameter to remove an existing area assignment.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_idNoArea registry ID to assign the device to, from areas_list_areas; omit to leave the current area unchanged.
device_idYesDevice registry ID to update; obtain it from devices_list_devices.
disabled_byNo'user' disables the device and its entities, '' (empty string) re-enables it; omit to leave the disabled state unchanged.
name_by_userNoNew user-facing name override for the device; omit to leave the current name unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the underlying WS call, the partial-update semantics ('only the parameters you pass are sent, so omitted or null fields are left unchanged'), the return shape, and a real constraint that area_id can be set but never cleared. These are behavioral traits an agent could not infer from readOnlyHint/destructiveHint alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then cleanly separated into WS/partial-update semantics, usage, return value, and limits. Every sentence adds information and none is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with annotations, a full schema, and an output schema, this covers the partial-update behavior, the constraint on area_id, and the return shape. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description earns a bump by adding the area_id limitation that the schema does not state (the schema only says 'omit to leave unchanged', not that clearing is impossible). The enabling/disabling hint also ties disabled_by to intent.

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 ('Update fields on an existing device registry entry') and clearly contrasts with siblings like devices_list_devices and devices_remove_device. An agent can tell what the tool does and roughly which registry object it acts on 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?

The 'Use when' clause gives concrete scenarios (renaming, moving to another area, enabling/disabling) that map directly to the available fields. It provides clear context but does not explicitly name alternative tools or state when NOT to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_get_tool_docGet full documentation for one toolA
Read-onlyIdempotent

Get one tool's full description, parameter schema and MCP annotations.

Looks the tool up by exact name in the current index and returns its full (un-truncated) docstring alongside the same inputSchema and annotations an MCP client sees from tools/list.

Use when: reading a specific tool's full contract after finding its name with discover_tool_search. Not for: searching by keyword — use discover_tool_search. Returns: {"name", "namespace", "description", "input_schema", "annotations", "access"}. input_schema is the tool's JSON-schema parameter dict; annotations is the four MCP hints plus title as a plain dict, or None for a tool whose module has not yet declared them. access is "read", "write" or "destructive" (ADR-0002/0003 annotation class), computed fail-closed even when annotations is None. Errors: {"error": "not_found", "name": name} when no tool with that exact name is in the index.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFull tool name including namespace, e.g. 'entities_get_entity', from `discover_tool_search`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is fully covered. The description adds meaningful context beyond annotations: what the returned dict contains, that inputSchema matches what an MCP client sees, that annotations may be None, that access is computed fail-closed, and the not_found error shape. It does not describe truncation limits or index staleness, but the core behavior is well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well structured with clear Use/Not for/Returns/Errors sections that front-load the key behavior, but the Returns block enumerates every field of the returned dict, which is more verbose than needed for an agent that can inspect the output schema. Slight over-explanation of return fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, the description need not enumerate return values, and it does so anyway. However, it covers usage, behavior, errors, and annotation handling completely enough that an agent can call this tool correctly without reading another definition. The only gap is not mentioning that the index may need refreshing via discover_refresh_index if a tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter's schema description already explains that it is the full tool name from discover_tool_search. The description adds little beyond restating the exact-name lookup constraint, 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 and resource: 'Get one tool's full description, parameter schema and MCP annotations.' The description distinguishes itself from the sibling discover_tool_search by explaining lookup is by exact name and by contrasting with keyword search. An agent can tell exactly what this tool returns 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 when to use it ('reading a specific tool's full contract after finding its name with discover_tool_search') and when not to use it ('searching by keyword — use discover_tool_search'). The routing to the alternative is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_list_namespacesList tool namespacesA
Read-onlyIdempotent

List every mounted Nexus tool namespace with its tool count.

Groups the current tool index by namespace (the mount prefix parsed from server.py, e.g. "card_builder", "entities") and counts entries.

Use when: getting an overview of which domains exist before narrowing a discover_tool_search call with its namespace parameter. Not for: the tools within one namespace — use discover_tool_search with that namespace. Returns: list of {"namespace", "count"}, most populated first.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description goes beyond them by disclosing the grouping derivation (mount prefix from server.py) and the ordering of results ('most populated first'), which annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line summary, then separates mechanics, usage, exclusion, and return shape into labeled blocks. Every sentence carries information; nothing is redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still usefully previews the return shape and ordering. With zero params, full annotation coverage, and an explicit alternative-tool pointer, an agent has everything needed to select and invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4 and there is nothing to document. The description does mention the `namespace` parameter, but that belongs to the sibling discover_tool_search rather than this tool, so it adds no semantics for this call's own (empty) input.

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 mounted Nexus tool namespace with its tool count') and adds the aggregation logic (grouping by mount prefix). An agent can distinguish this from sibling list tools like entities_list_entities or discover_tool_search without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause ties it to pre-narrowing a discover_tool_search call, and a 'Not for' clause routes the agent to discover_tool_search with a namespace when it wants tools inside one domain. Both the positive and negative cases are covered with a named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discover_refresh_indexRebuild the tool search indexA
Read-onlyIdempotent

Force-rebuild the in-memory tool search index.

Drops the cached index and rebuilds it from _ROOT.list_tools(). Only nexus's own in-process cache is affected — nothing in HA changes.

Use when: tools were mounted or changed at runtime after the index was first built (normally only relevant during development, since server.py mounts every namespace once at startup). Not for: routine searches — discover_tool_search/ discover_list_namespaces/discover_get_tool_doc already rebuild the index lazily on first use. Returns: {"status": "rebuilt", "tools": <count>}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description nonetheless adds valuable scope context: it drops the in-memory cache, rebuilds from _ROOT.list_tools(), and affects only nexus's in-process cache with no HA change.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded core action, then labeled 'Use when', 'Not for', and 'Returns' blocks. Every sentence earns its place and the most important constraint (dev-only, no HA impact) is prominent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero params and the presence of an output schema, the description need not explain return values, yet it still does so harmlessly. Safety, scope, trigger conditions, and alternatives are all covered; 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 parameter semantics carry no burden; baseline for 0 params is 4. Nothing in the description needs to compensate for schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (force-rebuild) plus specific resource (in-memory tool search index), and it explicitly distinguishes itself from the discover_* siblings that rebuild lazily. An agent can tell exactly what this does and how it differs from the search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (tools mounted/changed at runtime after index was built, normally dev-only) and 'Not for' clause that names the three alternative tools and explains they already rebuild lazily. Both the trigger and the anti-trigger are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_add_battery_sourceAdd battery sourceA

Add a battery source to the Energy Dashboard.

Reads the current preferences, appends a new {"type": "battery", ...} entry combining stat_energy_from (discharge) and stat_energy_to (charge) to the energy_sources list, and saves it via WS energy/save_prefs. Calling it twice with the same arguments adds a second, duplicate source.

Use when: registering a home battery's charge and discharge sensors as one Energy Dashboard source. Not for: grid or solar sources — use energy_add_grid_consumption/ energy_add_grid_return/energy_add_solar_source. Returns: {"status": "added", "stat_energy_from": ..., "stat_energy_to": ..., "result": ...}. Errors: {"error": str(e)} when either WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
stat_energy_toYesStatistic/entity ID of the battery charge (energy in) sensor to add, e.g. 'sensor.battery_charge'.
stat_energy_fromYesStatistic/entity ID of the battery discharge (energy out) sensor to add, e.g. 'sensor.battery_discharge'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false; the description goes beyond them by disclosing the read-modify-write sequence, the underlying WS call used, and the concrete non-idempotent consequence ('calling it twice with the same arguments adds a second, duplicate source'). It also documents the response and error shapes, so the mutation's side effects and failure mode are fully visible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the append-and-save mechanism, then cleanly partitioned into Use when / Not for / Returns / Errors. Every line carries information an agent needs; nothing is repeated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter mutation over an output-schema-bearing tool, the definition covers side effects, idempotency, routing to alternatives, and the error envelope. The presence of an output schema means return values need not be re-explained, yet the description still summarizes the success shape, leaving no obvious 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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: it explains that the two IDs are combined into a single battery entry and maps them to discharge (stat_energy_from) and charge (stat_energy_to). It stops short of adding format/validation details, so it is a modest rather than exhaustive improvement.

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 ('Add a battery source to the Energy Dashboard') and explicitly distinguishes itself from the sibling grid/solar adders. The mechanism (reads prefs, appends a battery entry combining stat_energy_from/stat_energy_to, saves via energy/save_prefs) is concrete enough that an agent can tell it apart from energy_save_energy_prefs or energy_add_solar_source 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?

Provides an explicit 'Use when' clause (registering a home battery's charge and discharge sensors as one source) and a 'Not for' clause naming the exact alternatives (energy_add_grid_consumption/energy_add_grid_return/energy_add_solar_source). Both the selection condition and the exclusions are stated rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_add_grid_consumptionAdd grid consumption flowA

Add a grid consumption flow to the Energy Dashboard's grid source.

Reads the current preferences via ha._ws_call("energy/get_prefs"), appends stat_energy_from (and stat_cost if given) as a new flow_from entry on the existing grid source, creating that grid source first if none exists yet, then saves the updated list via WS energy/save_prefs. Calling it twice with the same stat_energy_from adds a second, duplicate flow entry.

Use when: registering a grid-import sensor as an Energy Dashboard consumption flow. Not for: grid export/solar compensation — use energy_add_grid_return; for a full source-list replacement use energy_save_energy_prefs. Returns: {"status": "added", "stat_energy_from": ..., "result": ...}. Errors: {"error": str(e), "stat_energy_from": ...} when either WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
stat_costNoOptional statistic/entity ID of the matching cost sensor for this flow, e.g. 'sensor.grid_cost'. Omit if no cost sensor should be linked to this flow.
stat_energy_fromYesStatistic/entity ID of the grid-import energy sensor to add, e.g. 'sensor.grid_energy_import'. Discover candidates with `statistics_list_statistic_ids`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false), but the description adds material context beyond them: the read-modify-write sequence via energy/get_prefs and energy/save_prefs, the fact that the grid source is auto-created if absent, the duplicate-entry behavior of re-calling with the same ID, and the error shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with labeled Use when / Not for / Returns / Errors sections, so an agent can scan it quickly. Slightly long because it narrates internal WS call mechanics, but every sentence still carries usable 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?

Despite an output schema existing, the description still documents the success payload and the error object, and it fully covers the prerequisite state (existing or absent grid source) plus the duplicate-call caveat, leaving nothing an agent needs missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining that stat_energy_from (and stat_cost if supplied) become a new flow_from entry appended to the existing grid source, clarifying the role each parameter plays in the mutation.

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 ('Add a grid consumption flow to the Energy Dashboard's grid source') and precisely distinguishes it from the two nearest siblings: energy_add_grid_return for export, and energy_save_energy_prefs for full list replacement.

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 gives explicit 'Use when' (registering a grid-import sensor as a consumption flow) and 'Not for' guidance that names the exact alternative tool for each excluded case, leaving no routing ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_add_grid_returnAdd grid return flowA

Add a grid return (export) flow to the Energy Dashboard's grid source.

Reads the current preferences via ha._ws_call("energy/get_prefs"), appends stat_energy_to (and stat_compensation if given) as a new flow_to entry on the existing grid source, creating that grid source first if none exists yet, then saves via WS energy/save_prefs. Calling it twice with the same stat_energy_to adds a second, duplicate entry.

Use when: registering a solar-export or other grid-return sensor, e.g. solar sold back to the grid. Not for: grid import — use energy_add_grid_consumption; for a full source-list replacement use energy_save_energy_prefs. Returns: {"status": "added", "stat_energy_to": ..., "result": ...}. Errors: {"error": str(e), "stat_energy_to": ...} when either WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
stat_energy_toYesStatistic/entity ID of the grid-export energy sensor to add, e.g. 'sensor.solar_export'. Discover candidates with `statistics_list_statistic_ids`.
stat_compensationNoOptional statistic/entity ID of the matching compensation/cost sensor for this export flow. Omit if no compensation sensor should be linked.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which only declare non-read-only, non-idempotent, non-destructive), it discloses the internal WS sequence (energy/get_prefs then energy/save_prefs), auto-creation of a grid source when none exists, and the duplicate-entry caveat on repeated calls with the same stat_energy_to. It also gives return and error shapes. This is rich behavioral context the 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?

Front-loaded with the action, then clearly labeled Use when / Not for / Returns / Errors sections. Every sentence carries distinct information; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with an output schema and annotations present, the definition is complete: mechanism, prerequisites, duplicate risk, alternatives, and both success and error response shapes are covered. Nothing needed to call it safely 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%, so the schema already defines both parameters fully. The description adds the mapping into the prefs structure ('appends stat_energy_to (and stat_compensation if given) as a new flow_to entry'), but that is marginal beyond the schema. 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 ('Add a grid return (export) flow to the Energy Dashboard's grid source') and explicitly names the sibling it is not ('Not for: grid import — use energy_add_grid_consumption'). An agent can route correctly 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?

Contains explicit 'Use when' (registering a solar-export/grid-return sensor) and 'Not for' sections that name two alternative tools (energy_add_grid_consumption for import, energy_save_energy_prefs for full source-list replacement). Both selection conditions are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_add_solar_sourceAdd solar production sourceA

Add a solar production source to the Energy Dashboard.

Reads the current preferences, appends a new {"type": "solar", ...} entry to the energy_sources list, and saves it via WS energy/save_prefs. Calling it twice with the same stat_energy_from adds a second, duplicate source.

Use when: registering a solar production sensor as a new Energy Dashboard source. Not for: an existing source's export flow — use energy_add_grid_return; for a full source-list replacement use energy_save_energy_prefs. Returns: {"status": "added", "stat_energy_from": ..., "result": ...}. Errors: {"error": str(e), "stat_energy_from": ...} when either WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
stat_energy_fromYesStatistic/entity ID of the solar production sensor to add, e.g. 'sensor.solar_production'. Discover candidates with `statistics_list_statistic_ids`.
config_entry_solar_forecastNoOptional config entry ID of a solar forecast integration (e.g. Forecast.Solar) to link to this source. Omit if no forecast should be linked.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it reveals the read-append-save implementation (energy/save_prefs), the exact entry shape appended, the duplicate-source behavior on repeated calls (reinforcing idempotentHint=false with concrete consequence), plus the return payload and error shape. Annotations cover the safety profile and destruction behavior, and the description adds material operational context on top.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then behavior, then use/not-for routing, then returns/errors in clearly delineated blocks. Every sentence carries distinct information with no 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?

Despite an output schema existing, the description still summarizes the success and error returns. Behavior, routing, prerequisites for the statistic ID, and outcome are all covered, so an agent has everything needed 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%, so both parameters are already documented in the schema, including the meaning of stat_energy_from and the discovery path. The description adds only the duplicate-on-repeat note tied to stat_energy_from, 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 ('Add a solar production source to the Energy Dashboard') and explicitly names the two siblings it must not be confused with (energy_add_grid_return, energy_save_energy_prefs). An agent can distinguish 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?

Provides explicit 'Use when' and 'Not for' clauses, naming the exact alternative for each excluded case (export flow -> energy_add_grid_return; full replacement -> energy_save_energy_prefs). Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_get_energy_infoGet energy dashboard infoA
Read-onlyIdempotent

Return Energy Dashboard info such as cost sensors and currency.

Calls the WebSocket endpoint energy/info and returns its payload unchanged.

Use when: you need metadata about the Energy Dashboard (available cost sensor types, currency) rather than the source configuration itself. Not for: the actual source/device list — use energy_get_energy_prefs. Returns: dict as returned by HA's energy/info WS command. Errors: {"error": str(e)} when the WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds real value: it names the underlying WS endpoint (energy/info), says the payload is returned unchanged, and documents the error shape {"error": str(e)}. It stops short of discussing auth or rate limits, but for a read-only metadata call that is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line summary followed by labeled sections (Use when / Not for / Returns / Errors). Every line carries information; nothing is redundant 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?

An output schema exists, so the description is not obliged to explain return values, yet it still identifies the endpoint and payload semantics. Combined with the explicit exclusion of the sibling tool, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies no arguments are needed and adds no misleading parameter hints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return Energy Dashboard info such as cost sensors and currency') and immediately names the sibling it is not (energy_get_energy_prefs). An agent can distinguish this metadata lookup from the prefs/source-config tool 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?

Explicit 'Use when' clause scopes it to dashboard metadata (cost sensor types, currency) as opposed to source configuration, and an explicit 'Not for' clause routes the agent to energy_get_energy_prefs. Both the positive and negative conditions are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_get_energy_prefsGet energy dashboard preferencesA
Read-onlyIdempotent

Return the full HA Energy Dashboard preferences.

Calls the WebSocket endpoint energy/get_prefs and returns its payload unchanged, including the configured energy_sources and device_consumption lists.

Use when: you need the current preferences before editing them with energy_save_energy_prefs or one of the energy_add_*/ energy_remove_energy_source helpers. Not for: adding or removing a single source without hand-building the full list — use energy_add_grid_consumption, energy_add_grid_return, energy_add_solar_source, energy_add_battery_source or energy_remove_energy_source instead. Returns: dict with energy_sources (list) and device_consumption (list), exactly as HA stores them. Errors: {"error": "..."} when the WebSocket call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is clear. The description adds the underlying WebSocket endpoint (`energy/get_prefs`) and an error shape (`{"error": "..."}`), which is useful behavioral context beyond the annotations. It does not cover auth/rate limits, but those are minor for a local read-only getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structurally front-loaded with clear labels ('Use when:', 'Not for:', 'Returns:', 'Errors:') and every section is relevant. The 'Returns' line is somewhat redundant given an output schema exists, keeping this from a full 5.

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 getter with rich annotations and an output schema, the description covers purpose, usage context, explicit alternatives, and error behavior. Nothing critical an agent needs to select or invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to document. Baseline 4 applies; the description correctly does not invent parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the full HA Energy Dashboard preferences') and explicitly contrasts with sibling tools like `energy_save_energy_prefs` and the `energy_add_*` helpers. An agent can immediately tell this is the read-only getter for the full energy prefs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' guidance (before editing via save or add/remove helpers) and a 'Not for' section that routes single-source additions/removals to the correct alternative tools. No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_remove_energy_sourceRemove energy sourceA
DestructiveIdempotent

Remove an energy source identified by its stat_energy_from.

Reads the current preferences, drops any solar/battery/gas/water source whose stat_energy_from matches, also strips matching flow_from entries from the grid source, and saves the resulting list via WS energy/save_prefs. This replaces the whole energy_sources list with one that has the matching entries removed — anything else in the list is preserved as-is.

Use when: undoing an energy_add_solar_source/energy_add_battery_source/ energy_add_grid_consumption call, or dropping a source that no longer exists. Not for: replacing the whole source list at once — use energy_save_energy_prefs. Returns: {"status": "removed", "removed": <count>, "stat_energy_from": ..., "result": ...} on success, or {"status": "not_found", "stat_energy_from": ...} when nothing matched. Errors: {"error": str(e), "stat_energy_from": ...} when either WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
stat_energy_fromYesStatistic/entity ID identifying the source to remove, as originally passed to one of the `energy_add_*` tools, e.g. 'sensor.solar_production'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: it discloses the read-modify-write sequence via WS `energy/save_prefs`, explains that it strips matching `flow_from` entries from the grid source as a side effect, and confirms non-matching entries are preserved. This is exactly the extra behavioral context the annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then a precise behavioral paragraph, then explicit Use when / Not for / Returns / Errors sections. Every sentence carries information; no 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 mutation tool with annotations and an output schema, the description covers the remaining gaps: the read-modify-write mechanism, side effects, success/not-found/error return shapes, and the alternative tool. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents the single parameter well (including an example). The description adds value by tying the parameter to its origin (value as originally passed to `energy_add_*`) and describing how it is used to match both the primary source and related `flow_from` entries, which goes slightly beyond the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Remove) and resource (energy source) and identifies the exact key (`stat_energy_from`) used to target it. It also differentiates itself from the sibling `energy_save_energy_prefs` by noting it is not the whole-list replacement tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (undoing `energy_add_*` calls, dropping stale sources) and when not to (replacing the whole list — use `energy_save_energy_prefs`). This directly satisfies the when/when-not/alternatives bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_save_energy_prefsReplace energy dashboard source listsA
DestructiveIdempotent

Save Energy Dashboard preferences via WS energy/save_prefs.

Each of energy_sources/device_consumption you pass replaces the entire corresponding saved list — it is not merged with what's already there. Use energy_add_grid_consumption, energy_add_grid_return, energy_add_solar_source, energy_add_battery_source or energy_remove_energy_source for incremental edits instead of hand-building the full list. currency/energy_per_unit are kept only for backward compatibility and are rejected: HA's currency lives in core config (homeassistant.currency), not this WS schema, and energy_per_unit does not exist in it at all.

Use when: you already hold the full desired energy_sources/ device_consumption list, e.g. from energy_get_energy_prefs. Not for: adding or removing one source — use the energy_add_*/ energy_remove_energy_source helpers, which read-modify-write for you. Returns: {"status": "saved", "result": ..., "fields": [...]} on success. Errors: {"error": "no fields to save", ...} when both list parameters are omitted; {"error": "currency and energy_per_unit are not fields of HA's energy/save_prefs WS schema...", ...} when either deprecated parameter is passed; {"error": str(e), ...} when the WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNoDeprecated and not part of this WS schema; passing anything other than None now returns an error instead of being silently ignored. Omit this parameter.
energy_sourcesNoFull replacement for the Energy Dashboard's energy_sources list; each dict is one grid/solar/battery/gas/water source. Omit to leave the currently saved sources untouched.
energy_per_unitNoDeprecated and not part of this WS schema; passing anything other than None now returns an error instead of being silently ignored. Omit this parameter.
device_consumptionNoFull replacement for the Energy Dashboard's device_consumption list, one dict per tracked device. Omit to leave the currently saved device list untouched.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true, but the description goes further by disclosing exactly WHAT is destroyed: each list parameter 'replaces the entire corresponding saved list — it is not merged.' It also documents the rejected deprecated parameters and their error outcomes. This is substantial behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the operation and its core replacement semantics, then organizes alternatives, usage conditions, return shape, and error cases in clearly labeled blocks. It is longer than average, and the verbatim WS schema names plus full error-string enumeration are somewhat heavy, but every block serves selection or invocation.

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?

Although an output schema exists (so return values need not be explained), the description still states the success shape and the two specific error conditions. Combined with destructive/idempotent annotations and full schema coverage, an agent has everything needed to call this tool correctly and interpret failures.

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 schema already documents each parameter's replacement-vs-omit behavior and the deprecated currency/energy_per_unit handling. The description reinforces the non-merge semantics and the rejection of deprecated fields, but adds no syntax or format detail beyond what the schema states. Baseline 3 applies 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+resource ('Save Energy Dashboard preferences via WS energy/save_prefs') and immediately clarifies the replacement semantics, which is the defining characteristic of this tool. It also names the sibling helpers it must not be confused with, so an agent can distinguish it from the energy_add_*/energy_remove_energy_source tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit 'Use when' (you already hold the full desired lists, e.g. from energy_get_energy_prefs) and 'Not for' (single-source edits) sections, naming the concrete alternative tools for each case. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

energy_validate_energy_prefsValidate energy dashboard configurationA
Read-onlyIdempotent

Validate the currently saved Energy Dashboard configuration.

Calls the WebSocket endpoint energy/validate, which checks the saved energy_sources/device_consumption for issues (e.g. a statistic ID that no longer exists) without changing anything.

Use when: checking whether the current Energy Dashboard setup has issues, e.g. after editing sources with energy_save_energy_prefs or one of the energy_add_* helpers. Not for: reading the configuration itself — use energy_get_energy_prefs. Returns: dict as returned by HA's energy/validate WS command, listing any detected issues per source. Errors: {"error": str(e)} when the WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint, idempotentHint, destructiveHint and openWorldHint, so the bar is lower. The description still adds context beyond annotations: it says the check runs against the saved energy_sources/device_consumption, that it makes no changes, and it discloses the error shape ({"error": str(e)}). It does not mention rate limits or auth requirements, but for a read-only validation call that is a minor omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then mechanism, then use/not-for, then return and error shape. Slightly verbose in restating the endpoint name and the validation target, but every section earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the zero-param, read-only nature and the presence of an output schema, the description is nearly complete: it covers purpose, prerequisites (edit operations that should precede it), alternatives, return shape, and error behavior. The only thing it does not cover is any permission or environment precondition, which is minor here.

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. The description correctly implies a no-argument call and explains what underlying data is inspected, adding meaning without inventing parameter details.

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 (validate) and resource (currently saved Energy Dashboard configuration) and names the underlying WebSocket command 'energy/validate'. It also explicitly distinguishes itself from the sibling energy_get_energy_prefs, which reads the config rather than validating it.

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?

Includes explicit 'Use when' (after editing sources with energy_save_energy_prefs or energy_add_* helpers) and 'Not for' (reading the config — use energy_get_energy_prefs). This fully routes the agent between this tool and its closest siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_assign_entity_to_areaAssign entity to areaA
DestructiveIdempotent

Assign an entity to an area, replacing its current area assignment.

Calls WS config/entity_registry/update with area_id=area_id; any previous area assignment is overwritten and not returned.

Use when: moving an entity to a different area in the registry. Not for: renaming it, or toggling exposure — use entities_update_entity_name or entities_set_entity_exposure. Returns: the updated entity registry entry from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_idYesArea registry ID to assign the entity to, replacing any current area.
entity_idYesFull entity ID to reassign, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 idempotentHint=true, so the safety profile is covered. The description still adds real context the annotations don't: the previous assignment is overwritten and not returned, and the underlying WS call. It stops short of stating any permission or failure 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?

Front-loaded with the action, then Use when / Not for / Returns in labeled clauses. Every sentence carries information an agent needs; 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?

Output schema exists, so the brief 'Returns' note is sufficient and non-redundant. With full schema coverage, clear routing, and the overwrite caveat stated, an agent has everything needed to invoke this 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%, so both parameters (entity_id, area_id) are already documented in the schema. The description restates the overwrite semantics for area_id but adds no format or syntax detail beyond it. Baseline 3 is correct.

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 (assign), resource (entity), and target (area), and immediately qualifies it with 'replacing its current area assignment.' The agent can distinguish it from name/exposure siblings 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?

Explicit 'Use when: moving an entity to a different area in the registry' and 'Not for: renaming it, or toggling exposure,' with the two correct alternative tools named. This is textbook when/when-not/alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_bulk_controlBulk turn on, off or toggle entitiesA

Turn on, turn off or toggle many entities in one call, grouped by domain.

Groups entity_ids by domain and issues one <domain>.<action> service call per domain group (e.g. all light.* entities get a single light.turn_on), instead of one call per entity.

Use when: applying the same on/off/toggle action to many entities across domains at once. Not for: writing arbitrary states instead of calling a service — use entities_bulk_set_state; controlling every entity of one domain in a single area by area_id rather than an explicit entity_id list — use areas_control_area. Returns: dict mapping domain to the number of entities affected. Errors: raises ValueError when action is not one of turn_on, turn_off, toggle.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesService to call per domain group: 'turn_on', 'turn_off' or 'toggle'.
entity_idsYesFull entity IDs to act on, e.g. ['light.a', 'light.b'].

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare safety hints, but the description adds valuable behavioral mechanics: grouping by domain, one service call per domain group, the return shape (dict mapping domain to affected count), and the exact ValueError condition. This goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then mechanics, usage guidance, returns, and errors. Every sentence earns its place; no wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given two fully documented parameters, an output schema, and non-destructive annotations, the description is complete. It even covers return values and error conditions, leaving no ambiguity for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that entity_ids are grouped by domain and that action determines the service call issued per group, which clarifies how the parameters interact.

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 (turn on/off/toggle), resource (many entities), and scope (bulk, grouped by domain). It clearly distinguishes itself from single-entity siblings like entities_turn_on and from non-service state writing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a 'Use when' condition and two 'Not for' alternatives with named sibling tools (entities_bulk_set_state and areas_control_area). The agent can select correctly without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_bulk_set_entity_exposureBulk set entity assistant exposureA
Idempotent

Expose or hide many entities across one or more voice assistants in a single call.

Calls WS homeassistant/expose_entity once with the full entity_ids and assistants lists, which HA accepts natively, instead of one call per entity/assistant pair. Returns immediately with an empty result when entity_ids is empty.

Use when: changing exposure for many entities and/or several assistants at once. Not for: a single entity and assistant — use entities_set_entity_exposure. Returns: dict with count, assistants, should_expose and the raw WS result. Errors: raises ValueError when assistants contains an identifier outside conversation, cloud.alexa, cloud.google_assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
assistantsNoSubset of voice assistants to target. Omit to apply to conversation, cloud.alexa and cloud.google_assistant.
entity_idsYesFull entity IDs to expose or hide, e.g. ['light.a', 'light.b'].
should_exposeYesTrue to expose the entities to the target assistants, false to hide them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation/idempotency profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds context annotations cannot carry: it collapses N×M calls into one WS call, returns an empty result for an empty `entity_ids` list, names the return keys, and specifies that a ValueError is raised for out-of-range assistant identifiers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the WS mechanism, then cleanly segmented into Use when / Not for / Returns / Errors. Every line carries distinct information; no filler or restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description briefly names the returned fields and documents the error path and empty-input edge case. For a 3-parameter bulk mutation tool, an agent has everything needed to call it correctly and interpret the result.

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, but the description adds value the schema lacks: it enumerates the valid assistant identifiers (conversation, cloud.alexa, cloud.google_assistant), which the schema does not constrain with an enum, and clarifies that the full `entity_ids`/`assistants` lists are sent in one call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Expose or hide many entities across one or more voice assistants') with an explicit bulk scope. It also names the mechanism (a single WS `homeassistant/expose_entity` call with full lists), so an agent can distinguish it from the single-entity sibling 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?

Provides an explicit 'Use when' clause (many entities and/or several assistants at once) and an explicit 'Not for' clause routing single entity+assistant cases to `entities_set_entity_exposure`. Both the positive and negative conditions 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.

entities_bulk_set_stateBulk write virtual entity statesA
Idempotent

Write states for many entities directly via the states API, one call per entity.

Calls ha.set_state(entity_id, state, attributes) per item in updates, which posts to /api/states/<entity_id>; this sets a virtual state that a real device driver overwrites on its next update, unlike a real service call.

Use when: seeding or overriding state for testing, template sensors, or entities with no backing device. Not for: actually controlling a device — use entities_bulk_control. Returns: list of per-update dicts ({entity_id, ok, error?, error_type?}); a missing entity_id/state or a failed write is reported per item, not raised. Errors: per-item {"ok": false, "error": "...", "error_type": "..."}; error_type is "validation" for a missing entity_id/state (no write attempted), "http" for an httpx.HTTPError from the write call (bad response or network failure talking to Home Assistant), or "unexpected" for any other exception. An "unexpected" error is still caught per item and does not abort the rest of the batch.

ParametersJSON Schema
NameRequiredDescriptionDefault
updatesYesList of {entity_id, state, attributes?} dicts describing the virtual state to write per entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses that this sets a *virtual* state overwritten by a real driver on the next update, that failures are reported per item rather than raised, and it enumerates the error_type taxonomy (validation/http/unexpected) with the condition that triggers each. This is rich operational context the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with labeled Use when/Not for/Returns/Errors sections and front-loads the core behavior. It is slightly verbose in the Errors paragraph, but every sentence carries operational meaning rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a bulk mutation tool it covers behavior, safety implications (virtual vs real state), usage routing, and granular error semantics. An output schema exists so return values needn't be spelled out, yet the per-item result shape is described anyway, leaving no material gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is only one parameter, giving a baseline of 3, but the description adds real meaning beyond the schema: it clarifies the per-item required fields (entity_id/state) and specifies that a missing one yields a 'validation' error with no write attempted. That goes beyond the loose '{entity_id, state, attributes?}' schema item.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('write states for many entities... one call per entity') and explains the underlying mechanism (ha.set_state posting to /api/states/<entity_id>). It clearly distinguishes itself from entities_bulk_control and from a real service call, so an agent can differentiate it from siblings immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' (seeding/overriding state for testing, template sensors, entities with no backing device) and 'Not for' that names the alternative (entities_bulk_control) for actual device control. This is textbook when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_disable_entityDisable entity in registryA
Idempotent

Disable an entity in the registry so Home Assistant stops creating its state.

Calls WS config/entity_registry/update with disabled_by="user".

Use when: retiring an entity without deleting its registry entry. Not for: re-enabling it — use entities_enable_entity. Returns: the updated entity registry entry from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull entity ID to disable, e.g. 'sensor.old_device'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is already covered. The description adds real value beyond that by disclosing the underlying WS call (`config/entity_registry/update` with `disabled_by="user"`) and the observable effect that state creation stops. It does not, however, mention reversibility mechanics or permission requirements beyond the sibling hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight lines, front-loaded with the primary effect, then mechanism, then routing guidance, then return value. Every sentence earns its place with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite low complexity and a fully documented single parameter, the description covers effect, mechanism, when/when-not, and return value. Nothing an agent needs to invoke it correctly is missing, and the output schema makes further return detail unnecessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and schema description coverage is 100% (the schema already documents entity_id with an example). The description adds no syntax or format 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?

Specific verb+resource ('Disable an entity in the registry') plus the concrete effect ('Home Assistant stops creating its state'). It also names the sibling it is not (entities_enable_entity), so an agent can distinguish it from the entities_* family without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: retiring an entity without deleting its registry entry' and 'Not for: re-enabling it — use entities_enable_entity'. It names the condition and the alternative tool, leaving no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_enable_entityEnable entity in registryA
Idempotent

Re-enable a previously disabled entity in the registry.

Calls WS config/entity_registry/update with disabled_by=None.

Use when: restoring an entity disabled via entities_disable_entity. Not for: disabling it — use entities_disable_entity. Returns: the updated entity registry entry from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull entity ID to re-enable, e.g. 'sensor.old_device'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), but the description adds genuinely new context: the exact WS endpoint and the `disabled_by=None` mechanism, which explains why the operation is idempotent and reversible. It does not mention permissions or side effects beyond the registry entry, keeping it just 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?

Four short lines with the primary action front-loaded, then mechanism, usage routing, exclusion, and return value. Every sentence earns its place with no 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 single-parameter toggle whose output schema already defines the returned registry entry, this description covers purpose, mechanism, when/when-not, and return source. 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 coverage is 100% and the single entity_id parameter already carries an example, so the schema does the heavy lifting. The description adds only the implied constraint that the ID must reference a previously disabled entity; 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 ('Re-enable a previously disabled entity in the registry') and even names the underlying WS call, so the effect is unambiguous. It is clearly distinguishable from siblings like entities_disable_entity and integrations_enable_integration.

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 gives 'Use when: restoring an entity disabled via entities_disable_entity' and 'Not for: disabling it — use entities_disable_entity.' Both the trigger condition and the alternative tool are 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.

entities_get_entityGet entity stateA
Read-onlyIdempotent

Get the full state and attributes of a single entity.

Calls ha.get_state(entity_id), a single HTTP GET to /api/states/<entity_id>; the response includes state, attributes, last_changed and last_updated as reported by Home Assistant.

Use when: inspecting one entity's current value and attributes before or after an action. Not for: many entities at once — use entities_list_entities or snapshot_get_snapshot. Returns: dict with entity_id, state, attributes, last_changed, last_updated, context.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull entity ID to read, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds real value beyond that: the underlying ha.get_state call, the single HTTP GET to /api/states/<entity_id>, and exactly which fields the response reports. It does not cover error behavior for unknown entity IDs, so it is not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then a compact Use/Not-for/Returns structure that is easy to scan. The implementation sentence about ha.get_state is somewhat redundant with the Returns line but still informative, keeping it just short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety, an output schema covering the return shape, and 100% schema coverage on the sole parameter, the description supplies the remaining context (when to use, alternatives, source endpoint). 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% and the single entity_id param is already documented with an example ('light.kitchen') in the schema. The description adds no format or validation detail beyond that, 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 ('Get the full state and attributes of a single entity') and explicitly scopes to one entity, distinguishing it from list/snapshot siblings in the same sentence block. 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when:' (inspecting one entity's value/attributes before or after an action) and 'Not for:' routing to named alternatives (entities_list_entities, snapshot_get_snapshot). Both the positive and negative conditions 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.

entities_get_entity_exposureGet entity voice assistant exposureA
Read-onlyIdempotent

Get exposure flags for one entity across all voice assistants.

Home Assistant has no per-entity exposure query, so this fetches the full exposure map via WS homeassistant/expose_entity/list and filters it client-side; an entity absent from that map is reported as False for every assistant.

Use when: checking whether one entity is exposed, and to which assistants. Not for: the whole exposure map for one assistant — use entities_list_exposed_entities. Returns: dict with entity_id and exposure (assistant name -> bool for conversation, cloud.alexa, cloud.google_assistant).

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull entity ID to query exposure for, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds genuine behavioral context beyond that: it fetches the whole exposure map and filters client-side, and critically discloses that an entity absent from the map is reported as False for every assistant — a non-obvious semantic.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then implementation note, then labeled 'Use when'/'Not for'/'Returns' sections. Well-structured and skimmable; the internal WS API detail is slightly verbose but arguably justifies the false-for-absent behavior.

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-param read tool with an output schema and full annotations, the description covers purpose, alternatives, the absent-entity edge case, and the return shape. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 `entity_id` parameter is already documented as a full entity ID with an example. The description adds no additional parameter meaning, so the baseline 3 for schema-documented params 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?

Starts with a specific verb+resource+scope: 'Get exposure flags for one entity across all voice assistants.' This precisely identifies the operation and its single-entity, all-assistants scope, letting an agent distinguish it from the sibling `entities_list_exposed_entities`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: checking whether one entity is exposed, and to which assistants' plus 'Not for: the whole exposure map for one assistant — use `entities_list_exposed_entities`.' Names the alternative and the exact condition that selects it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_list_entitiesList entities with filtersA
Read-onlyIdempotent

List entity states, optionally filtered by domain, with pagination and field selection.

Reads live states via ha.get_states() over HTTP; when fields requests area_id, device_id or labels, it also fetches the entity registry over WebSocket and joins it by entity ID. Filtering by domain and pagination (limit/offset) are applied client-side after the fetch.

Use when: browsing or searching current entity states across the whole installation or one domain. Not for: raw registry fields such as disabled/hidden status — use entities_list_entity_registry; a plain unfiltered state dump — use ws_get_states. Returns: list of dicts, one per entity, containing only the requested fields. Limits: limit/offset paginate the already-filtered list; no size cap beyond that.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of entities to return after filtering, for pagination. Omit for no limit.
domainNoEntity domain prefix filter, e.g. 'light' or 'sensor'. Omit to include every domain.
fieldsNoPer-entity keys to return. Defaults to entity_id, state, friendly_name. Also accepts attributes, area_id, device_id, labels.
offsetNoNumber of filtered entities to skip before applying limit. 0 starts from the first match.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations that confirm it's read-only and idempotent, the description discloses key behavioral traits: it reads live states via HTTP, conditionally fetches the entity registry over WebSocket when area_id/device_id/labels are requested and joins by entity ID, and applies filtering/pagination client-side. It also describes the return format and limits. This is rich, non-obvious context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (overview, implementation details, use when, not for, returns, limits). Every sentence is informative and front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given annotations cover safety and an output schema exists, the description provides comprehensive context on behavior, usage, and limits. It could be slightly more complete by mentioning potential performance implications of client-side filtering over large installations, but it's very thorough.

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 the schema already documents all parameters. The description mentions filtering by domain, pagination via limit/offset, and field selection, but does not add syntax or format details beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb+resource: 'List entity states, optionally filtered by domain, with pagination and field selection.' It distinguishes itself from siblings by explicitly naming alternatives (entities_list_entity_registry, ws_get_states).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when' and 'Not for' sections explicitly name alternatives and the conditions that select them. This is textbook routing guidance, leaving no ambiguity about when to use this tool versus others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_list_entity_registryList entity registry entriesA
Read-onlyIdempotent

Get the raw entity registry, including disabled and hidden entities.

Calls WS config/entity_registry/list and filters client-side by domain when given. Unlike entities_list_entities, this has no state values, only registry metadata (area_id, device_id, disabled_by, labels, ...).

Use when: auditing registry metadata, including disabled/hidden entities that carry no live state. Not for: current state values — use entities_list_entities. Returns: list of raw entity registry entry dicts from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoEntity domain prefix filter, e.g. 'light' or 'sensor'. Omit to include every domain.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so safety is covered. The description adds real behavioral context: the underlying WS endpoint, that filtering happens client-side, and that disabled/hidden entities are included — useful details an agent would otherwise not know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the key distinction (no state values), then structured 'Use when / Not for / Returns' blocks. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with a full output schema, the description covers scope, filtering mechanics, distinguishing metadata fields, and routing to alternatives. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single `domain` parameter is fully documented in the schema. The description adds only that filtering is client-side, a minor semantic on top of the schema's own example-based description, 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?

It states a specific verb (list) and resource (raw entity registry) and explicitly contrasts with the sibling `entities_list_entities`, noting this variant carries only registry metadata and no state values. An agent can pick it apart from siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (auditing registry metadata, disabled/hidden entities with no live state) and 'Not for' (current state values → use `entities_list_entities`) sections name the exact condition and the alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_list_exposed_entitiesList entities exposed to an assistantA
Read-onlyIdempotent

List every entity currently exposed to one voice assistant.

Home Assistant has no per-assistant exposure query, so this fetches the full exposure map via WS homeassistant/expose_entity/list and filters it client-side for the given assistant.

Use when: auditing what one assistant can currently see. Not for: exposure of one specific entity — use entities_get_entity_exposure. Returns: dict with assistant and exposed (list of entity IDs). Errors: raises ValueError when assistant is not one of conversation, cloud.alexa, cloud.google_assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
assistantYesVoice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe read-only, idempotent, non-destructive profile, and the description adds substantial context beyond them: it explains the internal WebSocket call and client-side filtering, documents the return shape, and states the exact ValueError condition and valid assistant identifiers. This is rich operational disclosure that goes well past what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then mechanism, usage guidance, return shape, and error behavior. Every sentence carries distinct information, and the Use/Not for/Returns/Errors structure makes it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with rich annotations and an output schema, the description is complete: it covers purpose, alternatives, implementation caveats, return shape, and error cases. Nothing an agent needs to invoke or interpret this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the single `assistant` parameter is already fully documented in the schema with the same valid values. The description restates those values but adds no new syntax, format, or edge-case meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list every entity exposed to one voice assistant. It explicitly distinguishes itself from the sibling `entities_get_entity_exposure`, which handles a single entity's exposure, so an agent can select 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?

It gives explicit use conditions ('Use when: auditing what one assistant can currently see') and an explicit exclusion ('Not for: exposure of one specific entity — use `entities_get_entity_exposure`'). The alternative tool is named directly, leaving no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_select_optionSelect entity optionA
Idempotent

Select an option on an input_select or select entity.

Calls input_select.select_option for input_select.* entities, or select.select_option for every other domain (in practice select.*).

Use when: setting the current option of an input_select or select entity. Not for: an input_select-only call site — helpers_set_input_select does the same thing for that domain specifically. Returns: the list of changed states from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionYesOption string to select; must match one of the entity's configured options.
entity_idYesFull entity ID to set, e.g. 'input_select.house_mode'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description needn't repeat that. It adds useful behavioral context by disclosing the service routing per domain and the return shape. It does not mention failure modes (e.g., an option that doesn't match configured options) or auth needs, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then service routing, then use/not-for, then return value. Every element earns its place, though the implementation detail about underlying service names is somewhat redundant with the clearly-named tool and adds a little length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering the safety profile and an output schema covering the return value, the description only needs to establish purpose and routing. It does so completely, including the sibling alternative, leaving no gap an agent needs to call this 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%, so both parameters are already documented in the schema ('option must match one of the entity's configured options', entity ID format). The description adds no parameter-level detail beyond that, 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 ('Select an option') and resource ('input_select or select entity'), and further clarifies by naming the exact underlying service calls per domain. An agent can distinguish it from siblings like helpers_set_input_select 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?

Explicit 'Use when' clause defines the trigger condition, and the 'Not for' clause names the alternative (helpers_set_input_select) plus the condition selecting it (input_select-only call site). This is exactly the when/when-not/alternative structure expected at the top of the scale.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_set_entity_exposureSet entity voice assistant exposureA
Idempotent

Expose or hide one entity to one voice assistant.

Calls WS homeassistant/expose_entity with a single-element entity_ids/assistants list.

Use when: changing exposure for one entity and one assistant. Not for: many entities or assistants at once — use entities_bulk_set_entity_exposure. Returns: dict with entity_id, assistant, should_expose and the raw WS result. Errors: raises ValueError when assistant is not one of conversation, cloud.alexa, cloud.google_assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
assistantYesVoice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'.
entity_idYesFull entity ID to expose or hide, e.g. 'light.kitchen'.
should_exposeYesTrue to expose the entity to the assistant, false to hide it.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description goes further: it discloses the underlying WS call, the exact return dict keys, and the ValueError condition with the allowed assistant values. That is substantive behavioral context beyond 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?

Front-loaded single-sentence purpose followed by tight labeled clauses (Use when / Not for / Returns / Errors). Every sentence carries distinct information with no 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 single-entity mutation tool with an output schema, the description covers the operation, the alternative, the return shape, and the failure mode. 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 three parameters are already documented in the schema. The description adds only the error constraint on assistant values, which is useful but marginal against a fully documented 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+resource ('Expose or hide one entity to one voice assistant') with explicit scope of one entity and one assistant, and names the sibling it differs from (entities_bulk_set_entity_exposure). An agent can distinguish it 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?

Explicit 'Use when' clause plus a 'Not for' clause that names the alternative tool and the condition (many entities/assistants) that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_set_valueSet entity valueA
Idempotent

Set the numeric value of an input_number, number or climate entity.

Dispatches to input_number.set_value, number.set_value or climate.set_temperature depending on entity_id's domain; any other domain raises ValueError before any HTTP call is made.

Use when: writing a target number or temperature to one of these three domains. Not for: input_text, input_select, input_boolean or input_datetime — use helpers_set_input_text, helpers_set_input_select, helpers_set_input_boolean or helpers_set_input_datetime. Returns: the list of changed states from Home Assistant. Errors: raises ValueError for any domain other than input_number, number or climate.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesNumeric value to write; interpreted per domain, see Behaviour.
entity_idYesFull entity ID to set, e.g. 'input_number.target_temp'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare safety traits, and the description goes further by explaining domain-based dispatch, pre-HTTP ValueError behavior for unsupported domains, and return of changed states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, then structured sections for usage, returns, and errors. Every sentence is useful, with no filler; the returns and errors notes remain helpful even though an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given moderate complexity, full schema coverage, annotations, and an output schema, the description is complete: it covers routing, valid domains, error handling, and expected output.

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 both parameters are already documented. The description adds only that value is interpreted per domain and that entity_id's domain selects the underlying service, which is minimal additional parameter-level detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Set'), resource ('numeric value'), and the exact three entity domains it supports. It distinguishes itself from non-numeric helper tools by naming them and pointing to their alternatives.

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 provides 'Use when' guidance for writing numeric values or temperatures, and 'Not for' exclusions for input_text, input_select, input_boolean, and input_datetime with the correct sibling alternatives named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_toggleToggle an entityA

Toggle an entity between on and off by calling its domain's toggle action.

Calls <domain>.toggle with {"entity_id": entity_id} over HTTP; the resulting state depends on the entity's current state, so repeating this call flips it back and forth.

Use when: the desired end state is unknown or irrelevant, only "flip it". Not for: a deterministic on/off — use entities_turn_on/entities_turn_off. Returns: the list of changed states from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull entity ID to toggle, e.g. 'switch.fan'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-idempotent, non-destructive, closed-world, but the description adds the reason: the resulting state depends on the current state so repeated calls flip back and forth. It also discloses the underlying mechanism (calls `<domain>.toggle` over HTTP with `{entity_id}`) and that it returns changed states, which annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose, then mechanism, then a labeled 'Use when / Not for / Returns' block. Every sentence carries distinct information with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter entity control tool with annotations covering safety hints and an output schema present, the description supplies everything needed: purpose, non-idempotent behavior, selection criteria, and the underlying service 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 description coverage is 100% and entity_id is fully documented in the schema, including the 'switch.fan' example. The description only restates the parameter in the payload shape, adding no meaning beyond the schema, 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 and resource ('Toggle an entity between on and off') and explicitly frames it against the domain toggle action. An agent can distinguish it from entities_turn_on/entities_turn_off 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?

Explicit 'Use when: the desired end state is unknown or irrelevant, only flip it' plus 'Not for: a deterministic on/off — use entities_turn_on/entities_turn_off'. Both the when and the alternative are 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.

entities_turn_offTurn off an entityA
Idempotent

Turn off an entity by calling its domain's turn_off action.

Calls <domain>.turn_off with {"entity_id": entity_id} over HTTP.

Use when: turning off any controllable entity regardless of domain. Not for: flipping state without knowing the target — use entities_toggle. Returns: the list of changed states from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull entity ID to turn off, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds value beyond them by disclosing the call mechanism (domain turn_off action over HTTP) and the return shape (list of changed states). It does not discuss auth requirements or error behavior, but the annotation profile is rich, so this is a solid addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then mechanism, then usage boundaries and return value in short, scannable sections. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter state-change tool with rich annotations and an output schema, the description covers what it does, how to choose it, and what it returns. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a single documented parameter, so the schema carries the meaning. The description restates entity_id but adds no format, constraint, or domain-specific detail beyond what the schema provides. Baseline 3 is correct here.

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 ('turn off an entity') and explains the underlying mechanism (calls <domain>.turn_off with entity_id over HTTP). It also distinguishes itself from the sibling entities_toggle, so an agent can select it 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?

Explicit 'Use when' and 'Not for' clauses, naming the alternative (entities_toggle) and the condition that selects it (not knowing the target state). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_turn_onTurn on an entityA
Idempotent

Turn on an entity, optionally with light-only color and brightness options.

Calls <domain>.turn_on for the entity's domain over HTTP. If any of brightness, color_temp, color_temp_kelvin or rgb_color is given for a non-light entity, the service is not called at all — HA's own turn_on for other domains (e.g. switch) rejects unknown fields, so this checks the domain first. A given color_temp (mireds) is converted to Kelvin (round(1_000_000 / mireds)) since HA's light.turn_on no longer accepts mireds.

Use when: turning on any entity, with or without light color/brightness. Not for: a dedicated light color/brightness change without an on/off intent — use services_set_light_color; an input_boolean-only helper — helpers_set_input_boolean is the domain-specific equivalent. Returns: the list of changed states from Home Assistant, or an error dict. Errors: {"error": "..."} when a light-only option is given for a non-light domain.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull entity ID to turn on, e.g. 'light.kitchen'.
rgb_colorNoLight RGB color as [r, g, b], each 0-255, light-only option.
brightnessNoLight brightness, 0-255. Light-only; passing it for a non-light entity returns an error.
color_tempNoDeprecated mired color temperature, light-only. Converted to Kelvin before the call; prefer color_temp_kelvin.
color_temp_kelvinNoLight color temperature in Kelvin, light-only option.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the safety profile (readOnly=false, idempotent=true, destructive=false), and the description adds substantial context beyond them: the domain-first check, that the service is not called at all when light-only options hit a non-light entity, and the mireds-to-Kelvin conversion formula. This is exactly the kind of behavioral disclosure the dimension rewards.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then organized into rationale, use/not-for, returns, and errors. Slightly long, but each section carries distinct information; the conversion and domain-check details earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, yet it briefly notes the changed-states return and, importantly, the error shape. Combined with the domain-routing and conversion behavior, an agent has everything needed to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning beyond the schema: the domain-gating interaction (light-only fields reject non-light entities) and the color_temp conversion rule with its formula. It clarifies how parameters interact rather than just restating them.

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 ('Turn on an entity') and immediately scopes it with the light-only option qualifier. It names the underlying service call and distinguishes itself from siblings like services_set_light_color and helpers_set_input_boolean.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' sections name two concrete alternatives (services_set_light_color for color-only changes, helpers_set_input_boolean for input_boolean) with the conditions that select them. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

entities_update_entity_nameRename entity in registryA
DestructiveIdempotent

Rename an entity in the entity registry, replacing its current display name.

Calls WS config/entity_registry/update with name=name; the previous name is not returned or preserved anywhere by this call.

Use when: correcting or customising an entity's display name. Not for: reassigning area, or enabling/disabling — use entities_assign_entity_to_area, entities_disable_entity, entities_enable_entity. Returns: the updated entity registry entry from Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew display name to store in the entity registry, replacing the current one.
entity_idYesFull entity ID whose registry entry is renamed, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the agent knows this mutates and is repeatable. The description adds genuinely new context by disclosing the underlying WS endpoint and that the previous name is not returned or preserved, which is what makes this destructive. It stops short of describing auth or rate constraints, but coverage is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then structured Use when / Not for / Returns sections that make it scannable. The trailing 'Returns' line is mildly redundant given an output schema exists, but the format is otherwise efficient and every section 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 two-parameter mutation with full schema coverage, annotations covering the safety profile, and a separate output schema, the description supplies everything else an agent needs: scope, prerequisites, exclusions, and the loss of the prior name.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with only two well-documented parameters ('name' replacement semantics, 'entity_id' format example), so the schema carries the burden. The description's 'name=name' mapping adds little beyond that. 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 ('Rename an entity in the entity registry') and clarifies the scope is the display name only. An agent can distinguish it from siblings like entities_assign_entity_to_area or entities_disable_entity 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?

Explicit 'Use when' and 'Not for' sections, with the not-for cases routed to three named alternatives (entities_assign_entity_to_area, entities_disable_entity, entities_enable_entity). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_clean_mqttClean stale MQTT discovery entriesA
DestructiveIdempotent

Remove stale MQTT discovery entries for an ESPHome device, through HA's own MQTT integration.

Skips with zero network calls when the config has no mqtt: section. Otherwise resolves the node name (esphome.name, with substitutions:) and mqtt.discovery_prefix (default "homeassistant"). With a matching HA device, reads topics via WS mqtt/device/debug_info; otherwise briefly mqtt/subscribes to {prefix}/+/{node_name}/# and collects retained topics. Clears each topic via the mqtt.publish service, payload="" and retain=True -- MQTT's own way to delete a retained message. Never touches the ESPHome dashboard, which has no MQTT-topic-clearing command.

Use when: a removed/renamed device's old MQTT discovery entries still linger in Home Assistant. Not for: a config with no mqtt: section; firmware artifacts -- use esphome_compile_device. Returns: {"device", "action": "clean_mqtt", "skipped": True, "reason": ...} with no mqtt: section; otherwise {"success": <bool>, "method": "debug_info"|"wildcard_subscribe", "topics_cleared": [...], "count": <int>}, plus "errors": [...] on partial failures. Errors: {"error": "..."} for an invalid/missing device file, an unresolvable esphome.name/mqtt.discovery_prefix, or a WebSocket/ service-call failure. Limits: the wildcard fallback only collects for min(timeout, 3) seconds -- may miss a slow message or catch an unrelated topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'.
timeoutNoMaximum seconds to spend collecting retained MQTT discovery topics via a wildcard subscribe, e.g. 60. Only used when no matching HA device is found for this config's node name.
log_linesNoUnused by this tool's HA-mqtt-integration implementation (kept only for API/parameter-surface compatibility with earlier versions that spawned a dashboard process and returned trailing log lines), e.g. 200.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: describes zero-network-call skip when no `mqtt:` section exists, the resolution order for node name/discovery prefix, the two collection methods (WS debug_info vs wildcard subscribe), the retained-message deletion technique (publish empty payload retain=true), and the min(timeout,3)s fallback limit. Annotations already carry destructive/idempotent hints, but the description adds substantial operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and organized into clearly labeled sections (mechanism, Use when, Not for, Returns, Errors, Limits) so nothing is buried. It is on the long side, but each line conveys actionable detail rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with three parameters, an output schema, and full annotations, the description covers trigger conditions, execution paths, return shapes, error cases, and a known limitation. An agent has everything needed to decide and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds the non-obvious interaction that `timeout` is capped at min(timeout, 3) seconds and only applies to the wildcard fallback path. This meaningfully refines how the agent should set the parameter beyond the schema text.

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 ('Remove stale MQTT discovery entries for an ESPHome device') and the mechanism ('through HA's own MQTT integration'). It explicitly contrasts with the dashboard approach ('Never touches the ESPHome dashboard'), so an agent can distinguish it from sibling ESPHome tools 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Has explicit 'Use when' (removed/renamed device's stale discovery entries lingering) and 'Not for' clauses, including routing firmware work to `esphome_compile_device`. Alternatives and exclusions are fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_compile_deviceCompile ESPHome firmwareA
Idempotent

Compile ESPHome firmware for a device via the dashboard's /compile WebSocket route.

Blocks until the compile process exits (~60-180s). Compatible with the "ESPHome Device Builder" add-on (esphome/device-builder): /compile keeps the same spawn wire protocol as the old dashboard, now backed by its firmware job queue. A first build for a platform fetches PlatformIO packages from the internet before compiling. only_generate=True is rejected outright (see Errors) — Device Builder ignores that field and always runs a full build (ADR-0004 D4); it stays in the signature only for input-shape compatibility.

Use when: building firmware before esphome_upload_device. Not for: checking config validity only — use esphome_validate_config, which is faster and skips package downloads. Returns: {"device", "action": "compile", "exit_code", "success", "log_tail", "log_lines"}. Errors: {"error": "esphome_unsupported_option", ...} for only_generate=True (no I/O); {"error": "Invalid device name: ..."} for a path-escaping or blocked (e.g. 'secrets') name; otherwise one of esphome_dashboard.DashboardError's stable codes — esphome_unreachable/esphome_auth_required add diagnosis (see esphome_ping_dashboard); timeout adds log_tail/log_lines/ job_may_still_be_running (always True — do not retry, check esphome_get_addon_logs); esphome_command_failed adds dashboard_error_code/details. Limits: blocks up to timeout seconds; log_lines truncates the log.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'.
timeoutNoMaximum seconds to wait for the compile process to finish, e.g. 180.
log_linesNoNumber of trailing build-log lines to return, e.g. 200.
only_generateNoIf true, only generate the C++ source and skip the platform build. Set false for a full firmware build.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-readOnly, idempotent, non-destructive, open-world, but the description adds far more: blocking duration (~60-180s), first-build internet fetch for PlatformIO packages, a rejected option with no I/O, the ADR rationale for keeping only_generate in the signature, error taxonomy with stable codes, and explicit timeout guidance ('do not retry, check esphome_get_addon_logs'). This is rich context beyond structured fields, and no annotation is contradicted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and use-case routing, but the middle paragraphs pile on add-on compatibility, wire protocol, ADR-0004, and a full error-code enumeration. Much of this earns its place for a long-blocking tool, yet it is dense and partly better placed in tool docs, so it is adequate rather than tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shapes need not be described, though the description lists them anyway. For a mutating, open-world, long-blocking tool, it covers blocking behavior, prerequisites, the rejected option, and error codes with diagnostics, leaving only latency edge cases and auth details (delegated to esphome_ping_dashboard) unstated.

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 still adds meaning the schema lacks: only_generate=True is rejected outright and ignored by Device Builder (schema merely says it generates C++), and timeout blocks up to N seconds. It does not add syntax for name or log_lines 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 (compile) and resource (ESPHome firmware for a device) and names the underlying route. It explicitly distinguishes itself from sibling esphome_validate_config ('checking config validity only — use esphome_validate_config') and routes to it, so an agent can tell them apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('building firmware before esphome_upload_device') and when-not-to-use with a named alternative and its tradeoff ('esphome_validate_config, which is faster and skips package downloads'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_get_addon_infoGet ESPHome add-on statusA
Read-onlyIdempotent

Get the ESPHome add-on's status, version and update availability via the Supervisor API.

The add-on slug is discovered dynamically from the live /addons list (see _discover_esphome_slug) rather than guessed from a fixed set of hashes — the hash prefix in <hash>_esphome differs per add-on-store repository/installation.

Use when: checking whether the ESPHome add-on is installed, running, and up to date. Not for: log output — use esphome_get_addon_logs. Returns: {"slug", "name", "state", "version", "version_latest", "update_available", "ingress_url"}. Errors: {"error": "ESPHome add-on not found. Tried: [...]"} when no matching add-on slug responds, or when SUPERVISOR_TOKEN is unset.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: dynamic slug discovery from the live /addons list, and the specific failure modes (no matching slug, SUPERVISOR_TOKEN unset). It stops short of describing freshness/caching, which keeps it at 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the single-sentence purpose, then structures use/not-for/returns/errors, which is easy to scan. The parenthetical aside about per-repository hash prefixes is internal implementation detail that a caller does not strictly need, making it slightly over-length for a zero-parameter tool.

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-param read tool with full annotations and an output schema, the description still covers invocation-relevant context: it names the return keys, the error payload shape, and the auth prerequisite implied by SUPERVISOR_TOKEN. An agent has everything needed to call it and interpret failure.

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, which is the baseline-4 case; there is nothing in the schema for the description to clarify. The description correctly implies no inputs are required by describing slug resolution as an internal discovery step.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the ESPHome add-on's status, version and update availability') and immediately distinguishes scope by naming the adjacent capabilities it does not cover. An agent can separate it from esphome_get_addon_logs and supervisor_get_addon 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?

Provides an explicit 'Use when:' clause covering the three states it answers (installed, running, up to date) and an explicit 'Not for:' clause routing log requests to esphome_get_addon_logs. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_get_addon_logsGet ESPHome add-on log outputA
Read-onlyIdempotent

Get the ESPHome add-on's recent log output.

Fetches raw text logs via the Supervisor API and returns the last lines lines. Shows compile errors, OTA status and device connection events. The add-on slug is discovered dynamically — see esphome_get_addon_info.

Use when: diagnosing why esphome_compile_device/esphome_upload_device/ esphome_validate_config failed, or checking recent device activity. Not for: any other add-on's logs — use supervisor_get_addon_logs with its slug instead. Returns: {"slug": ..., "logs": "<text>", "total_lines": <int>}. Errors: {"error": "ESPHome add-on not found. Tried: [...]"} when no matching slug responds; {"error": "HTTP <status>"} for a non-404 HTTP error; {"error": str(e)} for any other failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNoNumber of trailing log lines to return, e.g. 150.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds real behavioral context beyond them: the slug is discovered dynamically, what the logs surface (compile errors, OTA status, connection events), and two concrete error shapes. It does not mention pagination/truncation limits of the raw text, 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?

Front-loaded with the purpose, then cleanly sectioned into Use when / Not for / Returns / Errors. Every sentence carries decision-relevant information; nothing is filler despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-parameter log fetch, all an agent needs is present: purpose, selection rule, the sibling alternative, and error behavior. The return-value details are redundant given the output schema but harmless.

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 `lines` parameter, so the schema already documents it. The description restates the semantics ('returns the last `lines` lines'), which confirms but does not materially extend 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 ('Get the ESPHome add-on's recent log output') and names exactly which sibling it is not ('any other add-on's logs — use supervisor_get_addon_logs'). An agent can distinguish it from that near-identical sibling 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?

Explicit 'Use when' ties it to diagnosing failed esphome_compile_device / esphome_upload_device / esphome_validate_config calls, and an explicit 'Not for' routes other add-on logs to supervisor_get_addon_logs with its slug. Both the positive and negative conditions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_get_configGet ESPHome device YAML configA
Read-onlyIdempotent

Read one ESPHome device's YAML config from /config/esphome/.

Resolves name to <name>.yaml under _ESPHOME_DIR, rejecting path separators/leading dots/paths that escape that directory.

Use when: inspecting a device's current configuration before editing it with esphome_write_config or one of the esphome_lvgl_* editors. Not for: a device's HA entities — use esphome_get_device_entities. Returns: {"name": <filename>, "content": <yaml text>}. Errors: {"error": "Invalid device name: ..."} for a path-escaping name; {"error": "Not found: ...", "esphome_dir": ...} when the file doesn't exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. Discover names with `esphome_list_devices`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely new behavioral detail beyond them: name-to-filename resolution, path-separator/leading-dot/escape rejection, and the exact error shapes for invalid names and missing files. This security-relevant sanitization is not inferable from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then layers usage, exclusions, return shape, and errors in clearly delimited blocks. Every line earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't expand on returns, yet it still documents error contracts (which the output schema likely doesn't cover) and names the correct sibling for the entity use case. Complete for a single-param read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents the `name` parameter including the optional '.yaml' suffix. The description reinforces the resolution rule and filesystem base directory, adding modest value (the rejection semantics) but largely aligning with what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'Read one ESPHome device's YAML config from `/config/esphome/`'. This is clearly distinguishable from siblings like esphome_get_device_entities and esphome_list_devices, which the description explicitly contrasts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when:' (inspecting config before editing with esphome_write_config or esphome_lvgl_* editors) and 'Not for:' (HA entities — route to esphome_get_device_entities). The alternative and its selection condition are named outright, 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.

esphome_get_device_entitiesGet an ESPHome device's HA entitiesA
Read-onlyIdempotent

Get every HA entity belonging to one ESPHome device.

Slugifies device_name (lowercase, spaces/dashes to underscores) and, if a device-registry entry's own slugified name matches, matches entities by that device's device_id (precise: immune to one device's slug being a substring of another's). Falls back to matching entity registry entries whose platform is "esphome" and whose entity_id contains the slug when no device-registry entry matches (or that lookup fails).

Use when: inspecting a specific device's exposed entities and their current state. Not for: the device list itself — use esphome_list_devices. Returns: list of {"entity_id", "name", "domain", "state", "attributes", "disabled"} dicts. Errors: [{"error": str(e)}] when reading the entity registry or states raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesDevice name as used in HA, e.g. 'Kitchen Sensor' or 'kitchen_sensor' (matched case-insensitively against a slugified form).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description goes further by disclosing the slugification and device-registry matching strategy, the substring-fallback behavior, and the error return shape — substantive traits beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then matching mechanics, then Use/Not-for/Returns/Errors blocks. It is on the longer side, and the Returns line is partly redundant with the output schema, but each section carries distinct information and nothing is wasted.

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 an output schema, the description covers purpose, selection guidance, matching semantics, and error behavior — more than enough to invoke correctly. Slight over-explanation of return values is the only redundancy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema documents case-insensitive slug matching, so baseline is 3. The description adds the actual slugify rule (lowercase, spaces/dashes to underscores) and the precise-vs-fallback matching consequences, giving real meaning beyond the parameter 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 (get) and resource (HA entities belonging to one ESPHome device), and explicitly distinguishes itself from the sibling esphome_list_devices. An agent can tell exactly what it returns 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?

Provides explicit 'Use when' (inspecting a specific device's exposed entities and current state) and 'Not for' (the device list itself — use esphome_list_devices) sections, naming the alternative directly. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_list_devicesList ESPHome devicesA
Read-onlyIdempotent

List ESPHome devices from YAML configs, the HA device registry and online status.

Combines <name>.yaml files under /config/esphome/ with matching HA device-registry entries (identified via ESPHome config entries, identifiers domain, or manufacturer as a fallback). A device's connected status comes from its own entities' states (entity registry device_id match): any entity in a state other than "unavailable" means connected, since ESPHome entities share one per-config-entry availability flag (homeassistant/components/esphome/entity.py) — not from a binary_sensor.*_api_connection_status entity, which is not guaranteed to exist.

Use when: getting an overview of every ESPHome device, whether or not it currently has a matching HA device. Not for: one device's entities — use esphome_get_device_entities. Returns: {"yaml_configs": [...], "ha_devices": [...], "online": <int>, "offline": <int>}, where each ha_devices entry's connected is True, False, or None (no known entities/states yet). Errors: ha_devices becomes [{"error": str(e)}] if reading the HA device registry raises; entity-registry/config-entry/state lookups are silently skipped (treated as empty) on error instead of failing the whole call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only/idempotent/non-destructive, and the description adds substantial extra context: how 'connected' is derived (any non-'unavailable' entity state, not a specific binary_sensor), the fallback matching logic, and precise error semantics (registry failure yields an error entry while other lookups are silently skipped). This is rich behavioral disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then cleanly sectioned into Use when / Not for / Returns / Errors. It is somewhat long and cites internal source files (entity.py) that an agent arguably does not need, but each section 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?

Even with an output schema present, the description explains the return shape, the tri-state `connected` value, and error behavior — everything needed to call and interpret the tool correctly. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema is trivially complete and the baseline of 4 applies. The description correctly adds no parameter discussion because there are none to explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource (list ESPHome devices) and enumerates the three data sources it merges (YAML configs, HA device registry, online status). It also explicitly names the sibling it is not for, so an agent can distinguish it from esphome_get_device_entities 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?

Uses explicit 'Use when' and 'Not for' framing, including the concrete alternative (`esphome_get_device_entities`) and the condition that selects it. Nothing about when to reach for this tool versus siblings is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_lvgl_add_widgetAdd an LVGL widget to a pageA
Destructive

Add an LVGL widget to a page on an ESPHome device and save the whole config.

Appends {widget_type: properties} to the page's widgets list, then rewrites the entire device YAML file via yaml.dump — comments, blank lines and YAML anchors/aliases elsewhere in the file are NOT preserved. A <file>.bak copy of the previous content is written first so the original formatting can be recovered manually. Lambda callbacks (on_click, on_value_changed) are not supported here — add them manually via esphome_get_config/esphome_write_config. Calling this twice with the same arguments adds two separate widgets.

Use when: adding one widget to an existing LVGL page without hand-editing the full YAML. Not for: removing a widget — use esphome_lvgl_delete_widget; not for lambda callbacks or other structural edits — use esphome_get_config/esphome_write_config. After adding, run esphome_lvgl_validate/esphome_validate_config, then esphome_compile_device and esphome_upload_device to deploy. Returns: {"success": True, "name": ..., "bytes": ..., "backup": ..., "added": <widget_type>, "to_page": <page_id>} on success. Errors: {"error": "..."} when the file can't be found/parsed, when there is no lvgl: section, when page_id doesn't exist, or when the save itself fails ({"success": False, "error": ...}). Limits: rewrites and overwrites the whole file; only the pre-write content is recoverable, via the .bak copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesLVGL page ID to add the widget to, from `esphome_lvgl_get_pages`.
propertiesYesWidget properties, e.g. {'id': ..., 'x': ..., 'y': ..., 'width': ..., 'height': ..., 'text': ..., 'value': ..., 'styles': ...}.
device_nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_display'.
widget_typeYesLVGL widget type, e.g. 'label', 'button', 'slider', 'arc', 'switch', 'spinbox', 'img', 'line', 'meter'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructive/non-idempotent annotations: discloses that the entire YAML is rewritten via yaml.dump with comments, blank lines and anchors lost, that a .bak backup is written first, that lambda callbacks are unsupported, and that a second identical call appends a second widget. This is exactly the operational detail an agent needs before a destructive write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The critical data-loss warning is front-loaded in the first paragraph, followed by clean Use-when/Not-for/Returns/Errors/Limits blocks. It is longer than strictly necessary, but every block carries distinct information and no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the full lifecycle for a destructive mutation: side effects, recovery path, unsupported cases, the exact success payload, the error conditions, and the recommended validate/compile/upload follow-up. An agent can call this correctly without consulting any other source.

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 schema already documents all four parameters including property examples and device_name suffix behavior. The description adds only the `{widget_type: properties}` append shape, which is marginal given the schema's coverage — 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+resource ('Add an LVGL widget to a page on an ESPHome device') and states the persistence side effect ('save the whole config'). It distinguishes itself from sibling esphome_lvgl_delete_widget by naming it directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' / 'Not for' sections name the alternatives for each excluded case (esphome_lvgl_delete_widget, esphome_get_config/esphome_write_config) and even chain the follow-up validation and deploy tools. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_lvgl_delete_widgetDelete an LVGL widget from a pageA
DestructiveIdempotent

Delete an LVGL widget by id from a page on an ESPHome device and save the whole config.

Removes the matching widget from the page's widgets list, then rewrites the entire device YAML file via yaml.dump — comments, blank lines and YAML anchors/aliases elsewhere in the file are NOT preserved. A <file>.bak copy of the previous content is written first so the original formatting can be recovered manually.

Use when: removing one widget from an existing LVGL page. Not for: adding a widget — use esphome_lvgl_add_widget. After deleting, run esphome_lvgl_validate/esphome_validate_config, then esphome_compile_device and esphome_upload_device to deploy. Returns: {"success": True, "name": ..., "bytes": ..., "backup": ..., "deleted": <widget_id>, "from_page": <page_id>} on success. Errors: {"error": "..."} when the file can't be found/parsed, when there is no lvgl: section, when page_id/widget_id doesn't exist, or when the save itself fails ({"success": False, "error": ...}). Limits: rewrites and overwrites the whole file; only the pre-write content is recoverable, via the .bak copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesLVGL page ID the widget belongs to, from `esphome_lvgl_get_pages`.
widget_idYesWidget `id` to delete, from `esphome_lvgl_get_page_widgets`.
device_nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_display'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so safety is partly covered. The description goes well beyond them: it discloses that the whole YAML file is rewritten via yaml.dump, that comments, blank lines and anchors/aliases are NOT preserved, that a .bak copy is written first, and that only pre-write content is recoverable manually. That is exactly the operational risk an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and structured with clear labels (Use when / Not for / Returns / Errors / Limits), so it scans well. It is somewhat long, and the Returns section partially duplicates the existing output schema, which is minor redundancy rather than wasted space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive file-mutating tool, the description covers purpose, routing, side effects, backup/recovery, error modes and the deployment follow-up path. An output schema exists so return-value detail is optional, and nothing an agent needs to call this safely 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 three parameters are already documented in the schema (including where page_id and widget_id come from). The description repeats widget_id/page_id context in its error section but adds no new syntax, format or constraint information. Baseline 3 applies 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 (Delete), resource (LVGL widget by id), and scope (from a page on an ESPHome device, then save the whole config). It explicitly names the sibling it is not (esphome_lvgl_add_widget), so an agent can distinguish 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?

Has an explicit 'Use when: removing one widget from an existing LVGL page' and 'Not for: adding a widget — use esphome_lvgl_add_widget', plus the correct follow-up sequence (validate -> compile -> upload). This is when/when-not/alternatives in full.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_lvgl_get_pagesGet an ESPHome device's LVGL pagesA
Read-onlyIdempotent

Get the LVGL pages configured on an ESPHome device.

Parses the device's YAML and reads the lvgl: section's pages and displays[0].default_page.

Use when: getting page IDs, background colors and widget counts before drilling into one page with esphome_lvgl_get_page_widgets. Not for: the widgets on one specific page — use esphome_lvgl_get_page_widgets. Returns: {"device": ..., "default_page": ..., "pages": [{"id", "bg_color", "widget_count"}, ...]}. Errors: {"error": "..."} when the file can't be found/parsed, or when there is no lvgl: section in the device config.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_display'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readonly/idempotent/non-destructive, so the safety profile is covered. The description goes beyond that by disclosing the mechanism (parses the device YAML) and the error contract (`{"error": ...}` when the file is missing/unparseable or there is no `lvgl:` section), which is genuinely useful behavior an agent cannot infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with a clear lead sentence, then labeled Use when / Not for / Returns / Errors sections that are easy to scan. The Returns block largely restates the existing output schema, a minor redundancy, but every other 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 single-param read tool with an output schema and full annotations, the description covers purpose, routing, mechanism, return shape and error cases. An agent has everything needed to select and invoke 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?

There is a single `device_name` parameter with 100% schema description coverage (including the '.yaml'-optional note), so the schema already does the heavy lifting. The description adds no parameter-level meaning beyond what the schema states, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the LVGL pages configured on an ESPHome device') and further specifies exactly what it reads: the `lvgl:` section's `pages` and `displays[0].default_page`. It clearly distinguishes itself from the sibling `esphome_lvgl_get_page_widgets`, so an agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' names the concrete preconditions (getting page IDs, background colors, widget counts before drilling in) and 'Not for' names the exact alternative (`esphome_lvgl_get_page_widgets`) with the condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_lvgl_get_page_widgetsGet widgets on an ESPHome LVGL pageA
Read-onlyIdempotent

Get all LVGL widgets on one page of an ESPHome device.

Parses the device's YAML and summarises each widget on the requested page: type, ID, position and key properties. Lambda callback values are shown as the literal string <lambda> (opaque here — use esphome_get_config to see the full source).

Use when: inspecting an existing page's widget tree before adding or removing a widget. Not for: page-level metadata only — use esphome_lvgl_get_pages. Returns: {"device", "page", "widget_count", "widgets": [...]}. Errors: {"error": "..."} when the file can't be found/parsed, when there is no lvgl: section, or when page_id doesn't exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesLVGL page ID to inspect, from `esphome_lvgl_get_pages`.
device_nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_display'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description goes further: it discloses that the tool parses YAML, that lambda values are collapsed to the literal '<lambda>', the exact return shape, and the three error conditions. This is substantial context beyond 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?

Front-loaded purpose followed by clearly labeled Use when / Not for / Returns / Errors blocks. Every sentence carries distinct information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still summarizes the return payload and enumerates error cases, and identifies the prerequisite tool for page_id. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented with format hints ('.yaml' suffix, page_id from esphome_lvgl_get_pages). The description adds only the implicit note that a missing page_id produces an error, which is marginal over the schema baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope ('Get all LVGL widgets on one page of an ESPHome device') and distinguishes itself from siblings like esphome_lvgl_get_pages and esphome_lvgl_add_widget. 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (inspecting a page's widget tree before adding/removing) and 'Not for' naming the alternative tool esphome_lvgl_get_pages for page-level metadata. Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_lvgl_get_stylesGet an ESPHome device's LVGL stylesA
Read-onlyIdempotent

Get the LVGL theme and style definitions from an ESPHome device config.

Parses the device's YAML and reads the lvgl: section's theme, style_definitions and gradients keys.

Use when: checking what theme/styles a device's LVGL UI currently uses before referencing a style name in a new widget. Not for: page/widget content — use esphome_lvgl_get_pages/ esphome_lvgl_get_page_widgets. Returns: {"device", "theme", "style_definitions", "gradients"}. Errors: {"error": "..."} when the file can't be found/parsed, or when there is no lvgl: section in the device config.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_display'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real context beyond that: it parses YAML, reads specific lvgl section keys, defines the return object shape, and specifies error conditions ('file can't be found/parsed' or 'no lvgl: section'). It stops short of deeper traits like caching or file-size limits, but the added disclosure is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by clean labeled sections (Use when / Not for / Returns / Errors). Every sentence carries distinct information with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation was not strictly required, yet the description conveniently enumerates the keys. Combined with explicit error handling and sibling routing, an agent has everything needed to call this 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?

With a single parameter at 100% schema description coverage, the schema already documents device_name including the '.yaml' suffix handling. The description adds no additional parameter 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+resource ('Get the LVGL theme and style definitions from an ESPHome device config') and names the exact keys it reads (theme, style_definitions, gradients). It explicitly distinguishes itself from sibling tools esphome_lvgl_get_pages and esphome_lvgl_get_page_widgets, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' (checking what theme/styles a device's LVGL UI uses before referencing a style name in a new widget) and 'Not for' clauses, naming the two sibling alternatives to use instead. Both the condition and the exclusions are spelled out rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_lvgl_list_devicesList ESPHome devices with LVGL supportA
Read-onlyIdempotent

List ESPHome devices whose YAML config has an lvgl: section.

Parses every device YAML under /config/esphome/ (tolerating parse errors by skipping that device) and reports the ones with LVGL display support.

Use when: finding which devices have an LVGL screen before inspecting or editing its pages/widgets. Not for: page detail on one device — use esphome_lvgl_get_pages. Returns: list of {"device", "pages": <count>, "page_ids": [...]}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, non-destructive), so the description's bonus value is the implementation detail: it parses every YAML under /config/esphome/ and tolerates parse errors by skipping bad devices. That is a non-obvious behavior worth disclosing. It doesn't discuss performance or caching, but the key behavioral quirk (error tolerance) is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the definition, then separated into 'Use when', 'Not for', and 'Returns' sections. Every sentence carries information and there is no redundancy with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage routing, behavioral quirk, and even summarizes the return shape as {device, pages, page_ids}. With an output schema present, the return summary is a bonus rather than a requirement, and nothing an agent needs to call this no-arg tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4. The description correctly adds nothing misleading about parameters and instead documents the fact that the scan covers all devices under /config/esphome/ with no filtering option, which is the relevant fact for a no-arg tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List ESPHome devices whose YAML config has an lvgl: section'), and distinguishes itself from the sibling esphome_list_devices by narrowing to LVGL-enabled configs. An agent can identify the tool's purpose 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?

Explicit 'Use when' clause gives the trigger condition (finding devices before inspecting/editing pages) and a 'Not for' clause names the alternative (esphome_lvgl_get_pages) with the condition that selects it. Both sides of the routing decision are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_lvgl_validateValidate an ESPHome device's LVGL structureA
Read-onlyIdempotent

Validate an ESPHome device's LVGL structure client-side, without the dashboard.

Checks for duplicate page/widget IDs and default_page references that don't exist among the parsed pages. This is a structural check only — it does not validate widget properties or ESPHome component correctness.

Use when: a quick local pre-check after editing LVGL pages/widgets, before a full esphome_validate_config or esphome_compile_device. Not for: full component/property validation — use esphome_validate_config. Returns: {"device", "valid": <bool>, "pages": <count>, "widgets": <count>, "issues": [...]}. Errors: {"error": "...", "valid": False} when the file can't be found/parsed, or when there is no lvgl: section in the device config.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_display'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real behavioral context the annotations don't: what it checks structurally, that it deliberately does NOT validate widget properties or component correctness, and its error behavior when the file is missing or has no lvgl: section.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose, then uses labeled Use when / Not for / Returns / Errors blocks that are easy to scan. It is somewhat long and the Returns/Errors content partly duplicates the output schema, but each sentence still 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?

Given an output schema exists, return values need not be described, yet the description also documents them plus error shapes and the no-lvgl-section edge case. Nothing an agent needs to call this 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?

Only one parameter (device_name) with 100% schema description coverage, including the '.yaml'-optional format. The description adds nothing beyond what the schema already documents, 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 ('Validate an ESPHome device's LVGL structure client-side') and immediately scopes what is actually checked (duplicate page/widget IDs, dangling default_page references). It explicitly distinguishes itself from esphome_validate_config, so an agent can separate it from the list/compile/validate siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit routing: 'Use when: a quick local pre-check after editing LVGL pages/widgets, before a full esphome_validate_config or esphome_compile_device' and 'Not for: full component/property validation — use esphome_validate_config.' Both the when and the when-not/alternative are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_ping_dashboardCheck ESPHome dashboard reachabilityA
Read-onlyIdempotent

Check whether the ESPHome Device Builder dashboard responds.

Resolves where the dashboard is (esphome_dashboard.DashboardLocator, ADR-0004 D2) — an explicit ESPHOME_DASHBOARD_URL (mode "explicit") if set, else in add-on mode the installed ESPHome add-on's own site-ingress port, always dialled at http://127.0.0.1:<ingress_port> (mode "supervisor_ingress") — then calls GET /ping there. A False reachable here does not necessarily mean the add-on itself is down; see diagnosis/advice for what to check next.

Use when: diagnosing a connection failure from esphome_compile_device/esphome_validate_config/esphome_upload_device, or confirming the dashboard is reachable before calling one of them. Not for: add-on version/update status — use esphome_get_addon_info. Returns: {"reachable": True, "url": ..., "mode": "explicit"| "supervisor_ingress", "result": {...}} (the raw /ping JSON) on success. Errors: never raises. On failure: {"reachable": False, "error": <stable code>, "message": ...} — "esphome_not_configured" (neither ESPHOME_DASHBOARD_URL nor the add-on's own info could be resolved) has no url/mode; "esphome_unreachable"/"esphome_auth_required" add url, mode and a diagnosis: {"mode", "dashboard_url", "slug", "addon_state", "ingress", "ingress_port", "advice"} built from the ESPHome add-on's own GET /addons/<slug>/info (slug/addon_state/ ingress/ingress_port are None outside supervisor_ingress mode).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavioral context beyond them: URL resolution modes, the fact that reachable=False does not imply the add-on is down, the 'never raises' contract, stable error codes, and the shape of the diagnosis object. This is richer than the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the check, then uses labeled Returns/Errors/Use when/Not for blocks that are easy to scan. It is dense and slightly over-specified for an agent (internal class/ADR references like `esphome_dashboard.DashboardLocator`, ADR-0004 D2), which cost it the top mark.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what it does, when to use it, resolution behavior, success shape, and a full error taxonomy including which codes carry url/mode/diagnosis. With an output schema present, return values need not be restated, yet the description still supplies enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline is 4. There is nothing to document, and the description correctly spends no space on parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (check) and resource (ESPHome Device Builder dashboard reachability), and distinguishes itself from the nearest sibling by name: 'Not for: add-on version/update status — use esphome_get_addon_info'. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' (diagnosing failures from esphome_compile_device/esphome_validate_config/esphome_upload_device, or pre-flight before calling them) and 'Not for' (add-on info, routed to a named alternative). Both inclusion and exclusion conditions are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_upload_deviceFlash firmware to an ESPHome deviceA
Destructive

Flash previously compiled firmware to an ESPHome device via the dashboard's /upload WebSocket route.

Requires the device to already be built (esphome_compile_device) and, for OTA, reachable with a matching OTA password. Without confirm=True returns a confirmation prompt and performs no I/O (ADR-0004 D5) — this overwrites the running firmware with no automatic rollback if broken. Same "ESPHome Device Builder" (esphome/device-builder) spawn wire protocol as esphome_compile_device, on /upload.

Use when: deploying a compiled build to the device, once confirmed. Not for: building the firmware — use esphome_compile_device first. Returns: {"device", "action": "upload", "exit_code", "success", "log_tail", "log_lines"} on completion. Errors: {"error": "confirmation_required", "message", "action"} when confirm is false (checked first, before name is resolved); {"error": "Invalid device name: ..."} for a path-escaping or blocked (e.g. 'secrets') name; otherwise one of esphome_dashboard.DashboardError's stable codes — esphome_unreachable/esphome_auth_required add diagnosis (see esphome_ping_dashboard); timeout adds log_tail/log_lines/ job_may_still_be_running (always True — do not retry, check esphome_get_addon_logs); esphome_command_failed adds dashboard_error_code/details. Limits: requires confirm=True; blocks up to timeout seconds; no rollback if the upload succeeds but firmware is broken.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'.
portNo'OTA' for wireless flash (default) or a serial device path, e.g. '/dev/ttyUSB0', for a wired flash.OTA
confirmNoSet true to actually flash the device. False (default) performs no action and instead returns a confirmation prompt; `name` is not resolved or touched in that case.
timeoutNoMaximum seconds to wait for the upload to finish, e.g. 240.
log_linesNoNumber of trailing upload-log lines to return, e.g. 200.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, but the description adds substantial context beyond them: the confirm=True gate (ADR-0004 D5), that confirm=False performs no I/O and does not resolve `name`, that the operation blocks up to `timeout` seconds, and that there is no automatic rollback if the firmware is broken. It also enumerates stable error codes and their extra fields, which is exactly the kind of operational detail annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, it is tightly structured with front-loaded purpose followed by labeled Use when / Not for / Returns / Errors / Limits blocks. Every section carries actionable content — prerequisites, destructive warning, error taxonomy — with no filler sentences.

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, non-idempotent flashing tool this covers everything an agent needs: prerequisite build step, confirmation gate, transport choice, blocking behavior, and a complete error-code map including the 'do not retry' timeout guidance. Return values are duplicated from the output schema, but that is a minor redundancy rather than a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all five parameters and the baseline is 3. The description adds real value beyond that by disclosing evaluation order ('confirm is checked first, before `name` is resolved') and that `name` is untouched when confirm is false, which the schema does not state.

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 (flash/upload), the resource (previously compiled firmware to an ESPHome device), and the exact transport route. It explicitly distinguishes itself from the sibling esphome_compile_device ('Requires the device to already be built'), so an agent can route correctly 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?

Contains explicit 'Use when: deploying a compiled build to the device, once confirmed' and 'Not for: building the firmware — use `esphome_compile_device` first', plus the OTA-password prerequisite. This is a textbook when/when-not/alternative statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_validate_configValidate ESPHome device configA
Read-onlyIdempotent

Validate an ESPHome device's YAML config without compiling it.

Uses the devices/validate command on Device Builder's newer multiplexed /ws protocol (github.com/esphome/device-builder, docs/API.md) — the legacy /validate route from the old ESPHome dashboard no longer exists. Unlike esphome_compile_device, this never builds firmware or fetches PlatformIO packages. If the dashboard needs a username/password, this fails fast instead of hanging (no credential wiring exists here).

Use when: checking a config's validity quickly, e.g. before esphome_compile_device. Not for: a full firmware build — use esphome_compile_device; not for LVGL-only structural checks — use esphome_lvgl_validate, which runs without the dashboard. Returns: {"device", "action": "validate", "success", "result", "log_tail", "log_lines"}. Errors: {"error": "Invalid device name: ..."} for a path-escaping or blocked (e.g. 'secrets') name; otherwise one of esphome_dashboard.DashboardError's stable codes — esphome_auth_required (credentials this tool cannot supply) and esphome_unreachable add diagnosis (see esphome_ping_dashboard); timeout adds log_tail/log_lines/job_may_still_be_running (always False — validation enqueues no job); esphome_command_failed adds dashboard_error_code/details.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'.
timeoutNoMaximum seconds to wait for the validation result, e.g. 60.
log_linesNoNumber of trailing log lines to return, e.g. 200.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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/idempotentHint/non-destructive, and the description adds beyond them: it fails fast on missing credentials rather than hanging, performs no PlatformIO fetch, enqueues no job (so 'job_may_still_be_running' is always False), and documents the exact error codes and their extra diagnostic fields. This is unusually rich disclosure; only the timeout semantics could be stated more concretely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then protocol detail, then Use when/Not for, returns, and errors — logically ordered. Slightly over-long: the repo path, docs/API.md reference, and legacy-route history are incidental to invocation, though they do support transparency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still summarizes the return envelope and enumerates the stable error codes with their extra fields, so an agent has everything needed to call the tool and interpret failure modes. Nothing material is missing for a 3-parameter read-only validator.

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 would be 3, but the description adds real meaning for 'name' beyond the schema: it explains that path-escaping or blocked names (e.g. 'secrets') produce an 'Invalid device name' error, constraining acceptable values in a way the schema does not.

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 ('Validate an ESPHome device's YAML config') and immediately scopes it ('without compiling it'), distinguishing it from the obvious sibling by noting it never builds firmware. Names the multiplexed protocol and legacy route, so an agent knows exactly which operation this performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause (quick validity check, e.g. before esphome_compile_device) and explicit 'Not for' clause routing to esphome_compile_device for full builds and esphome_lvgl_validate for LVGL-only structural checks. Alternative-selection conditions are fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esphome_write_configWrite ESPHome device YAML configA
DestructiveIdempotent

Write a full ESPHome device YAML config to /config/esphome/, overwriting any existing file.

Validates YAML syntax first (HA custom tags !secret/!include/ !lambda/!extend/!remove pass through unchanged) and only writes if that succeeds. This replaces the whole file — there is no merge with the previous content and, unlike git_safe_write_with_checkpoint, no checkpoint commit is made first, so the previous content is not recoverable through this tool.

Use when: saving a complete device config you already have in full, e.g. after fetching and editing it with esphome_get_config. Not for: a git-checkpointed config write — use git_safe_write_with_checkpoint; for a generic /config file write use files_write_config_file; for a single LVGL widget edit use esphome_lvgl_add_widget/esphome_lvgl_delete_widget instead of hand-editing the whole YAML text. Returns: {"success": True, "name": ..., "path": ..., "bytes": ...} on success; a remote external_components:/packages: source (github:///gitlab:///codeberg:///git:///http(s)://, or a dict with a url) adds "warning" (review before esphome_compile_device, which fetches and runs it) and "external_sources": [...]; a config with none, or only local (type: local, bare-path, !include) ones, gets neither key. Errors: {"success": False, "error": "YAML validation failed: ..."} for invalid YAML; {"success": False, "error": "Invalid device name: ..."} for a path-escaping name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDevice name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. If the file already exists, its entire content is replaced.
contentYesFull YAML document to write, replacing the file's current content.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, yet the description adds real context beyond them: validation-before-write, HA custom tag pass-through, no checkpoint so prior content is unrecoverable, plus remote external_components/packages sources triggering a warning and error shapes. This is unusually rich disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the operation and then segments behavior, usage, returns and errors in labeled blocks, so it is scannable. It is longer than strictly necessary for a 2-parameter tool, but nearly every sentence earns its place given the destructive semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the destructive consequence and irrecoverability, validation gating, the warning path for remote sources, and both error variants. An output schema exists, yet the return-shape detail adds value rather than duplicating boilerplate.

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, but the description adds semantics beyond the schema: HA custom tags (!secret/!include/!lambda) pass through unchanged in content, and a path-escaping name yields a specific 'Invalid device name' error. Minor value-add over the schema, not a full replacement.

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 (write full ESPHome device YAML config to /config/esphome/) and immediately names the scope constraint (overwrites existing file, no merge). It explicitly differentiates from siblings git_safe_write_with_checkpoint, files_write_config_file, and the LVGL widget tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Uses an explicit 'Use when' / 'Not for' structure naming four concrete alternatives and the conditions that select them (git-checkpointed write, generic /config write, single LVGL widget edit). No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_append_to_config_fileAppend to a config fileA

Append text to the end of an existing config file.

Resolves relative_path via _safe_path, reads its current text, appends content after a newline, YAML-checks the combined text only when validate_yaml=True and the extension is .yaml/.yml, then writes the combined text back.

Use when: adding raw YAML/JSON/txt lines that already match the file's existing list indentation. Not for: automations — use automations_set_automation_config, which edits by config id instead of a raw text append. Returns: dict {"success": True, "path": ...} on success, or {"success": False, "error": ...} when validate_yaml=True and the combined text fails to parse. Errors: raises FileNotFoundError when the file does not exist, and raises PermissionError (from _safe_path) for a path outside the config directory, a disallowed extension, or secrets.yaml/.storage. Limits: validate_yaml defaults to False, so an invalid append is written without warning unless explicitly checked.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesText appended after a newline to the file's existing content.
relative_pathYesPath to an existing file relative to the HA config directory (HA_CONFIG_PATH), e.g. 'automations.yaml'. Must use an allowed extension (.yaml/.yml/.json/.txt) and not touch secrets.yaml or .storage/.
validate_yamlNoIf True and the extension is .yaml/.yml, the combined text (existing content plus the appended `content`) is YAML-checked before writing. Defaults to False, so an invalid append is written without warning unless set True.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, but the description goes well beyond them: it discloses the exact internal flow, that validate_yaml only triggers for .yaml/.yml extensions and defaults to False (silent invalid writes), the error types raised, and that secrets.yaml/.storage and disallowed extensions are blocked by _safe_path. This is unusually rich behavioral disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with the core action first, then behavior, use/not-for, returns, errors, and limits in clearly labeled blocks. It is somewhat dense (e.g. the _safe_path implementation detail) but every section is informative and no sentence is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutation tool with an output schema, the description covers the mechanics, validation scope, return shape, error conditions, and an important default that could cause silent data issues. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: relative_path is resolved via _safe_path, content is appended after a newline, and validate_yaml's conditionality on the extension and its False default are spelled out. Marginal but genuine added value over the parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Append text to the end of an existing config file') and immediately differentiates from siblings by naming `automations_set_automation_config` as the alternative for automations. An agent can distinguish it from files_write_config_file or automations_set_automation_config 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?

Explicit 'Use when' (adding raw YAML/JSON/txt lines matching existing indentation) and 'Not for' (automations, with the correct alternative named and the reason — edits by config id vs raw text append). This is textbook when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_delete_config_fileDelete a config fileA
DestructiveIdempotent

Permanently delete one config file under /config after an explicit confirmation.

Without confirm=True returns a confirmation prompt and does not resolve or touch relative_path at all. With confirm=True, resolves relative_path via _safe_path and calls Path.unlink(); there is no backup or trash in this tool — deletion is immediate and irreversible from here alone.

Use when: removing a YAML/JSON/txt file that HA no longer needs, once that removal is confirmed. Not for: keeping the ability to undo — commit the config to git first (git_git_commit_all) or write through git_safe_write_with_checkpoint so a rollback stays possible. Returns: dict {"success": True, "deleted": ...} when confirmed, otherwise a confirmation prompt. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false; raises FileNotFoundError when the file does not exist, and raises PermissionError (from _safe_path) for a path outside the config directory, a disallowed extension, or secrets.yaml/.storage. Limits: requires confirm=True; the deletion runs immediately with no undo once confirmed.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet true to actually delete the file. False (default) performs no action and instead returns a confirmation prompt; `relative_path` is not resolved or touched in that case.
relative_pathYesPath to the file relative to the HA config directory (HA_CONFIG_PATH) to delete, e.g. 'packages/old.yaml'. Must use an allowed extension (.yaml/.yml/.json/.txt) and not touch secrets.yaml or .storage/.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, but the description goes well beyond them: it explains the two-phase confirm gate, that relative_path is not even resolved when confirm is false, that there is no backup or trash, and the specific error behaviors (_safe_path PermissionError for secrets.yaml/.storage, FileNotFoundError). This is richer behavioral context than the annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well structured with labeled sections (Use when / Not for / Returns / Errors / Limits) and front-loaded with the destructive framing. Slightly long since it restates return and error details that partly duplicate annotations and output schema, but every section is purposeful.

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, confirm-gated tool, the description covers confirmation semantics, irreversibility, alternatives, error conditions, and limits. With an output schema present it need not explain returns, yet adds a useful one-line summary; 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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the concrete error payload ({"error": "confirmation_required", ...}) returned when confirm is false, and the side effect that relative_path is untouched in that path. That is genuine added semantic value over the field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: 'Permanently delete one config file under /config'. It also distinguishes itself from sibling tools that offer undo (git_git_commit_all, git_safe_write_with_checkpoint), so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' sections, with named alternatives for the rollback case. The confirmation prerequisite and the irreversible nature are stated as gating conditions, which is exactly what a destructive tool needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_list_config_filesList config filesA
Read-onlyIdempotent

Recursively list config files with allowed extensions under /config.

Resolves subdirectory (default the config root) under HA_CONFIG_PATH, recurses with Path.rglob('*'), and returns config-root-relative paths for files whose extension is in .yaml/.yml/.json/.txt, skipping secrets.yaml and .storage/.

Use when: discovering which config files exist before reading or writing one. Not for: reading a file's content once you have its path — use files_read_config_file. Returns: list[str] of config-root-relative file paths. Limits: output can be large for the /config root; a subdirectory that resolves (after following symlinks) outside /config returns an empty list instead of listing files outside the config directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
subdirectoryNoSubdirectory relative to the HA config root to list, e.g. 'packages'. Omit (default '') to list from the config root.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/destructive=false, but the description adds substantial context beyond them: extension filtering, the secrets.yaml and .storage/ skips, output size risk on the root, and symlink-escape behavior (empty list instead of listing outside /config). These are real operational traits, not restated hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded core behavior, then labeled Use when / Not for / Returns / Limits sections. Every line carries distinct information with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description still documents the return shape (list[str] of config-root-relative paths) in prose. Combined with coverage of filtering, exclusions, and limits, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; however the description adds meaning beyond the schema by explaining how subdirectory is resolved under HA_CONFIG_PATH (symlink following, empty-list fallback when it escapes /config) and confirming the config-root default. That is genuine semantic value over the schema's field description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (recursively list config files) plus precise scope: allowed extensions (.yaml/.yml/.json/.txt), explicit exclusions (secrets.yaml, .storage/), and root-relative output. An agent can distinguish it from files_read_config_file 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?

Explicit 'Use when' (discovering which config files exist before reading/writing) and 'Not for' routing the agent to the named alternative files_read_config_file with the precise condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_read_config_fileRead a config fileA
Read-onlyIdempotent

Read one config file's raw text from the HA config directory.

Resolves relative_path under HA_CONFIG_PATH via _safe_path (blocking paths outside the directory, disallowed extensions, and secrets.yaml/ .storage) and returns its content as a UTF-8 string; nothing is parsed or validated.

Use when: reading the current text of a YAML/JSON/txt file before editing it. Not for: checking whether that text is valid YAML — pass it to files_validate_yaml_content; discovering which files exist first — use files_list_config_files. Returns: str, the file's raw text (UTF-8). Errors: raises FileNotFoundError when the file does not exist, and raises PermissionError (from _safe_path) when relative_path resolves outside the config directory, uses a disallowed extension, or targets secrets.yaml/.storage.

ParametersJSON Schema
NameRequiredDescriptionDefault
relative_pathYesPath to the file relative to the HA config directory (HA_CONFIG_PATH), e.g. 'automations.yaml' or 'packages/lights.yaml'. Must resolve inside that directory, use an allowed extension (.yaml/.yml/.json/.txt), and not touch secrets.yaml or .storage/.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive, closed-world), yet the description adds substantive behavior beyond them: path resolution via _safe_path, blocking of out-of-directory paths, disallowed extensions, secrets.yaml/.storage, unparsed raw UTF-8 return, and the two specific exception types raised. This is well past what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly sectioned into Use when / Not for / Returns / Errors. Every sentence carries distinct information; nothing is redundant 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?

Despite an output schema existing, the description complements it with error semantics and the no-parsing guarantee. For a one-parameter read tool with annotations already covering safety, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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's description already covers relative-path semantics, allowed extensions, and the secrets/.storage restriction. The description largely restates those constraints rather than adding syntax or format detail, 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 ('Read one config file's raw text from the HA config directory') and explicitly distinguishes itself from siblings by naming files_validate_yaml_content and files_list_config_files. An agent can select it without opening any other 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?

Provides explicit 'Use when' (reading current text of a YAML/JSON/txt before editing) and 'Not for' with concrete alternatives for validation and discovery. The routing conditions are stated rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_validate_yaml_contentValidate YAML syntaxA
Read-onlyIdempotent

Check YAML syntax for a string without writing anything.

Parses content with a Home-Assistant-tolerant YAML loader that accepts !include*/!secret/!env_var/!input as opaque values, and reports only whether parsing succeeded and the top-level type.

Use when: checking a YAML snippet's syntax before calling files_write_config_file or automations_set_automation_config. Not for: full HA schema validation — use system_check_config; HA tags here are accepted but not resolved, so only syntax is checked, not HA schema validity. Returns: dict {"valid": True, "type": ...} (top-level type name only, not the parsed content) or {"valid": False, "error": ...}. Errors: returns {"valid": False, "error": str(e)} for a YAML parse error rather than raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesYAML text to check for syntax errors; nothing is written or read from disk.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive, but the description adds materially more: the loader tolerates !include*/!secret/!env_var/!input as opaque (not resolved), only syntax is checked, and parse failures return a dict rather than raising. That error-disclosure is precisely the kind of behavior an annotation cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then clearly labeled Use when / Not for / Returns / Errors blocks. Every line 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 single-parameter validation tool, the definition covers purpose, routing, tolerance rules, return shape and error behavior. Even though an output schema exists, the inline description of the valid/error dict adds helpful redundancy without bloating.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema coverage is 100%, so the schema already documents `content`. The description adds the useful nuance that HA tags inside the string are accepted as opaque values, but does not extend parameter meaning much beyond the schema, warranting the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (validate/check) plus resource (YAML syntax for a string) and immediately scopes it as non-writing. It contrasts sharply with siblings like files_write_config_file and system_check_config, so an agent can discriminate without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause names the exact downstream tools it precedes (files_write_config_file, automations_set_automation_config), and the 'Not for' clause routes full HA schema validation to system_check_config. When and when-not are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

files_write_config_fileOverwrite a config fileA
DestructiveIdempotent

Overwrite or create one config file under /config with new content.

Resolves relative_path via _safe_path, YAML-checks content first unless validate_yaml=False or the extension isn't .yaml/.yml, then creates parent directories as needed and writes the file, replacing any previous content at that path.

Use when: no rollback point for the previous content is needed. Not for: keeping a rollback point — use git_safe_write_with_checkpoint, which commits the pre-write state first; ESPHome device YAML — use esphome_write_config. Returns: dict {"success": True, "path": ...} on success, or {"success": False, "error": ...} when validate_yaml catches invalid YAML before writing. Errors: raises PermissionError (from _safe_path) for a path outside the config directory, a disallowed extension, or secrets.yaml/.storage; returns {"success": False, "error": ...} instead of raising for invalid YAML. Limits: no backup is taken — the previous content is permanently lost. Does not reload Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesFull text to write as the file's new content, replacing whatever was there before.
relative_pathYesPath to the file relative to the HA config directory (HA_CONFIG_PATH), e.g. 'automations.yaml' or 'packages/lights.yaml'. Parent directories are created if missing. Must use an allowed extension (.yaml/.yml/.json/.txt) and not touch secrets.yaml or .storage/.
validate_yamlNoIf True (default) and the extension is .yaml/.yml, `content` is parsed with a HA-tolerant YAML loader before writing; a parse error aborts the write. Set False to skip that check for non-YAML or intentionally unusual content.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructive/idempotent/not-readOnly, and the description adds substantial context beyond them: no backup means previous content is permanently lost, parent dirs are created, YAML validation aborts the write, PermissionError is raised for out-of-scope paths/extensions/secrets.yaml/.storage, and HA is not reloaded. This is exactly the mutation-risk information an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then organized into labeled sections (Resolves/Use when/Not for/Returns/Errors/Limits) that each carry distinct information. Slightly dense, but every line earns its place without wasteful repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive single-file write with a full output schema and rich annotations, the description covers the remaining gaps an agent needs: failure modes, exception vs. return-dict behavior, side effects (no reload, no backup), and alternative routing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents relative_path, content, and validate_yaml. The description reinforces the validate_yaml extension-condition flow but adds no syntax or format detail beyond what the structured schema provides; 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 (overwrite/create) and resource (one config file under /config), and explicitly names the siblings it must not be confused with (`git_safe_write_with_checkpoint`, `esphome_write_config`). An agent can select this over alternatives 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?

Provides explicit 'Use when' and 'Not for' sections, each routing to a named alternative with the selecting condition (no rollback needed vs. keeping a rollback point; ESPHome YAML handled elsewhere). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_git_checkout_branchSwitch config to an existing branchA
DestructiveIdempotent

Switch the HA config git repository to an existing branch.

Calls repo.git.checkout(branch_name), which replaces every tracked file under /config with that branch's committed version — the live configuration Home Assistant reads from changes as soon as this returns.

Use when: switching between prepared configurations that are tracked as branches. Not for: creating a branch that does not exist yet — use git_git_create_branch. Returns: dict {"status": "switched", "branch": ...}. Errors: raises an exception from gitpython when branch_name does not exist, or when uncommitted local changes would conflict with the target branch's files; raises RuntimeError (from _repo()) when no git repo exists. Limits: no confirm parameter; a conflicting uncommitted change blocks the checkout rather than being silently discarded (plain git behaviour), but a non-conflicting one carries over onto the new branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
branch_nameYesName of an existing git branch to switch the config repository to.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the destructive consequence ('replaces every tracked file under /config... the live configuration Home Assistant reads from changes as soon as this returns'), the error surface (gitpython exception on missing branch, RuntimeError when no repo exists), and the limit that a conflicting uncommitted change blocks the checkout while a non-conflicting one carries over. This is exactly the kind of context annotations alone 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?

Front-loaded with the core behavior, then cleanly sectioned into Use when / Not for / Returns / Errors / Limits. Every line carries information; the invocation detail reinforces rather than wastes space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single-param schema, full annotations, and the presence of an output schema, the description covers behavior, routing, return shape, error modes, and destructive limits. Nothing needed to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning about branch_name's constraints: it must exist, and a nonexistent value raises a gitpython exception. That error semantics around the single parameter is useful value beyond the schema's plain description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Switch the HA config git repository to an existing branch') and immediately names the sibling it is not ('use git_git_create_branch'). An agent can distinguish it from create_branch 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?

Explicit 'Use when: switching between prepared configurations tracked as branches' and 'Not for: creating a branch that does not exist yet — use git_git_create_branch'. This gives both the positive trigger and the named alternative, 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.

git_git_commit_allCommit all config changesA

Stage and commit every change in the HA config directory.

Calls _repo(), stages everything with git add -A, and commits message unless nothing is dirty, in which case no commit is made.

Use when: creating a checkpoint before a risky change to /config. Not for: writing one file and checkpointing it in a single call — use git_safe_write_with_checkpoint. Returns: dict {"status": "committed", "sha", "message"}, or {"status": "nothing_to_commit"} when the working tree is clean. Errors: raises RuntimeError (from _repo()) when gitpython is not installed or no git repo exists yet — run git_git_init_config first.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesCommit message describing this checkpoint or change.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false, but the description adds substantial behavioral context: it performs git add -A, skips the commit when nothing is dirty, returns specific status dictionaries, and raises RuntimeError when gitpython is missing or no repo exists. This goes well beyond structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then structured into when-to-use, when-not-to-use, return shape, and error conditions. Every sentence earns its place and directly helps an agent invoke the tool correctly.

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 single required parameter, annotations covering safety hints, a 100% schema description, and an existing output schema, the description still supplies the missing operational context: no-op behavior, prerequisite initialization, and specific error conditions. 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 description coverage is 100% and the single message parameter is already documented in the schema. The description repeats that message is committed but adds no syntax, format, or validation detail beyond the schema, 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 and resource: stage and commit every change in the HA config directory. It distinguishes itself from the closely related git_safe_write_with_checkpoint by explaining that sibling handles writing one file and checkpointing in a single call.

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 gives when to use it (creating a checkpoint before a risky change to /config) and when not to use it (writing one file and checkpointing in a single call, directing to git_safe_write_with_checkpoint). The prerequisite git_git_init_config is also called out for the error case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_git_create_branchCreate and switch to a new git branchA

Create a new git branch from the current commit and switch to it.

Calls repo.create_head(branch_name) then branch.checkout(); uncommitted changes carry over onto the new branch, and live /config files now follow it.

Use when: starting an isolated set of changes without touching the current branch's commit history. Not for: switching to a branch that already exists — use git_git_checkout_branch. Returns: dict {"status": "created_and_checked_out", "branch": ...}. Errors: raises an exception from gitpython when a branch named branch_name already exists; raises RuntimeError (from _repo()) when no git repo exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
branch_nameYesName of the new git branch to create, e.g. 'automation-refactor'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: uncommitted changes carry over, live /config files follow the branch, implementation calls repo.create_head then checkout, and error conditions are documented. Annotations cover the safety profile, but the description enriches behavioral understanding significantly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the main action and uses clear sections for usage, returns, and errors. The Returns line is redundant given an output schema exists, but overall the description is tight and earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage alternatives, side effects, return shape, and failure modes for a one-parameter mutation tool. With annotations and an output schema also present, 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% and the single parameter branch_name is fully described in the schema with an example. The description only references branch_name in error context, adding little semantic 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 (create) and resource (git branch) plus the side effect (switch to it). It explicitly excludes existing branches and names git_git_checkout_branch, so an agent can distinguish it from the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use ('starting an isolated set of changes...') and when-not ('switching to a branch that already exists'), naming the alternative tool. No inference is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_git_diffShow config git diffA
Read-onlyIdempotent

Show unstaged changes, or one commit's stat summary.

Without sha, calls repo.git.diff() for the unified diff of unstaged changes to tracked files in /config, excluding staged changes and untracked new files (see git_git_status). With sha, calls git show --stat <sha> for the commit header and per-file changed-line counts, not the actual patch.

Use when: reviewing what changed before committing, or summarising one past commit. Returns: str, the raw diff or stat text. Errors: raises RuntimeError (from _repo()) when no git repo exists; raises an exception from gitpython when sha does not resolve to a commit. Limits: output is raw, unformatted text and can be large for big diffs.

ParametersJSON Schema
NameRequiredDescriptionDefault
shaNoCommit SHA or ref to show a stat summary for, e.g. 'a1b2c3d'. Omit to show the unstaged diff instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them: it names the exact git operations invoked, states that staged/untracked changes are excluded, documents the two error paths (RuntimeError from _repo() with no repo, gitpython exception on an unresolvable sha), and warns output is raw and potentially large.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the two modes, then organizes the rest as labeled Use when / Returns / Errors / Limits blocks. It is somewhat long but every section carries non-redundant information, so nothing reads as filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only diff tool it is complete: mode selection, output nature, failure conditions, and size limits are all present. An output schema exists, so explaining return values was optional, yet the description still frames what text comes back usefully.

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% (sha is documented with an example), so the baseline is 3. The description adds genuine meaning on top by explaining the sha/no-sha branch in behavioral terms ('With sha... the commit header and per-file changed-line counts, not the actual patch'), which the schema field alone does not convey.

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 ('Show unstaged changes, or one commit's stat summary') and cleanly splits the two behavioral modes on the presence of `sha`. It also distinguishes itself from the sibling `git_git_status`, so an agent can pick correctly 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?

'Use when: reviewing what changed before committing, or summarising one past commit' gives clear situational context, and the untracked-files caveat routes the reader to `git_git_status`. It does not explicitly contrast against the overlapping `git_git_log` commit-history sibling, so it stops short of full when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_git_init_configInitialize the config git repositoryA
Idempotent

Initialize a git repository in the HA config directory.

Creates a git repo at HA_CONFIG_PATH via git.Repo.init unless a .git/ directory already exists there, writes a default .gitignore (secrets.yaml, .storage/, .db, home-assistant.log) when none exists, and makes one initial commit adding that .gitignore.

Use when: preparing /config before using any other git_* tool or git_safe_write_with_checkpoint for the first time. Returns: dict {"status": "initialized"|"already_initialized", "path": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds concrete behavioral detail beyond the annotations: the idempotency check on .git/, the specific .gitignore contents, and the initial commit side effect. It does not mention permissions or failure modes, but for a low-risk idempotent init tool this is solid added 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?

Front-loaded with a single-sentence purpose, followed by the exact actions, then a 'Use when' routing line, then the return shape. Every sentence earns its place with no redundancy; the structure is excellent for a zero-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the action, side effects, idempotency trigger, usage condition, and return dict, so an agent can invoke it correctly. An output schema exists, which slightly lightens the return-value burden, but the description still adds the status enum values usefully. Minor gaps remain around error conditions, but the tool's low complexity makes this near-complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter count is 0, so the baseline is 4. The description appropriately spends no space on nonexistent parameters and instead documents the implicit path (HA_CONFIG_PATH), which is the only 'parameter-like' variable relevant to invoking the tool correctly.

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 ('Initialize a git repository in the HA config directory') and explicitly describes the concrete actions taken (creates repo at HA_CONFIG_PATH, writes .gitignore, makes initial commit). Clear enough that an agent can distinguish this from git_git_status, git_git_commit_all, and other git_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when:' sentence explicitly names the prerequisite scenario — preparing /config before using any other git_* tool or git_safe_write_with_checkpoint for the first time. This directly routes the agent among siblings and states the trigger condition with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_git_list_branchesList config git branchesA
Read-onlyIdempotent

List all local branches in the HA config git repository.

Calls _repo() and returns every local branch name from repo.branches.

Returns: list[str] of local branch names. Errors: raises RuntimeError (from _repo()) when gitpython is not installed or no git repo exists yet — run git_git_init_config first.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive. The description goes beyond that by disclosing the return type (list[str]) and the failure mode (RuntimeError when gitpython is missing or no repo exists), which is genuinely useful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose well, but the middle sentence ('Calls `_repo()` and returns every local branch name from `repo.branches`') exposes internal implementation details that add little for an agent and duplicate the surrounding statements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description still names the return type and error conditions. For a zero-parameter read tool with rich annotations, this is essentially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to clarify, and it correctly adds no parameter noise.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (local branches in the HA config git repository), so the agent knows exactly what it retrieves. It does not explicitly contrast itself with siblings like git_git_create_branch or git_git_checkout_branch, but the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The error note routes the agent usefully: if no repo exists yet, run `git_git_init_config` first. That is clear context, though it is framed as error recovery rather than proactive when-to-use guidance against alternatives (e.g., git_git_log for history).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_git_logList config git commitsA
Read-onlyIdempotent

List recent commits in the HA config git repository.

Calls _repo() and returns up to limit commits from repo.iter_commits, most recent first, with short SHA, message, author name and ISO commit date.

Use when: reviewing recent config changes before a rollback or diff. Returns: list[dict] {"sha", "message", "author", "date"}. Errors: raises RuntimeError (from _repo()) when gitpython is not installed or no git repo exists yet — run git_git_init_config first. Limits: limit caps the number of commits returned; no further pagination is offered.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of commits to return, most recent first. Defaults to 20.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so safety is covered. The description adds valuable context beyond that: the exact return shape and the RuntimeError from `_repo()` when gitpython is missing or no repo exists, plus the absence of pagination. This is genuinely additive despite the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then organizes the rest into labeled sections (Use when, Returns, Errors, Limits) with no wasted sentences. Every line carries actionable information for the caller.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one simple optional parameter, an output schema already present, and rich annotations, the description is complete: it covers purpose, usage, return shape, errors, and limits. It could mention whether the repo is expected to be already initialized beyond the init hint, but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is well documented there. The description reinforces that `limit` caps the number of commits returned, adds the important constraint that no further pagination is offered, and confirms most-recent-first ordering, which is more than the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (recent commits in the HA config git repository), and the title plus internal call to `_repo()` distinguishes it from siblings like git_git_status or git_git_diff. An agent can immediately tell this reads commit history rather than changing files.

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 an explicit 'Use when' cue (reviewing recent config changes before a rollback or diff) and names the prerequisite tool (run `git_git_init_config` first). It doesn't name an alternative sibling for the same job, but the preconditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_git_rollback_fileRestore a config file from git historyA
DestructiveIdempotent

Restore one file to its state at a specific commit.

Refuses a relative_path that resolves outside /config (_resolve_within_config) before running anything, and without confirm=True returns a safety prompt instead of touching the file; with confirm=True it calls repo.git.checkout(sha, '--', relative_path), replacing the file's on-disk content with the version from sha and losing any uncommitted changes to that file.

Use when: undoing an accidental edit to a single file. Not for: resetting the whole config tree — use git_git_rollback_to_commit. Returns: dict {"status": "restored", "file", "to"} on success. Errors: returns {"error": "invalid_path"|"path_outside_config", ...} when relative_path escapes /config; returns {"error": "confirmation_required", ...} when confirm is not True; raises RuntimeError (from _repo()) when no git repo exists. Limits: requires confirm=True; uncommitted changes to the target file are permanently lost once it runs.

ParametersJSON Schema
NameRequiredDescriptionDefault
shaNoCommit SHA or ref to restore the file from. Defaults to 'HEAD', which discards uncommitted changes to this file.HEAD
confirmNoMust be True to actually restore the file. False (default) returns a safety prompt describing what would happen instead of touching anything.
relative_pathYesPath to the file relative to the HA config directory to restore, e.g. 'automations.yaml'. Must resolve inside /config after following symlinks.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already declare destructive/idempotent/not-read-only, the description adds substantive context beyond them: the confirm=True gate and safety-prompt default, permanent loss of uncommitted changes, the path-escape refusal, the returned error dicts, and the RuntimeError when no repo exists. This is a genuinely informative disclosure of side effects and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then cleanly sectioned into Use when / Not for / Returns / Errors / Limits. Slightly long due to internal implementation names (_resolve_within_config, repo.git.checkout), but each block earns its place and no sentence is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param destructive mutation tool with an output schema, the definition covers scope, safety gating, error surface, and limits. Since the return shape is documented by the schema, no gaps remain that an agent would need to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by spelling out that confirm=False returns a prompt rather than touching the file and that the default sha=HEAD discards uncommitted changes to that file. It reinforces rather than merely restates the parameter docs.

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 opening sentence gives a precise verb+resource+scope: 'Restore one file to its state at a specific commit.' It explicitly names the sibling it is not (git_git_rollback_to_commit) for whole-tree resets, so an agent can disambiguate 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?

Explicit 'Use when: undoing an accidental edit to a single file' and 'Not for: resetting the whole config tree — use git_git_rollback_to_commit.' Both the positive trigger and the excluded case with the named alternative are present, 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.

git_git_rollback_to_commitHard-reset config to a commitA
DestructiveIdempotent

Hard-reset the entire HA config directory to a previous commit.

Without confirm=True returns a safety prompt naming the current head commit; with confirm=True calls repo.git.reset('--hard', sha), which discards every commit and uncommitted change made after sha.

Use when: reverting /config entirely after a bad batch of changes, and the target commit is already known. Not for: restoring a single file — use git_git_rollback_file. Returns: dict {"status": "reset", "to": sha} on success. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is not True; raises RuntimeError (from _repo()) when no git repo exists. Limits: requires confirm=True. WARNING: every commit and uncommitted change made after sha is permanently and irreversibly lost.

ParametersJSON Schema
NameRequiredDescriptionDefault
shaYesCommit SHA or ref to hard-reset the entire config directory to.
confirmNoMust be True to actually perform the reset. False (default) returns a safety prompt naming the current HEAD instead of touching anything.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds substantial context: the confirmation gate, the exact reset command semantics, the irreversibility warning ('every commit and uncommitted change made after sha is permanently lost'), error keys, and the RuntimeError raised when no repo exists. This is far beyond what the structured fields convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action in the first sentence and uses labeled sections (Use when / Not for / Returns / Errors / Limits) so an agent can scan. Some redundancy between the prose warning and the Limits section, but every part is substantive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still documents success and error returns and the confirmation failure mode, so an agent has everything needed to call this destructive operation safely. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents both sha and confirm in similar terms. The description nonetheless clarifies the two-step workflow semantics of confirm (call without it to receive a HEAD-naming prompt, then re-call with True to act), which adds procedural meaning beyond the schema's field-level text.

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 ('Hard-reset the entire HA config directory to a previous commit') with precise scope. It immediately distinguishes itself from the sibling git_git_rollback_file by naming it as the wrong tool for single-file restoration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (reverting /config after a bad batch, target commit known) and 'Not for' (single file — route to git_git_rollback_file). Both the trigger condition and the alternative are 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.

git_git_statusShow config git statusA
Read-onlyIdempotent

Show git status of the HA config directory.

Calls _repo() for the /config git repo and returns the active branch, staged/modified/untracked file lists (repo.index.diff, repo.untracked_files) and an overall dirty flag.

Use when: checking what changed in /config before committing or writing a file. Returns: dict {"branch", "staged", "modified", "untracked", "is_dirty"}. Errors: raises RuntimeError (from _repo()) when gitpython is not installed or no git repo exists yet at HA_CONFIG_PATH — run git_git_init_config first.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and non-open-world, so the safety profile is covered. The description adds genuinely new behavior beyond that: the failure mode ('raises RuntimeError when gitpython is not installed or no git repo exists yet at HA_CONFIG_PATH') and the required prerequisite tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then Use when / Returns / Errors as scannable labels. Minor leakage of internal implementation detail ('calls _repo()', 'repo.index.diff', 'repo.untracked_files') that an agent invoking the tool does not need.

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?

Complete for a zero-parameter read-only status tool: trigger context, prerequisite, and error path are all stated, and an output schema already exists so return values need not be restated. The restatement of the return dict is mildly redundant rather than a completeness 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 and the input schema is a closed empty object, so there is no parameter semantics to convey; per the rubric this is a baseline 4. The description correctly adds no invented argument detail.

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 ('Show git status of the HA config directory') and immediately enumerates what it reports (branch, staged/modified/untracked, dirty flag), which cleanly separates it from git_git_diff and git_git_log. However, it never names a sibling it is not, so the differentiation is implicit rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when: checking what changed in /config before committing or writing a file' line gives a concrete trigger context. It also surfaces a prerequisite ('run git_git_init_config first'), but names no exclusion or alternative (e.g., when to prefer git_git_diff for line-level detail).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

git_safe_write_with_checkpointWrite a config file with a git checkpointA
Idempotent

Write one config file after committing a checkpoint of the prior state.

Stages and commits every uncommitted change under /config as a checkpoint commit (only when the tree is dirty), then calls the same write_config_file logic files_write_config_file uses for relative_path/content, and finally stages and commits that change with commit_message (or a default message) if the write succeeded.

Use when: overwriting a config file while keeping a git-based rollback point, unlike a plain overwrite. Not for: a write without a checkpoint — use files_write_config_file; ESPHome device YAML — use esphome_write_config. Returns: dict — the underlying write result ({"success": True, "path": ...} or {"success": False, "error": ...}), plus git_sha/ git_message when the new-content commit was made. Errors: raises RuntimeError (from _repo()) when no git repo exists — run git_git_init_config first; returns {"success": False, "error": ...} unchanged when YAML validation fails, in which case the checkpoint commit of the prior dirty state (if any) still happened, but no new-content commit is made. Limits: does not reload Home Assistant; same file-extension and location limits as files_write_config_file.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesFull text to write as the file's new content, replacing whatever was there before.
relative_pathYesPath to the file relative to the HA config directory to write, e.g. 'automations.yaml'. Same extension and location limits as `files_write_config_file`.
commit_messageNoCommit message for the new-content commit. Omit to use a default 'chore: update <relative_path>' message.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations: discloses the checkpoint-commit ordering, that the checkpoint only fires when the tree is dirty, the partial-failure semantics (checkpoint still made but no new-content commit on YAML validation failure), the RuntimeError when no git repo exists, and that HA is not reloaded. Annotations only cover readOnly/destructive/idempotent hints; this adds the real behavioral contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then structured Use/Not-for/Returns/Errors/Limits blocks. Slightly dense but every clause carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers sequencing, prerequisite (git init), partial-failure behavior, return shape, and limits — full coverage for a 3-param mutating tool even though an output schema exists.

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. Description adds the default-message behavior for `commit_message` ('chore: update <relative_path>') and clarifies that `relative_path`/`content` reuse `files_write_config_file` semantics, which is meaningful value beyond the schema text.

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 (write one config file) with the distinctive compound behavior (git checkpoint before/after). Explicitly distinguishes from siblings `files_write_config_file` (plain overwrite) and `esphome_write_config` (ESPHome YAML).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' sections naming the alternative tools for each exclusion case. The condition selecting this tool over a plain overwrite is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hacs_add_custom_repositoryAdd a custom HACS repositoryA
Idempotent

Register a custom repository with HACS so it becomes installable.

Calls the hacs/repositories/add WebSocket command (plural — distinct from the singular hacs/repository/* commands used elsewhere in this namespace) with url as its repository field and category. This only registers the repository — it does not install it.

Use when: a repository is not in HACS's default store and needs adding before it can be installed. Not for: installing an already-registered repository — use hacs_install_hacs_repository. Returns: HACS's add result, or {"error": ..., "hint": ...} if the WebSocket call fails. Errors: {"error": str(exception), "hint": "HACS may not be installed, or the WS command name has changed"} when url/category is invalid or the WebSocket command fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesFull URL of the repository to register with HACS, e.g. a GitHub repo URL.
categoryYesHACS category for the repository: integration, plugin, theme, template, appdaemon or python_script.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false, openWorldHint=true). Discloses the underlying WebSocket command name and its plural/singular distinction, the error shape with a hint field, and the specific failure modes. This is the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then organizes the rest into Use when / Not for / Returns / Errors, which is easy to scan. Slightly verbose with the parenthetical about plural vs singular commands, but every section 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?

Complete for a mutation tool with two required params, a 100%-covered schema, an output schema, and annotations. It covers return shape and error contract, which the output schema may not fully express, and gives clear routing to the install sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with per-field descriptions and an enumerated category list, so the schema does the heavy lifting. The description does add the mapping detail (url is passed as the repository field) but nothing else about format or the category values, which are already in the schema. 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 ('Register a custom repository with HACS'), clarifies scope ('only registers the repository — it does not install it'), and explicitly names the sibling it is NOT ('hacs_install_hacs_repository'). An agent can distinguish it from install/update/uninstall siblings 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?

Provides explicit 'Use when' (repository not in the default store) and 'Not for' (installing an already-registered repository — use hacs_install_hacs_repository) guidance, directly routing the agent to the correct alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hacs_get_hacs_repositoryGet HACS repository detailsA
Read-onlyIdempotent

Get details about a single HACS repository.

Calls the hacs/repository/info WebSocket command for the given repo_id, passed as its repository_id field.

Use when: checking one repository's installed/available version or metadata before installing or updating it. Not for: browsing many repositories at once — use hacs_list_hacs_repositories. Returns: HACS's raw repository-info dict, or {"error": ..., "hint": ...} if the WebSocket call fails. Errors: {"error": str(exception), "hint": "HACS may not be installed, or the WS command name has changed"} when repo_id is unknown or the WebSocket command fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
repo_idYesHACS repository id, e.g. from `hacs_list_hacs_repositories`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description goes further by naming the underlying `hacs/repository/info` WebSocket command and its `repository_id` field, and by specifying the exact error payload shape and its hint about HACS not being installed or the WS command name changing. That failure-mode disclosure is genuine added value beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose, then labeled Use/Not for/Returns/Errors blocks. Every sentence carries information; nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with an output schema, the description covers invocation mechanics, the alternative tool, the raw return shape, and the failure payload. 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.

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, but the description adds the non-obvious mapping that repo_id is sent as the `repository_id` field of the WebSocket command, which the schema does not convey. It also points to hacs_list_hacs_repositories as the source of valid ids.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get details about a single HACS repository') and immediately scopes it to one repository, which cleanly separates it from hacs_list_hacs_repositories. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause names the scenario (checking installed/available version or metadata before install/update) and an explicit 'Not for' clause routes bulk browsing to the named sibling hacs_list_hacs_repositories. Both when-to-use and the alternative are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hacs_install_hacs_repositoryInstall a HACS repositoryA
Idempotent

Install a HACS repository, optionally pinning a version.

Calls the hacs/repository/download WebSocket command (HACS has no separate "install" command — download installs when not yet installed, or re-downloads in place when it is), which fetches the repository's release from its source (typically GitHub) — an outbound fetch beyond this HA instance and its host.

Use when: adding a HACS-managed integration/plugin/theme that is already known to HACS (via the default store or hacs_add_custom_repository). Not for: adding a repository HACS does not know about yet — use hacs_add_custom_repository first. Returns: HACS's install result, or {"error": ..., "hint": ...} if the WebSocket call fails. Errors: {"error": str(exception), "hint": "HACS may not be installed, or the WS command name has changed"} when repo_id/version is invalid or the WebSocket command fails. Limits: downloads the release over the network; requires a restart of the affected component for most categories.

ParametersJSON Schema
NameRequiredDescriptionDefault
repo_idYesHACS repository id to install, e.g. from `hacs_list_hacs_repositories`.
versionNoSpecific version/tag to pin. Omit to install the latest available version.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and openWorldHint=true, but the description adds substantial extra context: it explains the WebSocket command used, that it re-downloads in place when already installed, that it performs an outbound fetch beyond the HA instance, and that a restart is typically required. It also documents error shapes and network limits, going well beyond what the annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action, then structured into 'Use when', 'Not for', 'Returns', 'Errors', and 'Limits' sections. Despite its technical depth, every sentence adds useful information, and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description needn't explain return values, but it still provides useful return and error shape details plus operational limits (network fetch, restart requirement). This is complete enough for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents both repo_id and version with examples and default behavior. The description only restates that a version can be pinned ('optionally pinning a version') without adding format or edge-case detail beyond the schema, so the baseline of 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 ('Install a HACS repository') and immediately distinguishes the underlying mechanism from a separate install command. The 'Use when' and 'Not for' sentences make the scope unambiguous and separate it from sibling tools like hacs_add_custom_repository.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool (adding a HACS-managed integration/plugin/theme already known to HACS) and when not to use it (adding an unknown repository, which requires hacs_add_custom_repository first). The alternative is named directly, leaving no inference needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hacs_list_hacs_critical_updatesList HACS pending upgradesA
Read-onlyIdempotent

List installed HACS repositories that have a pending upgrade available.

Calls the same hacs/repositories/list WebSocket command as hacs_list_hacs_repositories and filters to entries whose pending_upgrade flag is set, despite this tool's name — HACS itself has no separate "critical" severity here.

Use when: finding what needs hacs_update_hacs_repository without filtering the full list manually. Not for: every repository regardless of upgrade state — use hacs_list_hacs_repositories. Returns: list of repository dicts with pending_upgrade truthy, or {"error": ...} if the underlying call fails or returns an unexpected shape. Errors: {"error": str(exception), "hint": ...} when the WebSocket call fails; {"error": "Unexpected HACS response shape", "raw": result} when it succeeds but does not return a list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent/non-destructive, so the safety profile is covered; the description goes further by revealing the underlying `hacs/repositories/list` WebSocket command, the `pending_upgrade` filter that produces the result set, and the two distinct error shapes with their fields. That is exactly the kind of beyond-annotation context an agent needs to interpret failures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the effect, then segmented into Use when / Not for / Returns / Errors, which is easy to scan. It is somewhat long for a zero-parameter tool, and the Returns paragraph partially restates what the existing output schema already provides, but the error-shape detail earns its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only list tool with an output schema, the description supplies everything an agent needs: what it returns, the failure modes, and the correct sibling to use instead. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the input schema is empty, so there is nothing for the description to disambiguate — baseline 4 applies. No parameter semantics are needed or possible here.

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 installed HACS repositories that have a pending upgrade') and distinguishes itself from the near-identical sibling by naming `hacs_list_hacs_repositories`. It even resolves a naming trap: the tool is called 'critical_updates' but the description says HACS has no separate critical severity here, so the agent won't over-interpret the results.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause ties it to the follow-up action (`hacs_update_hacs_repository`), and an explicit 'Not for' clause names the alternative (`hacs_list_hacs_repositories`). Both the selecting condition and the exclusion 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.

hacs_list_hacs_repositoriesList HACS repositoriesA
Read-onlyIdempotent

List HACS repositories known to this Home Assistant instance.

Calls the hacs/repositories/list WebSocket command, optionally scoped to one category.

Use when: browsing or checking the state of repositories HACS already knows about (installed or not). Not for: repositories not yet added to HACS at all — use hacs_add_custom_repository first. Returns: list of HACS repository dicts as reported by HACS, or {"error": ..., "hint": ...} if the WebSocket call fails. Errors: {"error": str(exception), "hint": "HACS may not be installed, or the WS command name has changed"} when the WebSocket command fails, e.g. because HACS is not installed.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter to one HACS category: integration, plugin, theme, template, appdaemon or python_script. Omit to list every category.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint/openWorldHint, so safety is covered. The description adds real context beyond that: the WS command invoked, that results are as-reported-by-HACS, and the specific error payload plus hint when HACS is missing or the command name changed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and structured with Use when / Not for / Returns / Errors labels, which is easy to scan. Slightly verbose — the error payload is described twice (in Returns and again in Errors).

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 read-only list tool with full schema coverage, annotations, and an output schema, the description covers purpose, routing, and failure modes. An agent has everything needed to select and invoke 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% and the single `category` parameter is fully documented in the schema with its enum-like values and the omit-to-list-all behavior. The description's 'optionally scoped to one `category`' restates rather than extends the schema, 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 HACS repositories known to this Home Assistant instance') and names the underlying operation (`hacs/repositories/list`), which cleanly separates it from siblings like hacs_get_hacs_repository and hacs_add_custom_repository.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' (browsing/checking state of repositories HACS already knows about) and 'Not for' guidance pointing at the alternative `hacs_add_custom_repository` for repos not yet in HACS. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hacs_uninstall_hacs_repositoryUninstall a HACS repositoryA
DestructiveIdempotent

Uninstall a HACS repository.

Calls the hacs/repository/remove WebSocket command (HACS has no separate "uninstall" command), which removes the installed files for repo_id; the integration/plugin/theme stops working until reinstalled.

Use when: removing a HACS-managed component that is no longer needed. Not for: only skipping an update while keeping it installed — there is no such option exposed here. Returns: HACS's remove result, or {"error": ..., "hint": ...} if the WebSocket call fails. Errors: {"error": str(exception), "hint": "HACS may not be installed, or the WS command name has changed"} when repo_id is not installed or the WebSocket command fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
repo_idYesHACS repository id to uninstall, e.g. from `hacs_list_hacs_repositories`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, but the description adds substantive context beyond them: it removes installed files, the component stops working until reinstalled, the actual WS command name, and the exact error payload shape including a hint about HACS not being installed. That is genuine behavioral disclosure, not restatement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then clearly delimited Use when / Not for / Returns / Errors sections, each earning its place. Slightly verbose in restating the error object twice, but the structure is efficient and scannable.

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 an output schema already present, the description covers the mechanism, the side effects, the usage boundaries and the failure modes. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 repo_id parameter already carries a description pointing to hacs_list_hacs_repositories. The description reuses 'repo_id' but adds no format, sourcing, or validation detail beyond the schema, so it merits the baseline 3 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+resource ('Uninstall a HACS repository') and goes further by naming the underlying WebSocket command (`hacs/repository/remove`) that actually performs the work, so an agent understands the mechanism. That mechanism detail also cleanly distinguishes it from siblings like hacs_install_hacs_repository or hacs_update_hacs_repository.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (removing an unneeded HACS-managed component) and 'Not for' (skipping an update while keeping it installed, which is not exposed here). This directly answers when-to-use and when-not-to-use, including pre-empting a likely mistaken call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hacs_update_hacs_repositoryUpdate a HACS repositoryA
Destructive

Update an installed HACS repository to its latest available version.

HACS has no single "update" WebSocket command. This performs the three calls HACS's own frontend makes for an update: hacs/repository/refresh (re-fetches repository data; always returns {}, no version info), then hacs/repository/info (reads the resulting available_version), then hacs/repository/download with that version — which downloads and installs the newest release over the network; the previous version is only recoverable from a backup taken beforehand.

Use when: pending_upgrade is set for the repository (see hacs_list_hacs_critical_updates) and the new version should be applied. Not for: pinning a specific version instead of the latest — use hacs_install_hacs_repository with version set. Returns: HACS's download result, or {"error": ..., "hint": ...} if any of the three WebSocket calls fails. Errors: {"error": str(exception), "hint": "HACS may not be installed, or the WS command name has changed"} when the refresh or info call fails (the download call is then never made); {"error": "HACS did not report an available_version for this repository", "raw": ...} when info succeeds but has nothing to update to. Limits: downloads the new release over the network; no automatic rollback on failure; three sequential WebSocket round-trips instead of one.

ParametersJSON Schema
NameRequiredDescriptionDefault
repo_idYesHACS repository id to update, e.g. from `hacs_list_hacs_repositories`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive/not-idempotent/openWorld, and the description adds substantially beyond them: the three underlying WebSocket calls, that refresh returns no version info, that the new release is downloaded over the network, that the previous version is only recoverable from a prior backup, that there is no automatic rollback, and the exact error shapes and when the download step is skipped.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then structured with labeled Use when / Not for / Returns / Errors / Limits sections. Every section carries real information, though it is on the verbose end for a one-parameter tool.

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, multi-step, non-idempotent tool, the description covers prerequisites, alternatives, failure modes, side effects, and recovery constraints. Despite having both an output schema and annotations, it adds error-shape detail those structured fields do not carry.

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 there is a single parameter, so the schema already documents repo_id fully. The description adds no syntax, format, or source guidance beyond what the schema's description ('e.g. from hacs_list_hacs_repositories') already provides. Baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update an installed HACS repository to its latest available version') and immediately distinguishes itself from hacs_install_hacs_repository for version pinning. The agent knows exactly what this does without reading anything else.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: `pending_upgrade` is set ... (see hacs_list_hacs_critical_updates)' and 'Not for: pinning a specific version instead of the latest — use hacs_install_hacs_repository with `version` set.' Both the trigger condition and the alternative tool with its selecting argument are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_cancel_timerCancel a timer helperA
Idempotent

Cancel a running timer helper.

Calls timer.cancel with {"entity_id": entity_id} over HTTP.

Use when: stopping a timer before it finishes. Not for: starting one — use helpers_start_timer. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull timer entity ID to cancel, e.g. 'timer.laundry'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a state-changing, non-read-only, idempotent, non-destructive operation. The description adds useful implementation context by naming the underlying service call (`timer.cancel` over HTTP) and noting the return shape, though the output schema may cover returns. It does not contradict the annotations and adds value beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then implementation detail, then use/not-for guidance. Every sentence is short and earns its place with no redundant exposition.

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 timer cancellation tool with annotations and an output schema, the description provides everything needed: purpose, when to use it, when not to use it, the alternative, the underlying call, and the return behavior. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 required parameter `entity_id` is fully documented in the schema, including an example format. The description repeats the parameter in the HTTP call but adds no new semantic detail beyond what the schema already 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: 'Cancel a running timer helper.' It explicitly distinguishes this from its sibling by saying it is not for starting a timer and points to `helpers_start_timer`. An agent can identify the correct operation immediately.

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 gives explicit when-to-use guidance ('stopping a timer before it finishes') and when-not-to-use guidance ('Not for: starting one — use `helpers_start_timer`'). This directly routes the agent to the correct alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_increment_counterIncrement a counter helperA

Increment a counter helper by its configured step.

Calls counter.increment with {"entity_id": entity_id} over HTTP; repeating this call keeps increasing the counter's value.

Use when: counting up an event occurrence. Not for: setting the counter back to zero — use helpers_reset_counter. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull counter entity ID to increment, e.g. 'counter.visits'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds useful behavioral context beyond that: the increment uses a configured step, repeating the call keeps increasing the value, and it returns the list of changed states. It does not discuss permissions or failure modes, but it meaningfully extends the annotation profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action, then behavior, usage, exclusion, and return information. Every sentence is purposeful and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter helper with an output schema, the description covers purpose, behavior, when to use, the key alternative, and the return shape. Annotations cover safety, and the output schema handles return structure.

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 there is only one parameter, so the schema already documents entity_id fully. The description repeats the entity_id in an HTTP payload example but adds no new semantic detail such as format constraints or alternatives.

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 ('Increment a counter helper') and immediately distinguishes it from the reset sibling. An agent can identify the tool's function 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?

It gives explicit when-to-use guidance ('counting up an event occurrence') and an explicit exclusion with the correct alternative ('Not for: setting the counter back to zero — use helpers_reset_counter'). This directly resolves the most likely sibling ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_list_helpersList helper entitiesA
Read-onlyIdempotent

List every helper entity across all helper domains, with its current state.

Reads all states via ha.get_states() over HTTP and keeps only entities whose domain is one of input_boolean, input_number, input_text, input_select, input_datetime, input_button, counter, timer, schedule.

Use when: browsing which helpers exist and their current values. Not for: helpers of one specific domain filtered generically — use entities_list_entities with domain set. Returns: list of dicts with entity_id, state, attributes for each matching helper entity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the description only needs to add context — which it does by disclosing the implementation path (`ha.get_states()` over HTTP followed by domain filtering), implying a full state read rather than a targeted query. It doesn't mention pagination or payload size, which is the only remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action in the first sentence, then structured labels (Use when / Not for / Returns) that let an agent skim. No filler sentences; every clause carries routing or behavioral 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?

The description covers purpose, routing, and the shape of the return value for a zero-parameter read tool. Even though an output schema exists, the brief 'list of dicts with entity_id, state, attributes' note removes any ambiguity about what a helper record looks like.

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 — the baseline of 4 applies. The description's mention of filtering by domain reinforces that no filter input exists here, which is the one thing an agent might otherwise expect.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (helper entities) and enumerates exactly what counts as a helper by naming all eight domains. It explicitly differentiates itself from the sibling `entities_list_entities`, so an agent can choose between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit 'Use when: browsing which helpers exist and their current values' plus a 'Not for' clause naming the alternative (`entities_list_entities` with `domain` set) for the excluded case. Both the positive and negative routing conditions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_reload_helpersReload helper entities from configA
Idempotent

Reload every helper domain's entities from configuration in one call.

Calls <domain>.reload over HTTP for each of input_boolean, input_number, input_text, input_select, input_datetime, counter, timer in turn; a domain whose reload call raises is skipped but its error is captured rather than silently dropped.

Use when: applying YAML changes across several helper domains without restarting Home Assistant. Not for: reloading one specific domain — use services_reload_config. Returns: {"reloaded": [...], "failed": {domain: message}} — combined list of states changed across every domain that reloaded successfully, plus a per-domain map of the error message for every domain whose reload call raised. Errors: a domain's failure never raises out of this call; instead its exception message is recorded under failed[<domain>] so the caller can tell which domain, if any, did not reload.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavior beyond that: per-domain sequential HTTP calls, partial-failure semantics (a failing domain is skipped, its error captured, never raised), which is not derivable from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: the one-line summary comes first, then domain list, then Use when / Not for / Returns / Errors. Slightly verbose in restating the return shape and error map, which an output schema already covers, but every sentence carries actionable content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero params, an existing output schema, and annotations covering the safety profile, the description still fills the remaining gaps: scope (all helper domains), routing (vs services_reload_config), and the non-raising partial-failure contract. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero input parameters, so the baseline is 4. The description helpfully frames that the call is parameterless by enumerating the fixed set of domains it operates on, leaving nothing ambiguous about what the agent must supply.

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 (every helper domain's entities), and enumerates the exact domains covered. It is clearly distinguishable from the sibling services_reload_config (single domain) and helpers_list_helpers (read).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: applying YAML changes across several helper domains without restarting Home Assistant' and 'Not for: reloading one specific domain — use services_reload_config', naming the alternative and the condition that selects it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_reset_counterReset a counter helperA
Idempotent

Reset a counter helper's value back to 0.

Calls counter.reset with {"entity_id": entity_id} over HTTP; the counter is runtime UI state, not stored configuration.

Use when: clearing a counter back to its initial value. Not for: increasing it by one — use helpers_increment_counter. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull counter entity ID to reset, e.g. 'counter.visits'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare mutation (readOnlyHint=false), idempotence, and non-destructiveness, lowering the bar. The description adds genuine context beyond them: the underlying counter.reset call, the fact that the counter is runtime UI state rather than stored config, and that changed states are returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then structured Use when / Not for / Returns blocks that are easy to scan. The HTTP invocation detail is slightly extraneous for an agent but does not bloat the definition.

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 mutation tool with annotations covering the safety profile and an output schema covering return values, nothing needed to call it correctly is missing; the runtime-vs-config nuance is a useful bonus.

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 entity_id parameter is fully described there with an example ('counter.visits'). The description only echoes entity_id in the call payload, adding no new format or constraint detail, 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 (reset), resource (counter helper), and outcome (value back to 0). Explicitly distinguishes itself from the sibling helpers_increment_counter, so an agent can route 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?

Contains explicit 'Use when' and 'Not for' clauses, and names the correct alternative ('use helpers_increment_counter') for the excluded case. This is the full when/when-not/alternative pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_set_input_booleanSet an input_boolean valueA
Idempotent

Set an input_boolean helper to true or false.

Calls input_boolean.turn_on when value is true, otherwise input_boolean.turn_off, over HTTP.

Use when: setting a known boolean helper to a specific value. Not for: any other domain's on/off state — use entities_turn_on/ entities_turn_off, which work generically across domains including input_boolean. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesTarget boolean value; true calls turn_on, false calls turn_off.
entity_idYesFull input_boolean entity ID to set, e.g. 'input_boolean.guest_mode'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds real value beyond the annotations: it discloses the concrete service mapping (turn_on vs turn_off) and that the call goes over HTTP, letting the agent reason about idempotence and side effects. It stops short of discussing permission requirements or failure modes, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then structured into rationale, usage, exclusion and return sections. Slightly longer than strictly necessary (the HTTP transport note and the return sentence are marginal), but every line is readable and none are padding-level filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, idempotent setter with a full schema, rich annotations and an output schema, the description covers purpose, routing, mechanics and result. Nothing an agent needs in order to call this 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 both parameters carry descriptions, so the schema already does the work; the description's true/false-to-turn_on/turn_off mapping merely restates the 'value' schema text. Baseline 3 applies when the schema is fully self-documenting.

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 an input_boolean helper to true or false') and goes further by naming the exact underlying service calls invoked for each branch. An agent can distinguish this from helpers_set_input_number/text/select and from the generic entity controls 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?

Has explicit 'Use when' and 'Not for' clauses: it names the alternative tools (entities_turn_on/entities_turn_off) and the condition under which they should be preferred. This is exactly the when/when-not/alternatives guidance the dimension asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_set_input_datetimeSet an input_datetime valueA
Idempotent

Set an input_datetime helper's date, time or combined datetime value.

Calls input_datetime.set_datetime over HTTP with whichever of date, time, datetime are given; passing none of them still calls the service with only entity_id.

Use when: writing a specific date/time to an input_datetime helper. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate to set, formatted YYYY-MM-DD. Omit to leave the date unchanged.
timeNoTime to set, formatted HH:MM:SS. Omit to leave the time unchanged.
datetimeNoCombined date and time, formatted 'YYYY-MM-DD HH:MM:SS'. Takes precedence over date/time when given.
entity_idYesFull input_datetime entity ID to set, e.g. 'input_datetime.reminder'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readOnly, idempotent, non-destructive behavior; the description adds real value on top: it names the underlying `input_datetime.set_datetime` HTTP call and discloses the notable edge case that passing none of date/time/datetime still invokes the service with only entity_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by two tight supporting sentences. Slightly padded by a 'Returns:' line that duplicates information already available via the output schema, but otherwise no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% schema coverage, the description doesn't need to explain returns or parameter formats; it correctly focuses on the edge-case behavior and usage condition. Slight redundancy in the Returns line keeps it from a 5.

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 formats and the datetime-overrides-date/time precedence rule, so the description's 'whichever of date, time, datetime are given' adds no detail 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 ('Set an input_datetime helper's date, time or combined datetime value') and pins the target helper type, which cleanly separates it from the many sibling helpers_set_input_boolean/number/text/select tools without needing the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: writing a specific date/time to an input_datetime helper' gives the triggering condition. It doesn't name an alternative tool by name, but the sibling set is already partitioned by helper type, so 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.

helpers_set_input_numberSet an input_number valueA
Idempotent

Set an input_number helper's numeric value.

Calls input_number.set_value with {"entity_id": entity_id, "value": value} over HTTP.

Use when: writing a specific number to an input_number helper. Not for: a number/climate entity too — entities_set_value covers input_number identically plus the number and climate domains. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesTarget numeric value to write to the input_number.
entity_idYesFull input_number entity ID to set, e.g. 'input_number.target_temp'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, readOnlyHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing the underlying call (input_number.set_value over HTTP) and the return shape (list of states changed), though it omits permission/auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then usage routing, then return info. The HTTP payload restatement is mildly redundant given the schema but the overall block is tight and each line serves a routing or behavior purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be explained, and annotations carry the safety profile. The description adds the service-level behavior and the sibling alternative, leaving no gap an agent needs to fill before calling 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% and both parameters are documented in the schema with examples. The description merely echoes the payload structure ({entity_id, value}) without adding format or constraint details beyond what the schema provides, 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 (Set) and resource (input_number helper's numeric value), and explicitly distinguishes itself from the sibling entities_set_value, which covers the same domain plus number and climate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' clauses name the alternative tool and the condition that selects it (entities_set_value covers input_number identically plus number/climate domains), 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.

helpers_set_input_selectSelect an input_select optionA
Idempotent

Set an input_select helper to one of its configured options.

Calls input_select.select_option with {"entity_id": entity_id, "option": option} over HTTP.

Use when: setting a known input_select helper to a specific option. Not for: the generic select/input_select dispatch that also handles plain select entities — entities_select_option covers input_select identically plus the select domain. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionYesOption string to select; must match one of the input_select's configured options.
entity_idYesFull input_select entity ID to set, e.g. 'input_select.house_mode'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotent=true, destructive=false, and not readOnly, so safety is covered. The description adds value by revealing the concrete RPC (input_select.select_option with the entity_id/option payload) and that it returns the list of states changed, which is beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then use-when/not-for/returns in tight labeled clauses. The HTTP payload detail is slightly redundant given the schema but does not bloat the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param, idempotent helper setter, the description covers purpose, routing to the sibling, and return behavior, and an output schema exists so return values need no further explanation. Nothing required to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are self-documented, so the schema carries the load. The description only restates the payload mapping (entity_id, option) without adding format or constraint detail beyond the schema, matching the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: setting an input_select helper to one of its configured options. It also names the underlying service call and clearly delimits itself from the generic sibling, so an agent can distinguish it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' for setting a known input_select to a specific option, and 'Not for' pointing to entities_select_option for the generic select/input_select dispatch. Both the selection condition and the alternative are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_set_input_textSet an input_text valueA
Idempotent

Set an input_text helper's text value.

Calls input_text.set_value with {"entity_id": entity_id, "value": value} over HTTP.

Use when: writing a specific string to an input_text helper. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesTarget text value to write to the input_text.
entity_idYesFull input_text entity ID to set, e.g. 'input_text.last_visitor'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=false, covering the safety profile. The description supplements this by disclosing the underlying service call (input_text.set_value over HTTP), which is a modest but genuine addition; it adds no auth, rate-limit, or failure-mode 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 lines with zero filler: purpose first, implementation detail second, usage/return last. Every sentence carries information 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 two-parameter setter with an output schema present, the description is nearly sufficient; the explicit 'Returns' line is partly redundant given the output schema, leaving only minor gaps such as preconditions (entity must exist) or failure behavior.

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 both parameters (entity_id, value) are fully documented in the schema itself. The description adds no format, syntax, or validation detail beyond what the schema already provides, matching the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set an input_text helper's text value') and even names the underlying service call, which cleanly distinguishes it from siblings like helpers_set_input_boolean, helpers_set_input_number, and helpers_set_input_select.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when: writing a specific string to an input_text helper' line gives a triggering condition, but it essentially restates the purpose and offers no when-not guidance or named alternatives (e.g., entities_set_value for generic entities).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpers_start_timerStart a timer helperA
Idempotent

Start a timer helper, optionally overriding its duration.

Calls timer.start over HTTP with entity_id and duration when given; calling this on an already-running timer restarts it with the new duration.

Use when: starting a countdown, e.g. for a reminder or process timeout. Not for: stopping it early — use helpers_cancel_timer. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
durationNoDuration to run for, formatted HH:MM:SS or a plain number of seconds. Omit to reuse the timer's configured duration.
entity_idYesFull timer entity ID to start, e.g. 'timer.laundry'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds a genuine behavioral nuance not in the annotations: calling it on an already-running timer restarts it with the new duration. It also notes the underlying `timer.start` HTTP call, though the return behavior it mentions is already covered by the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then Use-when / Not-for / Returns structure that is easy to scan. The HTTP/`timer.start` implementation detail is slightly more than strictly needed but does not bloat the definition.

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 2-parameter timer tool with full schema coverage, an output schema, and annotations covering the safety profile, the description supplies the remaining useful context (override semantics, restart behavior, when to use it). 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 entity_id and duration (including format and the omit-to-reuse-configured-duration default) are already fully documented by the schema. The description confirms the two parameters are passed but adds no syntax or format detail beyond that, 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?

Specific verb+resource ("Start a timer helper, optionally overriding its duration") with the exact semantics of the override and restart behavior. It also names the sibling it is not (helpers_cancel_timer), so an agent can distinguish 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit "Use when: starting a countdown... Not for: stopping it early — use `helpers_cancel_timer`." Both the positive case and the exclusion with an alternative are given, 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.

history_get_error_logGet HA error logA
Read-onlyIdempotent

Fetch Home Assistant's error log as plain text.

Prefers the raw log file via GET /api/error_log. That view only exists when HA logs to a file — Supervisor installs ship with duplicate_log_file: false, so it 404s there, in which case the warning/error records held by the system_log integration are rendered into log-file-like text instead.

Use when: diagnosing recent warnings/errors across the whole instance. Not for: one entity's history or logbook — use history_get_state_history or history_get_logbook. Returns: plain-text log content, from either source. Errors: re-raises httpx.HTTPStatusError for any status other than 404 from /api/error_log.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description goes well beyond them, disclosing the data-source fallback (raw /api/error_log file when HA logs to file, otherwise system_log warning/error records rendered as log-like text), the 404 condition, and the error behavior (re-raises httpx.HTTPStatusError for any non-404 status).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then organized into labeled sections (Use when / Not for / Returns / Errors) so an agent can scan rather than parse. The fallback explanation is longer than average but every clause carries decision-relevant information, so no sentence 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-param read tool with an output schema, the description still supplies the fallback semantics and error contract that the schema cannot express. Nothing an agent needs to call it correctly or interpret a 404 vs. other failure 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, which is the baseline-4 case per the rubric. The description correctly implies no inputs are needed ('Fetch ... as plain text') and does not waste space documenting nonexistent 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 ('Fetch Home Assistant's error log as plain text') and explicitly distinguishes itself from the nearest siblings, naming history_get_state_history and history_get_logbook as the tools for one entity's history/logbook. An agent can route correctly 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?

Gives an explicit 'Use when' condition (diagnosing recent warnings/errors across the whole instance) and an explicit 'Not for' exclusion with the two alternative tools named. This is the when/when-not/alternatives pattern at full strength.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

history_get_ha_configGet HA configurationA
Read-onlyIdempotent

Get Home Assistant's current configuration.

Calls GET /api/config for location, unit system, HA version and loaded components.

Use when: version, location, unit system or the loaded-components list is needed. Not for: the equivalent WebSocket command — use ws_get_config; for subsystem health checks — use system_get_system_health. Returns: HA's raw config payload (latitude, longitude, unit_system, version, components, and related fields). Errors: raises httpx.HTTPStatusError if the HA API request fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already assert readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds the concrete HTTP endpoint, the raw return field list, and the specific error class (httpx.HTTPStatusError), which goes beyond the annotation surface. It does not mention rate limits or auth requirements, so it falls 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?

Front-loaded with the purpose, then endpoint, then when-to-use, when-not-to, returns, and errors in labeled blocks. Every sentence carries information and no filler is present.

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?

Although an output schema exists, the description still gives the agent the key return field names plus the failure mode (HTTPStatusError), and it pre-empts the obvious wrong-tool choices. For a no-param read tool in a crowded namespace, nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, which is the baseline-4 case. The description correctly implies the tool takes no input by describing the call as a parameterless GET and focusing entirely on returns and errors.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get Home Assistant's current configuration') and spells out exactly what that payload contains (location, unit system, HA version, loaded components). The API endpoint is named, making the underlying resource unambiguous even among dozens of config-related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' criteria (version/location/unit system/components needed) and 'Not for' exclusions that name two concrete alternatives, ws_get_config and system_get_system_health. This is exactly the routing guidance an agent needs to disambiguate among the ws_* and system_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

history_get_logbookGet logbook entriesA
Read-onlyIdempotent

Get human-readable logbook entries from the last N hours.

Calls GET /api/logbook/<start>, optionally filtered by entity_id, where start is now - hours.

Use when: a narrative of what happened (state changes, triggered automations) is more useful than raw state-history records. Not for: raw per-state timestamps and values for one entity — use history_get_state_history. Returns: HA's raw logbook payload — a list of {when, name, message, entity_id, ...}-shaped entries. Errors: raises httpx.HTTPStatusError if the HA API request fails. Limits: only as far back as the recorder integration has retained logbook data.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoHow many hours back from now to fetch, e.g. 24 for one day. Default 24.
entity_idNoFull entity ID to filter to, e.g. 'light.kitchen'. Omit to return logbook entries for every entity.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive), but the description adds genuinely non-structured behavior: the exact error type raised on API failure (`httpx.HTTPStatusError`) and the retention constraint that data only goes back as far as the recorder integration retains logbook data. It also sketches the returned payload shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then organizes supporting detail into tight 'Use when / Not for / Returns / Errors / Limits' fragments. Every line earns its place with no redundant prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still summarizes the payload shape, and it covers errors and retention limits on top of the two well-documented params. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both `hours` and `entity_id` are already fully documented with defaults and examples. The description restates the optional entity_id filter and the `start = now - hours` derivation but adds no syntax or format detail beyond the schema, 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 ('Get human-readable logbook entries'), gives the underlying API route, and explicitly distinguishes itself from the sibling `history_get_state_history`. 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' condition (narrative of state changes and triggered automations) and an explicit 'Not for' exclusion naming the alternative tool for raw per-state timestamps. This is a complete routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

history_get_state_historyGet entity state historyA
Read-onlyIdempotent

Get an entity's recorded state history over the last N hours.

Calls GET /api/history/period/<start> filtered to entity_id, where start is now - hours; returns whatever the recorder database has kept for that window.

Use when: seeing how one entity's state changed over time, e.g. a temperature trend. Not for: human-readable event descriptions — use history_get_logbook; this is raw, short-term state history, not the recorder's long-term pre-aggregated sum/mean/min/max values — use statistics_get_statistics for those, or statistics_list_statistic_ids to discover which entities have them. Returns: HA's raw history-period payload — a list of state-change records for the entity. Errors: raises httpx.HTTPStatusError if the HA API request fails. Limits: only as far back as the recorder integration has retained data for this entity.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoHow many hours back from now to fetch, e.g. 24 for one day. Default 24.
entity_idYesFull entity ID to fetch history for, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial extra context: the raw payload shape returned, the error behavior (raises httpx.HTTPStatusError), and a key limit that only retained recorder data is available. These are meaningful behavioral disclosures beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly sectioned into Use when / Not for / Returns / Errors / Limits. Every line carries actionable information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only history tool it covers purpose, routing, return shape, error mode, and retention limits. Even though an output schema exists, the extra notes about raw payload and retention make it fully self-sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented. The description adds the derived mapping ('start' is now - hours), which lightly clarifies the hours parameter, but does not add syntax or format 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+resource ('Get an entity's recorded state history over the last N hours') and pins the exact endpoint it calls, making scope unambiguous. It explicitly distinguishes itself from siblings like history_get_logbook and statistics_get_statistics.

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?

Has an explicit 'Use when' (tracking one entity's state over time), an explicit 'Not for' (human-readable events -> history_get_logbook), and names the right alternatives (statistics_get_statistics, statistics_list_statistic_ids) with the condition selecting each.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

history_get_system_infoCheck API livenessA
Read-onlyIdempotent

Get Home Assistant's raw API liveness message.

Calls GET /api/, which returns only a fixed liveness message (e.g. {"message": "API running."}) — no version or system data despite the tool's name.

Use when: a plain proof that the HTTP API is answering is enough. Not for: version/location/units/components — use history_get_ha_config; for subsystem health — use system_get_system_health; for Core/OS details — use supervisor_get_core_info or supervisor_get_host_info; for a simple reachable/unreachable boolean — use system_ping_ha. Returns: {"message": "API running."} (HA's fixed liveness payload). Errors: raises httpx.HTTPStatusError if the HA API request fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, non-destructive, and closed-world behavior, so the bar is lower. The description nonetheless discloses the exact endpoint called, the fixed return payload, and the specific error raised (httpx.HTTPStatusError), which adds real behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with a purpose line, endpoint detail, explicit Use/Not-for routing, and Returns/Errors sections. It is somewhat long for a zero-parameter liveness check, but every section carries useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only liveness tool, the description covers purpose, the exact endpoint, the return shape (noting the output schema notwithstanding), error behavior, and sibling disambiguation. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case. The description correctly implies no input is needed and focuses instead on the endpoint and return payload.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get Home Assistant's raw API liveness message') and immediately clarifies the scope, noting that despite the tool's name it returns only a fixed liveness message, not version or system data. It explicitly distinguishes itself from siblings like history_get_ha_config, system_get_system_health, supervisor_get_core_info, and system_ping_ha.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit 'Use when' and 'Not for' guidance, naming four alternative tools with the specific conditions that select them. The routing is unusually thorough and leaves little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_abort_config_flowAbort a config flowA
Idempotent

Abort a config flow that has not been finished yet.

Calls DELETE /api/config/config_entries/flow/{flow_id}. Nothing was persisted by an unfinished flow, so this discards only the flow's in-progress state, not a config entry.

Use when: cancelling a setup that was started by mistake or is no longer wanted. Not for: removing a completed integration — use integrations_remove_integration. Returns: HA's abort response for the flow. Errors: raises httpx.HTTPStatusError if flow_id is unknown or already finished.

ParametersJSON Schema
NameRequiredDescriptionDefault
flow_idYesFlow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false and idempotentHint=true, but the description explains WHY: nothing was persisted, only in-progress state is discarded. It also documents the underlying endpoint and the specific error raised (httpx.HTTPStatusError on unknown/already-finished flow_id), which is behavior not covered by any structured field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then cleanly segmented into Use when / Not for / Returns / Errors. Every line carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param mutation with an output schema and annotations, the description covers purpose, routing, side-effect scope, and error modes. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single flow_id parameter is already documented with its provenance (start_config_flow or list_flows_in_progress). The description adds no format, syntax, or semantics beyond the schema, 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 (abort) and resource (config flow) with the scope qualifier 'that has not been finished yet', and explicitly distinguishes itself from integrations_remove_integration. 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' (cancelling a setup started by mistake) and a 'Not for' that names the correct sibling alternative (integrations_remove_integration). Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_abort_options_flowAbort an options flowA
Idempotent

Abort an options flow that has not been finished yet.

Calls DELETE /api/config/config_entries/options/flow/{flow_id}. The entry's existing options are untouched, since nothing was applied by an unfinished flow.

Use when: cancelling an options edit started by mistake or no longer wanted. Not for: cancelling a new-integration setup flow instead — use integrations_abort_config_flow. Returns: HA's abort response for the flow. Errors: raises httpx.HTTPStatusError if flow_id is unknown or already finished.

ParametersJSON Schema
NameRequiredDescriptionDefault
flow_idYesFlow id from `integrations_start_options_flow`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, idempotent, non-destructive behavior, but the description adds value beyond them: it explains why nothing is destroyed (the entry's existing options are untouched since the unfinished flow applied nothing), and documents error behavior (`httpx.HTTPStatusError` if `flow_id` is unknown or already finished). It could still mention permission/auth requirements, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Deliberately structured with front-loaded purpose, endpoint, then labeled 'Use when / Not for / Returns / Errors' lines. Every line carries distinct information; nothing is repetitive or 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?

An output schema exists, so the brief 'Returns: HA's abort response' is sufficient without enumerating fields. Side effects, error conditions, endpoint, and sibling disambiguation are all covered for a one-parameter flow-termination tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is a single parameter, so the schema already documents `flow_id` and its provenance. The description adds no format or naming detail beyond the schema, which fits the baseline of 3 when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Abort an options flow') plus the constraint that it must not yet be finished, and explicitly contrasts with the sibling `integrations_abort_config_flow` for new-integration setups. An agent can distinguish this from every other flow-related tool without reading a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Uses explicit 'Use when' (cancelling a mistaken/unwanted options edit) and 'Not for' (cancelling a new-integration setup flow — use the config-flow sibling instead) phrasing, naming the alternative tool directly. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_disable_integrationDisable a config entryA
Idempotent

Disable an integration's config entry without removing it.

Calls the config_entries/disable WebSocket command with disabled_by="user". The entry and its devices/entities stay registered but stop loading until re-enabled.

Use when: pausing an integration temporarily while keeping its configuration and registry entries intact. Not for: permanently deleting the entry — use integrations_remove_integration; to bring it back — use integrations_enable_integration. Returns: the config_entries/disable result. Errors: raises RuntimeError if the underlying WebSocket call fails (e.g. entry_id unknown).

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYesConfig entry ID to disable, from `system_list_integrations` or `system_get_all_integrations`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (destructiveHint=false, idempotentHint=true), and the description adds non-obvious behavior on top: entries/devices/entities stay registered but stop loading, the underlying WebSocket command and disabled_by='user' flag, and error behavior (RuntimeError when entry_id is unknown). This is exactly the kind of context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then cleanly sectioned into behavior, 'Use when', 'Not for', Returns and Errors. It is slightly longer than strictly necessary (the Returns line is redundant with the output schema), but every other 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 one-param, non-destructive mutation with an output schema, the agent has everything it needs: effect on state, reversibility, alternatives, and failure mode. No meaningful 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% and the single entry_id param is documented in the schema itself (including where to obtain it). The description adds no parameter-level information, 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 (disable) plus resource (an integration's config entry) and the crucial scope detail 'without removing it'. It also names the two siblings it must not be confused with (remove_integration, enable_integration), so an agent can distinguish 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (pause temporarily, keep config/registry intact) and 'Not for' (permanent deletion -> remove_integration; reversal -> enable_integration). Both the positive condition and the alternatives are 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.

integrations_enable_integrationEnable a config entryA
Idempotent

Re-enable a previously disabled integration's config entry.

Calls the config_entries/disable WebSocket command with disabled_by=None, which HA treats as clearing the disabled state.

Use when: bringing back an integration disabled via integrations_disable_integration. Not for: setting up a brand-new integration — use integrations_start_config_flow. Returns: the config_entries/disable result. Errors: raises RuntimeError if the underlying WebSocket call fails (e.g. entry_id unknown).

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYesConfig entry ID to re-enable, from `system_list_integrations` or `system_get_all_integrations`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly=false, idempotent=true, destructive=false). The description goes further by disclosing the implementation (calls config_entries/disable with disabled_by=None to clear the disabled state) and the failure mode (RuntimeError on an unknown entry_id). The 'Returns' line is somewhat redundant given an output schema exists, keeping this just 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?

Front-loaded with the core action, then clearly sectioned into mechanism, use-when, not-for, returns, and errors. Every line contributes, with 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 single-parameter mutation, the description covers mechanism, routing to siblings, error behavior, and return source; an output schema exists so return value detail is unnecessary. An agent has everything needed 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%, so entry_id is already fully documented in the schema (including where to source it). The description adds no additional parameter semantics, which is appropriate here and matches the baseline-3 rule when the schema carries the 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?

Specific verb (re-enable) + resource (a previously disabled integration's config entry), with an explicit scope distinction against siblings. An agent can distinguish it from integrations_disable_integration and integrations_start_config_flow 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?

Explicit 'Use when' (bringing back an integration disabled via integrations_disable_integration) and 'Not for' (new setup -> integrations_start_config_flow) sections name the conditions and the alternatives directly. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_get_config_flowGet config flow stateA
Read-onlyIdempotent

Get the current state of a config flow without advancing it.

Calls GET /api/config/config_entries/flow/{flow_id}.

Use when: checking a flow's current step/schema again, e.g. after losing the earlier response. Not for: providing the step's answers — use integrations_submit_config_flow_step. Returns: the flow's current step payload, same shape as integrations_start_config_flow's result. Errors: raises httpx.HTTPStatusError if flow_id is unknown or expired.

ParametersJSON Schema
NameRequiredDescriptionDefault
flow_idYesFlow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description still adds real value: it emphasizes the call does not advance the flow, describes the return shape (same as start_config_flow's result) and documents error behavior (httpx.HTTPStatusError on unknown/expired flow_id). No auth or rate-limit notes, hence not 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?

Front-loaded core sentence, then tightly labeled Use when / Not for / Returns / Errors lines. Every sentence carries information an agent needs; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param read tool with annotations and an output schema, this covers purpose, routing to siblings, return shape and failure mode. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself already documents that flow_id comes from start_config_flow or list_flows_in_progress. The description adds nothing further about the parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get the current state of a config flow') plus a crucial scope qualifier ('without advancing it'), and the endpoint. It is clearly distinguishable from integrations_start_config_flow and integrations_submit_config_flow_step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause names the scenario (re-checking a flow's current step/schema after losing an earlier response) and a 'Not for' clause routes the agent to integrations_submit_config_flow_step for supplying answers. When/when-not/alternative are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_list_flow_handlersList installable integration domainsA
Read-onlyIdempotent

List every integration domain that supports a config flow.

Calls GET /api/config/config_entries/flow_handlers over HTTP for the domains HA can set up through the UI-style flow (as opposed to YAML-only integrations).

Use when: checking whether a domain can be installed via integrations_start_config_flow before attempting it. Not for: domains already configured — use system_list_integrations. Returns: list of domain strings, e.g. ["shelly", "hue", ...]. Errors: raises httpx.HTTPStatusError if the HA API request fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real context beyond them: the underlying HTTP endpoint, the error behavior (`httpx.HTTPStatusError` on API failure), and the flow-vs-YAML distinction. This is genuine behavioral detail not present in 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?

Front-loaded with the core purpose, then organized into labeled Use when / Not for / Returns / Errors blocks. Each line earns its place and none repeats the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param read tool with full annotations and an output schema, the description is fully sufficient — it adds scope, routing, endpoint, and error behavior without restating the schema's return contract.

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 baseline is 4 and the schema (100% coverage) carries no burden. The description correctly spends no space on parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('List every integration domain that supports a config flow') and immediately distinguishes the scope from YAML-only integrations. An agent can tell it apart from siblings like system_list_integrations 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?

Explicit 'Use when' (pre-checking a domain before calling `integrations_start_config_flow`) and 'Not for' (already-configured domains, routing to `system_list_integrations`). Both the trigger and the alternative are 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.

integrations_list_flows_in_progressList in-progress config flowsA
Read-onlyIdempotent

List config flows that were started but not yet finished.

Calls the config_entries/flow/progress WebSocket command.

Use when: finding a flow_id left over from an earlier integrations_start_config_flow call, e.g. one waiting on discovery. Not for: flows already completed into a config entry — use system_list_integrations. Returns: list of in-progress flow dicts (flow_id, handler, step_id, context, and related fields). Errors: raises RuntimeError if the underlying WebSocket call fails (e.g. auth or WS-level error).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds value by naming the underlying WebSocket command, the error surface (`RuntimeError` on auth/WS failure), and returns a dict structure. It doesn't detail auth requirements or rate limits, but the WS-level failure disclosure is meaningful behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then structured into named sections (Calls/Use when/Not for/Returns/Errors) that are easy to scan. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return dict contents needn't be fully re-explained; the description skims the return fields, and it covers what an agent must know to call correctly: the WS command invoked, the lifecycle state being queried, the sibling relationship, and the error behavior. Complete for a complex integration-lifecycle tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4 per the rubric. The description doesn't need to compensate for param coverage and correctly omits param discussion.

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 config flows that were started but not yet finished') and explicitly distinguishes from siblings: 'Not for: flows already completed into a config entry — use system_list_integrations.' This lets an agent tell it apart from integrations_start_config_flow, integrations_get_config_flow, and system_list_integrations without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use ('finding a flow_id left over from an earlier integrations_start_config_flow call, e.g. one waiting on discovery') and an explicit exclusion routing to an alternative sibling. This is the strongest possible usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_remove_integrationRemove a config entryA
DestructiveIdempotent

Remove (uninstall) an integration's config entry after an explicit confirmation.

Calls DELETE /api/config/config_entries/entry/{entry_id} — there is no config_entries/remove WebSocket command. HA unloads the integration and deletes its entry; any devices/entities it owned typically go with it. Without confirm=True nothing is removed.

Use when: an integration is no longer wanted and should be fully uninstalled, not just disabled. Not for: keeping the entry but pausing it — use integrations_disable_integration. Returns: HA's removal result when confirmed, otherwise a confirmation prompt. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false; raises httpx.HTTPStatusError if entry_id does not exist. Limits: requires confirm=True; deletes the entry and its devices/entities with no separate backup step.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet true to actually remove the integration. False (default) performs no action and instead returns a confirmation prompt.
entry_idYesConfig entry ID to remove, from `system_list_integrations` or `system_get_all_integrations`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructive=true and readOnly=false, but the description adds crucial behavior: confirmation is mandatory, nothing is removed without `confirm=True`, devices/entities are deleted with no separate backup, and the exact error shape for missing confirmation or bad entry_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and usage, then structured into useful sections for endpoint, returns, errors, and limits. Every part contributes to safe invocation of a destructive tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, full schema coverage, and existing output schema, the description provides all remaining context an agent needs: confirmation requirement, destructive scope, error handling, and alternative tool. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already fully documents `confirm` and `entry_id`, including the confirmation prompt behavior and source of entry_id. The description reinforces these points but does not add significant new parameter semantics 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 opens with a specific verb and resource: 'Remove (uninstall) an integration's config entry'. It also explicitly distinguishes this from merely disabling the integration and names the sibling tool to use instead.

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 gives explicit 'Use when' and 'Not for' sections, including the alternative `integrations_disable_integration` for pausing. The condition for choosing this tool versus the sibling is fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_start_config_flowStart an integration config flowA

Start a new config flow for an integration domain.

Calls POST /api/config/config_entries/flow with {"handler": handler, "show_advanced_options": show_advanced_options}; HA has no WebSocket command for this. Each call creates a new, distinct flow.

Use when: beginning to set up a new integration through the same step-by-step flow the HA UI uses. Not for: editing an already-configured entry — use integrations_start_options_flow. Returns: the first step: {flow_id, step_id, data_schema, errors, ...}. Pass flow_id into integrations_submit_config_flow_step with the user's answers. Errors: raises httpx.HTTPStatusError if handler is not a valid flow-handler domain.

ParametersJSON Schema
NameRequiredDescriptionDefault
handlerYesIntegration domain to configure, e.g. 'shelly'; from `integrations_list_flow_handlers`.
show_advanced_optionsNoWhether to include the integration's advanced-options fields in the returned form. False (default) hides them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the call uses a specific REST endpoint because no WebSocket command exists, that every call creates a new distinct flow, the shape of the first returned step, and the error behavior for an invalid handler domain. These details meaningfully lower the risk of misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then cleanly structured into Use when, Not for, Returns, and Errors sections. Every sentence adds operational value without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-step integration setup flow, the description covers purpose, alternatives, return shape, and error behavior. With an output schema present and 100% parameter coverage, nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters and their meanings. The description adds the handler payload context and reinforces that handler must be a valid flow-handler domain, but it does not substantially expand parameter semantics beyond the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Start a new config flow for an integration domain.' It immediately distinguishes itself from the sibling options-flow tool by naming the alternative in the 'Not for' section.

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 gives explicit when-to-use guidance ('beginning to set up a new integration through the same step-by-step flow the HA UI uses') and an explicit exclusion with the correct alternative ('editing an already-configured entry — use integrations_start_options_flow'). It also tells the agent what to do next by passing flow_id into integrations_submit_config_flow_step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_start_options_flowStart an options flowA

Start the options flow for an existing config entry.

Calls POST /api/config/config_entries/options/flow, passing entry_id as handler — HA's options-flow API reuses the config-flow request shape and documents handler as "the entry_id" in this context. Each call creates a new, distinct flow.

Use when: changing an already-configured integration's settings through its own options UI/schema. Not for: configuring a brand-new integration — use integrations_start_config_flow. Returns: the first step: {flow_id, step_id, data_schema, errors, ...}. Pass flow_id into integrations_submit_options_flow_step. Errors: raises httpx.HTTPStatusError if entry_id does not exist or the integration has no options flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYesConfig entry ID to edit, from `system_list_integrations` or `system_get_all_integrations`.
show_advanced_optionsNoWhether to include the integration's advanced-options fields in the returned form. False (default) hides them.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the safety profile (readOnly=false, idempotent=false, destructive=false), and the description adds context beyond them: each call creates a new distinct flow (reinforcing the non-idempotent trait), the flow must be continued via integrations_submit_options_flow_step, and it raises httpx.HTTPStatusError when the entry_id is invalid or no options flow exists. This is substantive behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then uses labeled sections (Use when / Not for / Returns / Errors) that each earn their place. 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?

Even though an output schema exists (so return values need not be explained), the description still provides the critical chaining hint (pass flow_id onward) and error behavior. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds genuine semantic value by explaining that entry_id is passed as 'handler' and that HA reuses the config-flow request shape for this endpoint. It does not describe show_advanced_options, but that parameter is already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Start the options flow for an existing config entry') and immediately distinguishes itself from the sibling it is not ('Not for: configuring a brand-new integration — use integrations_start_config_flow'). An agent can route correctly 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?

Explicit when-to-use ('changing an already-configured integration's settings through its own options UI/schema') and when-not-to-use, naming the alternative tool. The full selection condition is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_submit_config_flow_stepSubmit a config flow stepA
Destructive

Submit user input for the current step of a config flow.

Calls POST /api/config/config_entries/flow/{flow_id} with user_input. What this does depends entirely on the integration domain driving the flow: it may just advance to the next form, or it may validate credentials against the integration's own device/cloud service and create or overwrite a real config entry that HA loads. HA does not signal in advance which step is the last one, so any submitted step — not only a visibly "final" one — can be the one that creates the entry.

Use when: providing the values a config-flow step asked for. Not for: reading the current step without submitting anything — use integrations_get_config_flow; cancelling a flow before it finishes — use integrations_abort_config_flow. Returns: the next step (form), a step with errors, or the finished config entry. The returned step's last_step field is True only when the integration explicitly declares this is the final step, and None otherwise — most integrations leave it None even on their actual last step, so None does not mean more steps remain. Errors: raises httpx.HTTPStatusError if flow_id is unknown or expired. Limits: the integration handling this domain may reach an external device or cloud service while validating user_input; a config entry can be created without warning on any step.

ParametersJSON Schema
NameRequiredDescriptionDefault
flow_idYesFlow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`.
user_inputYesAnswers for the current step, matching the fields in the flow's `data_schema` (e.g. host, API key, chosen device).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, destructive=true, openWorld=true, idempotent=false; the description adds substantial context beyond them: the call may validate credentials against an external device/cloud service, may create or overwrite a real config entry, and any submitted step — not just a visibly final one — can be the entry-creating step. It also documents the last_step=True/None semantics and the httpx.HTTPStatusError on unknown/expired flow_id, which are not derivable from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with the core action, then organized into labeled sections (Use when / Not for / Returns / Errors / Limits) that each carry distinct value. Slightly long — the endpoint string and extended last_step explanation add bulk — but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world mutation tool with an output schema, the description covers the risk profile, return-shape caveats, error behavior, and external-service side effects. An agent has everything needed to call it correctly and understand the consequences.

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 flow_id and user_input are already fully documented in the schema (including the data_schema matching requirement). The description adds little parameter-specific detail beyond restating that user_input drives the flow, 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 precise verb+resource ('Submit user input for the current step of a config flow') and even names the underlying endpoint, making the action unambiguous. It clearly distinguishes itself from siblings like integrations_get_config_flow and integrations_abort_config_flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' sections name the two relevant alternatives (reading the current step vs cancelling the flow) with the exact tool names. Nothing is left to inference about when to pick this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_submit_options_flow_stepSubmit an options flow stepA
Destructive

Submit a step of an options flow.

Calls POST /api/config/config_entries/options/flow/{flow_id} with user_input. What this does depends entirely on the integration domain: an intermediate step just advances the form, while the step that finishes the flow applies the new options to the existing config entry, replacing its previous options. HA does not signal in advance which step is the last one, so any submitted step — not only a visibly "final" one — can be the one that overwrites the options.

Use when: providing the values an options-flow step asked for. Not for: reading the current step without submitting — there is no separate "get options flow" tool; call integrations_start_options_flow again to restart it; cancelling a flow before it finishes — use integrations_abort_options_flow. Returns: the next step (form), a step with errors, or the entry's updated result. The returned step's last_step field is True only when the integration explicitly declares this is the final step, and None otherwise — most integrations leave it None even on their actual last step, so None does not mean more steps remain. Errors: raises httpx.HTTPStatusError if flow_id is unknown or expired. Limits: any submitted step, not only a visibly "final" one, may overwrite the entry's previous options; the integration may reach an external device or cloud service while validating the submitted values.

ParametersJSON Schema
NameRequiredDescriptionDefault
flow_idYesFlow id from `integrations_start_options_flow`.
user_inputYesAnswers for the current step, matching the fields in the flow's `data_schema`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context: any submitted step may overwrite previous options, Home Assistant does not signal in advance which step is final, and integrations may reach external devices or cloud services while validating. It also describes return shapes and the error condition for unknown or expired flow IDs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured and front-loaded, with clear Use/Not for/Returns/Errors/Limits sections. It is somewhat long and repeats the warning that any submitted step may overwrite options, which slightly reduces conciseness.

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, open-world options-flow submission tool with an output schema, the description covers purpose, alternatives, return values, errors, and overwrite risks thoroughly. An agent has enough context to call it correctly and understand the consequences.

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 schema already documents both `flow_id` and `user_input`, including that `user_input` must match the flow's `data_schema`. The description reinforces but does not meaningfully extend parameter semantics beyond that 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?

The description states a specific verb and resource: 'Submit a step of an options flow,' and explicitly names the API endpoint. It distinguishes the tool from siblings by naming `integrations_start_options_flow` and `integrations_abort_options_flow`, and explains that its effect depends on the integration domain.

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 gives explicit 'Use when' and 'Not for' sections, including the alternative for cancelling (`integrations_abort_options_flow`) and the warning that there is no separate get-current-step tool. This leaves no ambiguity about when to invoke this tool versus restarting or aborting a flow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

integrations_update_integration_entryUpdate config entry propertiesA
DestructiveIdempotent

Update selected properties of an existing config entry.

Calls the config_entries/update WebSocket command with only the fields given here (title, pref_disable_new_entities, pref_disable_polling) — omitted fields keep their previous stored value, but any field that is given replaces the previous one, which is then lost.

Use when: renaming an integration's entry or changing its entity-discovery/polling preferences without going through its options flow. Not for: settings specific to the integration itself (its actual options schema) — use integrations_start_options_flow. Returns: the config_entries/update result. Errors: raises RuntimeError if the underlying WebSocket call fails (e.g. entry_id unknown).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoNew display title for the entry. Omit to leave the current title unchanged.
entry_idYesConfig entry ID to update, from `system_list_integrations` or `system_get_all_integrations`.
pref_disable_pollingNoWhether HA should skip polling for this integration's entities. Omit to leave the current preference unchanged.
pref_disable_new_entitiesNoWhether newly discovered entities from this integration should start disabled. Omit to leave the current preference unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real value beyond them: partial-update semantics (omitted fields keep prior values; given fields overwrite and lose the previous one) and the error contract (RuntimeError on unknown entry_id). This is exactly the mutation risk detail an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then cleanly sectioned into Use when / Not for / Returns / Errors. Every sentence carries distinct information; the 'which is then lost' clause is functional, not filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive single-entry mutation, the description covers purpose, alternatives, partial-update semantics, error behavior, and return, while annotations carry the safety profile and an output schema exists. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond per-parameter docs by clarifying the wholesale-replacement behavior of supplied fields versus omitted ones. It does not add syntax/format specifics, so it stops short of 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 ('Update selected properties of an existing config entry') and explicitly distinguishes itself from the sibling options-flow path. An agent can identify what this does and what it does not do 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?

Contains explicit 'Use when' (renaming an entry, changing entity-discovery/polling prefs) and 'Not for' (integration-specific options schema) guidance, naming `integrations_start_options_flow` as the alternative. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_assign_label_to_deviceAssign label to deviceA
Idempotent

Assign a label to a device, keeping its existing labels.

Reads the device's current labels list from the device registry, appends label_id if not already present, and writes the full list back via WS config/device_registry/update.

Use when: tagging one device with a label without disturbing labels already on it. Not for: removing a label — use labels_remove_label_from_device. Returns: dict with device_id, the resulting labels list, the raw WS result, and ok. Errors: on a WS failure, returns {"device_id": ..., "label_id": ..., "ok": false, "error": "<message>"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
label_idYesLabel registry ID to assign; obtain it from labels_list_labels.
device_idYesDevice registry ID to tag; obtain it from devices_list_devices.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and the description explains the exact mechanism (read current labels, append if absent, write full list back via config/device_registry/update) — which is precisely why it is idempotent and non-destructive. It further discloses the return shape and the error contract on WS failure, adding real context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the operation, then uses labeled blocks (mechanism, Use when, Not for, Returns, Errors) so an agent can scan to the relevant line. Every sentence carries distinct information with no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param mutation with a full input schema and an output schema, the description covers purpose, routing, mechanism, success return keys, and failure shape. There is no meaningful gap an agent would need filled before calling it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both params are documented there, including how to obtain the IDs, so the baseline is 3. The description reinforces semantics by explaining that label_id is appended only if not already present, but adds no format or constraint 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+resource ('Assign a label to a device') and immediately qualifies the scope with 'keeping its existing labels', which distinguishes it from a generic set/replace operation. It also names the sibling it is not (labels_remove_label_from_device), so an agent can disambiguate without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: tagging one device with a label without disturbing labels already on it' and 'Not for: removing a label — use labels_remove_label_from_device' give both the positive condition and the exclusion with the alternative named. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_assign_label_to_entityAssign label to entityA
Idempotent

Assign a label to an entity, keeping its existing labels.

Reads the entity's current labels list from the entity registry, appends label_id if not already present, and writes the full list back via WS config/entity_registry/update.

Use when: tagging one entity with a label without disturbing labels already on it. Not for: removing a label — use labels_remove_label_from_entity. Returns: dict with entity_id, the resulting labels list, the raw WS result, and ok. Errors: on a WS failure, returns {"entity_id": ..., "label_id": ..., "ok": false, "error": "<message>"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
label_idYesLabel registry ID to assign; obtain it from labels_list_labels.
entity_idYesEntity ID to tag, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint, non-destructive, and non-readOnly, but the description adds real mechanism: it reads the current labels list, appends only if absent, and writes the full list back via a named WS endpoint. The error return shape is also disclosed. Minor deduction because the 'Returns' text substantially duplicates the existing output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then structured into behavior, Use when/Not for, Returns, and Errors. Well-organized, though the Returns section is somewhat redundant given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with annotations and an output schema, everything needed to call it correctly is present: preconditions, additive semantics, error shape, and the sibling alternative for removal.

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, but the description adds meaning beyond the schema by stating that label_id is appended only if not already present, implying the dedupe/idempotency behavior for that parameter. It does not add format or lookup details beyond what the schema descriptions already provide.

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 (assign) and resource (label to entity), and explicitly distinguishes itself from the sibling labels_remove_label_from_entity. An agent can route this correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Has an explicit 'Use when' clause (tagging one entity without disturbing existing labels) and a 'Not for' clause naming the alternative tool to use for removal. This is the full when/when-not/alternative pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_create_categoryCreate categoryA

Create a category within a registry scope.

Calls WS config/category_registry/create with scope and name, plus icon if given; Home Assistant assigns a new category_id, so calling this twice with the same name creates two separate categories.

Use when: you need a new category to group items within one scope, e.g. automations. Returns: the created category registry dict. Errors: on a WS failure, returns {"error": "<message>"} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoOptional mdi icon identifier, e.g. 'mdi:tag'; omit for no icon.
nameYesDisplay name for the new category.
scopeYesRegistry scope the new category belongs to, e.g. 'automation'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it names the underlying WS endpoint, concretizes the non-idempotent behavior (calling twice with the same name creates two separate categories, matching idempotentHint=false), and discloses error handling ('returns {"error": ...} instead of raising'). This is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with verb and resource, then organized into distinct behavior, use-when, returns, and errors sections. Every sentence carries information an agent needs, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a small 3-param creation tool with annotations and an output schema, the description covers purpose, trigger, non-idempotency, and error semantics. Returns are noted even though the output schema carries them, leaving no 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 the schema already documents scope, name, and icon semantics. The description restates which parameters are passed to the WS call but adds no syntax or format detail beyond the schema. 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 ('Create a category within a registry scope') and clearly distinguishes this from the sibling label tools (labels_create_label) and area tools by tying it to the category registry. An agent can identify the operation 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?

The 'Use when' clause gives a concrete trigger ('you need a new category to group items within one scope, e.g. automations'), which is clear context. It stops short of naming an alternative tool or stating when-not-to-use (e.g., versus labels_create_label), 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.

labels_create_labelCreate labelA

Create a new label.

Calls WS config/label_registry/create with name and any of icon, color and description you pass; Home Assistant assigns a new label_id, so calling this twice with the same name creates two separate labels.

Use when: you need a new label to tag entities or devices with. Returns: the created label registry dict (label_id, name, icon, color, description). Errors: on a WS failure, returns {"error": "<message>"} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoOptional mdi icon identifier, e.g. 'mdi:alert'; omit for no icon.
nameYesDisplay name for the new label, e.g. 'Battery Low'.
colorNoOptional label color name recognised by the frontend, e.g. 'red'; omit for no color.
descriptionNoOptional free-text description of the label's purpose; omit for none.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the annotations: it explains that Home Assistant assigns the label_id, that calling twice with the same name yields two distinct labels (concretely substantiating idempotentHint=false), and that WS failures return `{"error": ...}` instead of raising. This error contract and non-idempotency detail would be invisible to an agent otherwise.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then organized into labeled Use/Returns/Errors blocks that are easy to scan. Slightly longer than strictly necessary given an output schema exists, but nearly every sentence carries usable 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?

Covers intent, the write path, duplication behavior, and error semantics for a 4-parameter mutation tool. With annotations and a present output schema already covering safety and return shape, nothing an agent needs to call this 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 four parameters (name, icon, color, description) are already fully documented in the schema. The description only restates that these fields are passed through to the WS call, adding no syntax or constraint detail beyond what the schema provides. 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 precise verb+resource ("Create a new label") and even names the underlying WS endpoint `config/label_registry/create`. An agent can distinguish it from siblings like labels_update_label, labels_create_category, and labels_assign_label_to_entity 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 states "Use when: you need a new label to tag entities or devices with," which gives clear intent context. It does not, however, name alternatives or exclusions (e.g., update if the label already exists, or create_category for a different resource), leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_delete_categoryDelete categoryA
DestructiveIdempotent

Delete a category from a registry scope.

Calls WS config/category_registry/delete with scope and category_id and returns Home Assistant's result unchanged.

Use when: a category is no longer needed within its scope. Returns: dict with scope, category_id, the raw WS result, and ok. Errors: on a WS failure, returns {"scope": ..., "category_id": ..., "ok": false, "error": "<message>"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeYesRegistry scope the category belongs to, e.g. 'automation'.
category_idYesCategory registry ID to delete; obtain it from labels_list_categories.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds the WS call path, success dict shape, and explicit failure return shape, which are useful behavioral details beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then separates call, usage, return, and error details with line breaks. It is mostly efficient, though some return/error detail is redundant given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With rich annotations, full schema coverage, and an output schema, the description supplies the remaining operational context: when to use it, success shape, and failure shape. It is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the input schema already explains scope examples and where to obtain category_id. The description only restates the two parameter names, adding no semantics beyond structured data.

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 category') and scope ('from a registry scope'), separating it from sibling label/category operations such as labels_delete_label. An agent can identify the operation 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 says 'Use when: a category is no longer needed within its scope,' giving a clear trigger condition. It does not name alternatives or exclusions, so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_delete_labelDelete labelA
DestructiveIdempotent

Delete a label from the label registry.

Calls WS config/label_registry/delete with the given label_id and returns Home Assistant's result unchanged.

Use when: a label is no longer needed. Returns: dict with label_id, the raw WS result, and ok (true on success). Errors: on a WS failure, returns {"label_id": ..., "ok": false, "error": "<message>"} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
label_idYesLabel registry ID to delete; obtain it from labels_list_labels.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds useful context beyond annotations: the underlying WS endpoint, the return structure (label_id, result, ok), and error behavior (returns an error dict instead of raising).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, followed by clearly labeled 'Use when:', 'Returns:', and 'Errors:' sections. Every sentence provides actionable detail with no wasted words, making it easy to scan and parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with annotations and an output schema, the description is complete: it covers what is deleted, when to use it, the return shape, and explicit error handling. Nothing material is left for the agent to infer.

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 schema already documents label_id as the label registry ID obtainable from labels_list_labels. The description only repeats 'with the given label_id', adding no new syntax, format, or constraint 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 (Delete) and resource (a label from the label registry), clearly distinguishing it from siblings like labels_delete_category and labels_remove_label_from_entity. An agent can identify exactly what this tool 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear condition: 'Use when: a label is no longer needed.' However, it does not name alternatives or exclusions, such as using labels_remove_label_from_entity instead when the label should be detached rather than deleted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_list_categoriesList categoriesA
Read-onlyIdempotent

List categories defined for a given registry scope.

Calls WS config/category_registry/list with scope and returns the result unfiltered; returns an empty list if the WS response is not a list.

Use when: you need category IDs for one scope, e.g. before tagging automations. Returns: list of category registry dicts (category_id, name, icon) for the given scope. Errors: on a WS failure, returns [{"error": "<message>"}] instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoRegistry scope the categories belong to, e.g. 'automation'; defaults to 'automation'.automation

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is known. The description adds valuable behavioral details: it writes that the WS result is returned unfiltered, that an empty list is returned if the response isn't a list, and that errors are returned as [{"error": "<message>"}] instead of raising. This goes beyond annotations and helps the agent handle edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then structured into clear sections for usage, returns, and errors. Every sentence is informative and there is no superfluous 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?

The tool is simple (1 optional parameter, read-only, deterministic). The description covers purpose, usage context, return format, and error behavior, which is more than needed. An output schema exists, so return values need not be detailed in the description, but the additional error handling info is a plus. It is nearly complete, though a note about the scope parameter's default could be added, though that is already in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the single 'scope' parameter fully documented in the schema. The description mentions the scope parameter but adds no new meaning beyond what the schema already provides (e.g., default, examples). 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List categories defined for a given registry scope'), clearly distinguishing this from sibling tools like labels_create_category or labels_list_labels. It could be sharper about how it differs from labels_list_labels (which lists labels, not categories), but the tool's function is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' clause ('you need category IDs for one scope, e.g. before tagging automations'), giving clear context for invocation. It does not name an alternative tool or state when not to use it, but the guidance is sufficient for proper selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_list_devices_with_labelList devices with labelA
Read-onlyIdempotent

List devices that currently have a given label assigned.

Reads the device registry over WebSocket and keeps rows whose labels list contains label_id.

Use when: finding everything tagged with one label, e.g. before a bulk action. Returns: list of device registry dicts that have the label. Errors: on a WS failure, returns [{"error": "<message>"}] instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
label_idYesLabel registry ID to filter by; obtain it from labels_list_labels.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful behavior beyond the annotations: it explains that it reads the device registry over WebSocket, filters on the labels list, and critically that a WebSocket failure returns an error dict rather than raising. That error-handling behavior is not captured by the readOnly/idempotent/non-destructive annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then cleanly separates usage, return shape, and error behavior into labeled fragments. No sentence is redundant or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations, 100% parameter coverage, and available output schema, the description supplies all remaining context: when to use it, what it returns, and how failures manifest. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents label_id, including where to obtain it from labels_list_labels. The description reinforces the filter meaning but adds no syntax or format detail beyond what the schema provides, 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 precise verb and resource: list devices currently holding a given label. It clearly distinguishes itself from siblings such as labels_list_entities_with_label and devices_list_devices by naming the exact filter relationship.

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 an explicit 'Use when' scenario ('finding everything tagged with one label, e.g. before a bulk action'), which gives a clear context for invocation. It does not name when-not-to-use or explicitly contrast with the entity-label sibling, so it falls short of the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_list_entities_with_labelList entities with labelA
Read-onlyIdempotent

List entities that currently have a given label assigned.

Reads the entity registry over WebSocket and keeps rows whose labels list contains label_id.

Use when: finding everything tagged with one label, e.g. before a bulk action. Returns: list of entity registry dicts that have the label. Errors: on a WS failure, returns [{"error": "<message>"}] instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
label_idYesLabel registry ID to filter by; obtain it from labels_list_labels.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real value: it discloses the WebSocket read path, the row-filtering logic, the return shape (entity registry dicts), and notably that WS failures return an error object rather than raising. That error contract is the kind of detail annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded summary sentence followed by tight Use when / Returns / Errors blocks. Every line carries information and there is no 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 one-parameter read tool with full annotation coverage and an output schema, the description covers purpose, trigger, mechanism, and failure mode. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single label_id parameter is already documented in-schema, including its source (labels_list_labels). The description only restates that rows are filtered by label_id, adding no new syntax or format detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List entities that currently have a given label assigned') and distinguishes itself from sibling label tools such as labels_list_labels and labels_list_devices_with_label by naming the entity registry as the target.

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 when: finding everything tagged with one label, e.g. before a bulk action' gives a clear positive trigger. It does not name the closest alternative (labels_list_devices_with_label) or state when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_list_labelsList labelsA
Read-onlyIdempotent

List all labels defined in Home Assistant.

Calls WS config/label_registry/list and returns the result unfiltered; returns an empty list if the WS response is not a list.

Use when: you need label IDs and names before filtering or assigning them to entities or devices. Returns: list of label registry dicts (label_id, name, icon, color, description). Errors: on a WS failure, returns [{"error": "<message>"}] instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive. The description adds substantial behavior beyond them: the underlying WS call, unfiltered results, the empty-list fallback if the response is malformed, and — most valuably — that WS failures return an in-band `[{"error": ...}]` payload instead of raising, which an agent must handle.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then uses labeled Use when / Returns / Errors blocks so an agent can scan to exactly the part it needs. Every sentence carries information; none is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter read tool with an output schema and full annotation coverage, the description supplies everything else that matters: the call semantics, the shape, the degradation behavior, and the error convention. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing to document and the description correctly implies no inputs are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (list) and resource (labels defined in Home Assistant), and states the scope is unfiltered. This cleanly separates it from siblings like labels_list_categories, labels_list_entities_with_label, and labels_list_devices_with_label.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when' clause gives a concrete trigger: needing label IDs and names before filtering or assigning them to entities or devices. It stops short of explicitly naming the alternative label-listing siblings or when not to use it, 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.

labels_remove_label_from_deviceRemove label from deviceA
Idempotent

Remove a label from a device, keeping its other labels.

Reads the device's current labels list from the device registry, drops label_id if present, and writes the remaining list back via WS config/device_registry/update.

Use when: untagging one device from a label without touching its other labels. Not for: deleting the label itself everywhere — use labels_delete_label. Returns: dict with device_id, the resulting labels list, the raw WS result, and ok. Errors: on a WS failure, returns {"device_id": ..., "label_id": ..., "ok": false, "error": "<message>"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
label_idYesLabel registry ID to remove; obtain it from labels_list_labels.
device_idYesDevice registry ID to untag; obtain it from devices_list_devices.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, idempotent, local mutation. The description adds substantial context beyond that: it explains the read-modify-write sequence, that `label_id` is dropped only if present, the underlying WS update call, the returned fields, and the exact error payload shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action and sibling alternative, then structured into Use when, Not for, Returns, and Errors sections. Each section earns its place, especially the error contract, and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It covers the action, scope, when-to-use, exclusion, return shape, and error behavior. With annotations and an output schema also present, the description supplies everything an agent needs to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters already document what to provide and where to obtain the IDs. The description adds no new parameter constraints, formats, or edge cases beyond the schema, so the baseline of 3 for fully covered parameters is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: remove a label from a device while preserving its other labels. It explicitly distinguishes this action from deleting the label itself and names the sibling `labels_delete_label`, so an agent can identify it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit 'Use when' condition and a 'Not for' exclusion with the correct alternative tool. The guidance is directly actionable for choosing between this tool and `labels_delete_label`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_remove_label_from_entityRemove label from entityA
Idempotent

Remove a label from an entity, keeping its other labels.

Reads the entity's current labels list from the entity registry, drops label_id if present, and writes the remaining list back via WS config/entity_registry/update.

Use when: untagging one entity from a label without touching its other labels. Not for: deleting the label itself everywhere — use labels_delete_label. Returns: dict with entity_id, the resulting labels list, the raw WS result, and ok. Errors: on a WS failure, returns {"entity_id": ..., "label_id": ..., "ok": false, "error": "<message>"}.

ParametersJSON Schema
NameRequiredDescriptionDefault
label_idYesLabel registry ID to remove; obtain it from labels_list_labels.
entity_idYesEntity ID to untag, e.g. 'light.kitchen'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, but the description goes further: it explains the read-modify-write mechanism, that only the named label is dropped while others are preserved, the exact return keys (entity_id, labels, raw result, ok), and the error payload shape. This is unusually rich disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line summary followed by labeled Use when / Not for / Returns / Errors sections. Every sentence carries distinct operational 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 two-parameter mutation with no nested objects, the definition covers purpose, routing, mechanism, return values, and error behavior. Even though an output schema exists, the explicit error shape disclosure closes the remaining gap an agent would face.

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 are documented in the schema with examples and a pointer to labels_list_labels. The description restates label_id but adds no syntax or format detail beyond structured fields, 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?

Specific verb+resource ('Remove a label from an entity') plus the exact mechanism (read labels list, drop label_id, write back via WS config/entity_registry/update). It is clearly distinguishable from labels_delete_label and labels_assign_label_to_entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: untagging one entity from a label without touching its other labels' and 'Not for: deleting the label itself everywhere — use labels_delete_label'. Both the positive trigger and the alternative are 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.

labels_update_categoryUpdate categoryA
Destructive

Update fields on an existing category.

Calls WS config/category_registry/update; only the parameters you pass are sent, so omitted fields keep their current value.

Use when: renaming a category or changing its icon within its scope. Returns: the updated category registry dict. Errors: on a WS failure, returns {"error": "<message>"} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoNew mdi icon identifier; omit to leave the current icon unchanged.
nameNoNew display name; omit to leave the current name unchanged.
scopeYesRegistry scope the category belongs to, e.g. 'automation'.
category_idYesCategory registry ID to update; obtain it from labels_list_categories.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive/non-idempotent/non-readOnly, and the description adds genuinely useful behavior: partial-patch semantics (only passed fields are sent), the backing WS call, and a non-raising error contract. It does not explain why the tool is flagged destructive, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then implementation note, usage, return, and error in labeled sections. Efficient overall; the WS endpoint detail is slightly more than an agent needs but it is well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter mutation with an output schema, the description covers the parts the schema cannot: patch behavior, error handling, and the return shape. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each property already documents 'omit to leave unchanged', so the description's patch-semantics note largely restates the schema. Some added value comes from framing the update as a whole, but the schema carries the parameter detail.

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 ('Update fields on an existing category') and adds the underlying WS endpoint, so the agent knows exactly what operation runs. It does not explicitly distinguish itself from the nearby labels_update_label sibling, leaving that inference to the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when: renaming a category or changing its icon within its scope' line gives concrete triggering scenarios. It stops short of naming alternatives or when-not-to-use conditions (e.g. vs. labels_update_label), so it is clear context without full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

labels_update_labelUpdate labelA
Destructive

Update fields on an existing label.

Calls WS config/label_registry/update; only the parameters you pass are sent, so omitted fields keep their current value.

Use when: renaming a label or changing its icon, color or description. Returns: the updated label registry dict. Errors: on a WS failure, returns {"error": "<message>"} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoNew mdi icon identifier, e.g. 'mdi:alert'; omit to leave the current icon unchanged.
nameNoNew display name; omit to leave the current name unchanged.
colorNoNew label color name; omit to leave the current color unchanged.
label_idYesLabel registry ID to update; obtain it from labels_list_labels.
descriptionNoNew free-text description; omit to leave the current description unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the annotations by disclosing PATCH semantics (omitted fields retain current values), the underlying WS endpoint, the return payload, and non-raising error behavior returning `{"error": ...}`. It does not discuss permissions or whether a change can be reverted, which is the remaining gap on a tool flagged 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?

Front-loaded purpose sentence, then compact labeled lines for behavior, use case, return and errors. No filler, no redundancy, and the most decision-relevant fact (partial update) appears early.

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 5-parameter update tool with full schema coverage, annotations, and an output schema, the description covers the remaining unknowns: mutation semantics, error contract, and trigger conditions. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so per-parameter meaning is already documented; the description still adds cross-parameter semantics — that only supplied fields are transmitted and everything else is left untouched — which the schema alone cannot convey.

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 ("Update fields on an existing label") plus the exact mutable fields, which cleanly separates it from labels_create_label, labels_delete_label and labels_update_category. It doesn't explicitly name a sibling, but the noun/verb pair is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use when: renaming a label or changing its icon, color or description" gives a concrete trigger for calling the tool. No when-not guidance or named alternative (e.g., delete/recreate), but for a straightforward field update 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.

search_find_orphan_devicesFind orphan devicesA
Read-onlyIdempotent

List devices with no entities associated with them in the entity registry.

Compares every device's id against the set of device_id values referenced by entity-registry entries and returns devices that no entity points to.

Use when: hunting for device-registry entries that may be safe to remove, always reviewing each result first. Returns: list of dicts (id, name, name_by_user, manufacturer, model, area_id, config_entries) for devices with no referencing entity. Limits: a WS failure on either registry silently yields an empty underlying list rather than an error, which can under-report orphans.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a safe, read-only, idempotent operation, so the safety profile is covered. The description goes beyond them with a genuinely useful failure disclosure: a WS failure on either registry silently yields an empty list rather than an error, meaning orphans can be under-reported. It stops short of 5 only because no permission or rate-limit context is added.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and clearly segmented with 'Use when', 'Returns', and 'Limits' labels, which makes it easy to scan. It is slightly longer than strictly necessary since the opening sentence and the id-comparison sentence partly overlap, keeping it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description enumerates the return fields (id, name, name_by_user, manufacturer, model, area_id, config_entries) and discloses the silent-failure caveat, so an agent has everything needed to call and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; a baseline of 4 applies. The description correctly adds no fabricated parameter 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?

The description states a specific verb and resource ('List devices with no entities associated with them in the entity registry') and adds the mechanism (comparing device ids against device_id values referenced by entity-registry entries). This clearly distinguishes it from the nearby sibling search_find_unused_entities, which targets entities rather than devices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when' clause gives clear context ('hunting for device-registry entries that may be safe to remove') and a caution ('always reviewing each result first'). It does not name alternative tools or state explicit exclusions, 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.

search_find_unused_entitiesFind possibly unused entitiesA
Read-onlyIdempotent

Heuristically list entities that look unused or orphaned.

Flags entities whose state has been 'unavailable' or 'unknown' for more than 7 days (or has no last_changed at all), plus any entity-registry entries with no device_id — which normally means helpers, automations and template entities, not proof of disuse.

Use when: hunting for cleanup candidates, always reviewing each result before deleting anything. Returns: list of dicts (entity_id, state, last_changed, device_id, reasons) — reasons explains which heuristic(s) matched. Limits: purely heuristic; the 7-day unavailability threshold and a missing device_id are weak signals, not confirmation that an entity is truly unused.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the exact heuristics (unavailable/unknown >7 days, missing last_changed, missing device_id), warning that these are weak signals, and describing the returned 'reasons' field. This gives the agent behavioral insight that readOnly/idempotent hints alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured and front-loaded, using clear Use/Returns/Limits sections. It is slightly verbose, with the heuristic nature repeated in both the opening and the Limits section, but every part still 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?

Complete for a heuristic, read-only, zero-parameter tool: it explains what is flagged, why it is only a signal, and what the output contains. Annotations and output schema cover safety and return shape, so no critical context 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 has zero parameters, so parameter semantics are not applicable. Per the baseline for 0-parameter tools, a 4 is appropriate because there are no parameter meanings to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('list') and resource ('entities that look unused or orphaned'), and clearly scopes the result as heuristic cleanup candidates. It differentiates itself from ordinary entity search by explaining the exact heuristic criteria used.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use when: hunting for cleanup candidates' and adds a strong caution to review each result before deleting. It provides clear context but does not name alternative tools or describe when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_search_areasSearch areasA
Read-onlyIdempotent

Fuzzy-rank areas by name.

Scores every area from the area registry against query, keeps only scores above 0, and returns the top limit matches sorted descending.

Use when: you don't know an area's exact id and want a ranked guess from a name fragment. Not for: an exact, unranked area list — use areas_list_areas. Returns: list of dicts (area_id, name, floor_id, icon, score) up to limit entries. Limits: areas that score exactly 0 are dropped entirely; a WS failure yields an empty list rather than an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of ranked results to return; defaults to 20.
queryYesSearch text to fuzzy-match against area names.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds non-obvious behavioral traits: zero-score areas are dropped entirely and a WebSocket failure returns an empty list instead of raising an error. That failure-degradation detail is exactly the kind of context annotations cannot convey and prevents misreading an empty result as 'no matches'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line summary followed by clearly labeled Use when / Not for / Limits sections; every sentence carries information except the 'Returns' line, which restates the output schema that already exists. Minor redundancy, not bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with a full schema, complete annotations, and an output schema, the description covers selection criteria, ranking semantics, and failure behavior. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that `limit` caps a descending-sorted, zero-filtered result set, clarifying that limit applies after score filtering rather than to the raw registry.

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 operation on a specific resource: 'Fuzzy-rank areas by name.' It also names the sibling it is not (areas_list_areas) and describes the ranking/filtering pipeline (scores above 0, top-N sorted descending), so an agent can distinguish it from the exact-list tool 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?

Explicit 'Use when' clause ('you don't know an area's exact id and want a ranked guess from a name fragment') and an explicit 'Not for' clause routing to areas_list_areas for an exact, unranked list. Both the trigger and the alternative are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_search_devicesSearch devicesA
Read-onlyIdempotent

Fuzzy-rank devices by name, name_by_user, manufacturer and model.

Scores every device from the device registry against query, keeps only scores above 0, and returns the top limit matches sorted descending.

Use when: you don't know a device's exact id and want a ranked guess from a name fragment. Not for: an exact, unranked device list — use devices_list_devices, areas_list_devices or devices_list_devices_in_area. Returns: list of dicts (id, name, name_by_user, manufacturer, model, area_id, score) up to limit entries. Limits: devices that score exactly 0 are dropped entirely; a WS failure yields an empty list rather than an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of ranked results to return; defaults to 20.
queryYesSearch text to fuzzy-match against a device's name, name_by_user, manufacturer and model.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnly, idempotent, non-destructive), yet the description still adds non-obvious behavior: the scoring threshold that silently drops zero-score devices, and that a WebSocket failure yields an empty list rather than an error — a real gotcha an agent must know to interpret empty results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation, then the algorithm, then use/not-use, then return shape and limits as labeled blocks. Every sentence carries distinct information; nothing is restated from the schema or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with an output schema, the description covers the remaining gaps — ranking semantics, result fields, truncation, and failure behavior. An agent has everything needed to call it and interpret the response correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so per-parameter meaning is already carried by the schema and the baseline is 3. The description goes beyond it by explaining how the two parameters interact — query is scored against every registry device, matches above 0 are kept, and limit truncates the descending-score list.

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?

It names a specific verb and resource (fuzzy-rank devices) and immediately specifies the exact fields that are matched (name, name_by_user, manufacturer, model). This is enough to tell it apart from the plain-list siblings like devices_list_devices or areas_list_devices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause names the triggering condition (no known device id, want a ranked guess from a name fragment) and an explicit 'Not for' clause routes the agent to three named alternatives for exact/unranked listing. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_search_entitiesSearch entitiesA
Read-onlyIdempotent

Fuzzy-rank entities by entity_id, friendly_name and device_id.

Scores every entity against query with substring match (score 1.0) or a sequence-similarity ratio, keeps only scores above 0, and returns the top limit matches sorted descending.

Use when: you don't know the exact entity_id and want a ranked guess from a name fragment. Returns: list of dicts (entity_id, friendly_name, state, device_id, score) up to limit entries. Limits: entities that score exactly 0 are dropped entirely, not just deprioritised.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of ranked results to return; defaults to 20.
queryYesSearch text to fuzzy-match against entity_id, friendly_name and device_id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safety profile (readOnly, idempotent, non-destructive), so the description earns credit for adding non-obvious behavior: the substring-vs-sequence-similarity scoring, descending sort, and the fact that zero-score entities are dropped entirely rather than deprioritised. It omits any performance/rate context but the core behavioral traits are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then cleanly partitioned into Use when / Returns / Limits blocks. Every sentence adds usable information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Usage condition, result shape, ordering, and the zero-score drop are all covered. An output schema exists so return values need not be restated, yet the description completes the picture for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both params and baseline would be 3. The description adds genuine meaning: 'query' is matched by substring (1.0) or sequence similarity, and 'limit' selects the top N sorted descending, going beyond the schema's generic wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (fuzzy-rank) and resource (entities), and spells out the fields matched (entity_id, friendly_name, device_id). It does not explicitly differentiate from nearby siblings like search_search_devices or entities_list_entities, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when: you don't know the exact entity_id and want a ranked guess from a name fragment' clause gives a clear selection condition, implicitly contrasting with exact-lookup tools like entities_get_entity. It does not name a specific alternative tool, 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.

services_call_serviceCall any Home Assistant actionA
Destructive

Call any Home Assistant action by domain and service name over HTTP.

Posts to /api/services/<domain>/<service> with data as the JSON body; data holds both fields and targets (entity_id/area_id/ device_id). Effect depends entirely on the domain/service passed. domain/service must match [A-Za-z0-9_]+ (ADR-0006 D3) or the call is refused before any request is built. Refuses hassio.addon_stop/ app_stop/addon_stdin/app_stdin against nexus's own add-on (self_protection.is_own_addon); addon_restart/app_restart stay allowed. homeassistant.restart/stop, hassio.host_reboot/ host_shutdown/restore_full/restore_partial, update.install and group.remove additionally require confirm=True (ADR-0006 D2) — a human-in-the-loop checkpoint, not a security boundary; ignored for every other service.

Use when: no dedicated tool exists for the action needed. Not for: an action returning response data (e.g. weather.get_forecasts) — use ws_call_service, which refuses the same eight guarded services outright (ADR-0006 D5) instead of accepting confirm. Returns: the list of states changed during the call. Errors: {"error": "invalid_service_name"} for a malformed domain/service; {"error": "self_addon_hassio_service_blocked", "message": ...} for the blocked hassio.* cases; {"error": "confirmation_required", "message": ..., "action": ...} for a guarded service called without confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoService data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data.
domainYesService domain to call, e.g. 'light' or 'climate'.
confirmNoRequired True to actually run one of eight guarded services: homeassistant.restart/stop, hassio.host_reboot/host_shutdown/restore_full/restore_partial, update.install, group.remove. False (default) performs no action for those instead and returns a confirmation prompt; ignored for every other service.
serviceYesService name within the domain, e.g. 'turn_on' or 'set_temperature'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true and idempotentHint=false, so the safety profile is covered; the description goes well beyond by disclosing the domain/service regex validation, the self-add-on block list, the eight confirm-guarded services (a human-in-the-loop checkpoint, not a security boundary), and the exact error shapes. This is rich behavioral context an agent cannot get from the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the HTTP mechanics come first, then use/not-for guidance, then returns and errors. Every sentence carries information, though the guard/block enumerations make it longer than strictly necessary for a single-sentence summary.

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?

Output schema exists, and the description still concisely notes the return value (list of states changed) plus the three documented error cases. Given the complexity of an arbitrary-service-dispatch tool, 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.

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, but the description adds genuine meaning: it explains that data holds both fields and targets, that the domain/service must match [A-Za-z0-9_]+ or be refused pre-request, and details the confirm flag semantics and the specific guarded services it applies to.

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 (call any Home Assistant action by domain/service over HTTP) and names the exact endpoint path. It clearly positions itself as the generic escape hatch among many specific siblings like entities_turn_on and services_set_light_color, and explicitly names the alternative ws_call_service.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when: no dedicated tool exists' and 'Not for: an action returning response data — use ws_call_service', with the distinguishing condition (response-returning actions) spelled out. Both the inclusion and exclusion cases are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_camera_recordRecord a camera clipA
DestructiveIdempotent

Record a short clip from a camera entity to a file, overwriting any existing file at that path.

Calls camera.record with {"entity_id": entity_id, "filename": filename, "duration": duration} over HTTP.

Use when: capturing a short video clip rather than a single still frame. Not for: a single still frame — use services_camera_snapshot. Returns: dict with entity_id, filename, duration and the raw service call result. Limits: blocks for roughly duration seconds while HA records.

ParametersJSON Schema
NameRequiredDescriptionDefault
durationNoRecording length in seconds.
filenameYesDestination path inside the HA config directory, e.g. '/config/www/snapshots/clip.mp4'. Overwrites any existing file there.
entity_idYesFull camera entity ID to record, e.g. 'camera.front_door'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered; the description reinforces it with 'overwriting any existing file' and adds genuinely new context — that the call blocks for roughly `duration` seconds. It does not discuss error/auth behavior, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then neatly labeled Use/Not for/Returns/Limits sections — good scannability. The raw `camera.record` JSON payload line largely restates the schema and is the one element that doesn't fully earn 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 3-param mutation tool with an output schema, the description covers purpose, alternative routing, destructive overwrite behavior, blocking semantics and return shape. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented in the schema. The description repeats them in the underlying service payload but adds no syntax or format detail beyond what the schema provides; 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 ('Record a short clip from a camera entity to a file') and immediately distinguishes itself from the still-frame sibling by naming services_camera_snapshot. An agent can route correctly 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?

Explicit 'Use when' (capturing a short video clip) and 'Not for' (single still frame — use services_camera_snapshot) sections. The alternative and the condition that selects it are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_camera_snapshotSave a camera snapshotA
DestructiveIdempotent

Save a still snapshot from a camera entity to a file, overwriting any existing file at that path.

Calls camera.snapshot with {"entity_id": entity_id, "filename": filename} over HTTP. filename must be inside the HA config directory and allow-listed via allowlist_external_dirs, typically under /config/www/snapshots/... so it can be served by HA.

Use when: capturing a single still frame to a known path, e.g. for a dashboard image or Lovelace card. Not for: a video clip — use services_camera_record. Returns: dict with entity_id, filename and the raw service call result.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesDestination path inside the HA config directory, e.g. '/config/www/snapshots/front.jpg'. Overwrites any existing file there.
entity_idYesFull camera entity ID to capture, e.g. 'camera.front_door'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantive context beyond them: the file is overwritten, the path must be inside the HA config directory and allow-listed via allowlist_external_dirs, the typical serving location, and that it proxies camera.snapshot over HTTP. That is precisely the extra behavioral detail the 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?

Front-loaded with the core action, then cleanly segmented into mechanics, usage, exclusion, and return value. Every line adds information; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter mutation tool with full schema coverage, annotations, and an output schema, the description covers action, constraints, alternatives, and even a brief return summary. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented and the baseline would be 3. The description goes further by explaining the allowlist_external_dirs constraint and the /config/www/snapshots/ convention that makes the file servable by HA, which the schema's terse examples do not.

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 ('Save a still snapshot'), the source (camera entity), and the destination (a file), with the overwrite behavior called out up front. It explicitly names the sibling it is not for (services_camera_record), so the agent can discriminate without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Uses an explicit 'Use when / Not for' structure, giving the positive condition (single still frame to a known path, e.g. dashboard image) and the alternative (video clip -> services_camera_record). This is the full when/when-not/alternative triad.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_fire_eventFire a Home Assistant eventA
Destructive

Fire an arbitrary Home Assistant event with an optional data payload.

Posts to /api/events/<event_type> with event_data as the JSON body; any automation or integration listening for event_type reacts to it, so the effect depends entirely on what is registered to listen.

Use when: triggering automations or integrations that listen for a specific event type. Returns: dict confirming the event was fired, as returned by Home Assistant.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_dataNoEvent data payload delivered to listeners. Omit for no payload.
event_typeYesEvent type to fire, e.g. 'my_custom_event'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, destructiveHint=true, openWorldHint=true, idempotentHint=false) already carry the safety profile, so the bar is lower. The description still adds real value by disclosing the POST endpoint, that effects are listener-dependent, and that a confirmation dict is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then gives mechanism, usage condition, and return in labeled, scannable lines with no filler. Slightly longer than strictly necessary given the schema already documents the parameters, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given annotations cover the mutation/safety profile and an output schema exists (so return values need not be explained), the description covers the key non-obvious behavior: effects depend on registered listeners. Only minor gaps remain, such as permission requirements or restart/persistence implications.

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 both parameters (event_type, event_data) are already fully documented in the schema, and the description largely restates them ('event_data as the JSON body'). Baseline 3 is appropriate since 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+resource ('fire an arbitrary Home Assistant event') and even names the underlying REST endpoint and payload mapping. An agent can distinguish this from siblings such as services_call_service or automations_trigger_automation because it targets raw event firing rather than named services/automations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when: triggering automations or integrations that listen for a specific event type' line gives clear positive guidance, and the note that effect depends on what is registered adds useful scoping. It does not, however, contrast itself with alternatives like calling a service or triggering an automation directly, so routing among siblings still requires inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_list_servicesList available servicesA
Read-onlyIdempotent

List all services Home Assistant currently has registered, optionally filtered by domain.

Calls ha.list_services() (HTTP GET /api/services) and filters the result client-side by domain when given.

Use when: discovering which services and fields a domain supports before calling services_call_service. Returns: list of dicts, one per domain, each with its available services and their fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoService domain filter, e.g. 'light'. Omit to list every domain.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful implementation detail: it calls ha.list_services() via HTTP GET /api/services and filters client-side, which tells the agent how freshness and filtering work. It does not cover auth or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and then adds implementation, usage, and return shape in labeled sentences. It is tight and scannable, though the explicit return description is mildly redundant given the existing output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a simple list tool: purpose, usage context, mechanism, and return format are all covered. Annotations and the output schema supply safety and structure, leaving no critical gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the domain parameter and its omission behavior are already documented. The description adds that filtering is performed client-side, a semantic detail beyond the schema that clarifies what the parameter actually does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('services'), including scope ('all services Home Assistant currently has registered') and optional domain filtering. It distinguishes itself from sibling services_call_service by framing this as discovery before calling a service.

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 'Use when: discovering which services and fields a domain supports before calling services_call_service.' This names the alternative tool and the condition that selects it, giving the agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_media_play_pauseToggle media play/pauseA

Toggle a media player between playing and paused.

Calls media_player.media_play_pause with {"entity_id": entity_id} over HTTP; the resulting state depends on the player's current state.

Use when: a simple play/pause toggle is enough, without checking current state first. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull media_player entity ID to control, e.g. 'media_player.living_room'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write semantics (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description reinforces this usefully: the resulting state depends on the player's current state, which explains the non-idempotency, and it states the return is the list of changed states. It does not mention failure modes when the player is unavailable or unsupported.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the purpose, then implementation, when-to-use, and return shape. No sentence is redundant and the structure follows a natural read 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 single-parameter action with an output schema and safety annotations, the description is essentially complete: purpose, mechanism, non-idempotent behavior, and selection guidance are all present. The return-value sentence is technically redundant given the output schema, which keeps it just short of a 5.

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 entity_id parameter is fully documented in the schema, so the description adds no new parameter detail beyond restating that entity_id is passed. Baseline 3 applies 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Toggle a media player between playing and paused') and even names the underlying service call, so an agent knows exactly what happens. It is scoped to media players, which implicitly separates it from generic entities_toggle, but it does not explicitly name any sibling to route against.

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 an explicit 'Use when' clause ('a simple play/pause toggle is enough, without checking current state first') that gives actionable selection context. It stops short of naming an alternative or a 'when-not' case (e.g. when you want deterministic play vs pause), so it is clear but not fully prescriptive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_media_seekSeek media playback positionA
Idempotent

Seek a media player to an absolute playback position.

Calls media_player.media_seek with {"entity_id": entity_id, "seek_position": position} over HTTP.

Use when: jumping to a specific point in the currently playing media. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
positionYesTarget playback position in seconds from the start of the current media.
entity_idYesFull media_player entity ID to seek, e.g. 'media_player.living_room'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower, and the description still adds value by disclosing the underlying call (`media_player.media_seek` with the exact payload) and the return contract ('the list of states changed by the call'). It does not mention error conditions such as seeking while nothing is playing or positions beyond the media duration.

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 blocks (operation, when-to-use, returns) with no filler. The HTTP/payload sentence is slightly more implementation detail than an agent strictly needs, but it is compact and 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 two-parameter media control tool with a full output schema and complete annotations, the description covers purpose, trigger, parameter mapping, and a return summary. The only missing piece is failure/edge-case behavior, which is a minor gap given the richness of the structured fields.

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 schema already explains both parameters including that position is in seconds from the start of the current media. The description only reproduces the payload mapping, adding no syntax or format detail beyond what the schema provides, 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?

The description states a specific verb and resource ('Seek a media player to an absolute playback position') and scopes it to absolute positions, which cleanly separates it from the sibling play/pause and volume tools. An agent can identify the operation 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 an explicit 'Use when: jumping to a specific point in the currently playing media,' which is a clear triggering condition. It does not name a contrasting alternative or state when not to use it (e.g., relative skips or media not playing), so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_notify_persistent_createCreate a persistent notificationA

Create or replace a persistent notification banner in the Home Assistant UI.

Calls persistent_notification.create with message, optional title and notification_id. Giving the same notification_id again replaces that notification's content in place; omitting it creates a new, separately addressable notification each time.

Use when: showing a UI banner that a person can dismiss, as opposed to a push notification. Not for: a push notification to a device — use services_send_notification. Returns: dict with notification_id and the raw service call result.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoOptional notification title. Omit for no title.
messageYesNotification body text to show in the HA UI.
notification_idNoStable ID for later dismissal via services_notify_persistent_dismiss. Omit to create a new, unaddressable notification each call.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (not read-only, not destructive, not idempotent), so the description needn't restate safety. It adds genuine behavior beyond them: giving the same notification_id replaces content in place, while omitting it creates a new separately addressable notification each call, plus the return shape. It stops short of detailing auth needs or dismissal interaction, but the replacement semantics are a meaningful addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the crucial replacement behavior, then structured as Use when / Not for / Returns. 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 mutation tool with full annotation coverage and an existing output schema, the description is essentially complete: action, replacement semantics, usage routing and return mention are all present. The return detail is redundant given the output schema, 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 coverage is 100%, so the schema already documents all three parameters including the notification_id replacement/dismissal behavior. The description largely restates the schema's own notification_id semantics rather than adding new syntax or format detail. Baseline 3 is appropriate when the schema carries the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create or replace a persistent notification banner in the Home Assistant UI') and even names the underlying service call. It distinguishes itself from the push-notification sibling by contrasting the dismissable UI banner against a device push, so an agent can tell it apart from services_send_notification 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 provides 'Use when' (dismissable UI banner) and 'Not for' (push to a device), routing the agent to the named alternative services_send_notification. When-to-use and when-not-to-use are both stated, nothing left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_notify_persistent_dismissDismiss a persistent notificationA
Idempotent

Dismiss one persistent notification by its ID.

Calls persistent_notification.dismiss with {"notification_id": notification_id} over HTTP; dismissing an already-dismissed or unknown ID is a no-op from this tool's perspective.

Use when: clearing one specific UI banner. Not for: clearing every banner — use services_notify_persistent_dismiss_all. Returns: dict with notification_id and the raw service call result.

ParametersJSON Schema
NameRequiredDescriptionDefault
notification_idYesID of the persistent notification to dismiss, as passed to services_notify_persistent_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, readOnlyHint=false, so the safety profile is covered. The description adds value beyond that by stating the unknown/already-dismissed-ID no-op behavior (extending past simple idempotency to the unknown-ID case) and disclosing the underlying HTTP service call. It stops short of describing rate limits or auth needs, so a 4 rather than 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?

Front-loads the action and scope, then structures the rest as 'Use when / Not for / Returns' with zero filler. Every sentence earns its place; the sibling routing is placed right after the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with an output schema present, the definition covers purpose, scope boundary, the sibling alternative, and error/no-op behavior. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 is fully documented, so baseline is 3. The description adds only a light cross-reference ('as passed to services_notify_persistent_create') that duplicates the schema's own note, so it doesn't lift the score further.

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 ('Dismiss') and resource ('one persistent notification by its ID'), and explicitly distinguishes itself from the sibling services_notify_persistent_dismiss_all. An agent can tell exactly which of the two notification-cleanup tools to pick without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when: clearing one specific UI banner' and 'Not for: clearing every banner — use services_notify_persistent_dismiss_all', naming the alternative and the selecting condition. This is textbook when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_notify_persistent_dismiss_allDismiss all persistent notificationsA
Idempotent

Dismiss every persistent notification currently shown in the Home Assistant UI.

Calls persistent_notification.dismiss_all over HTTP with no data.

Use when: clearing all UI banners at once. Not for: clearing a single banner — use services_notify_persistent_dismiss. Returns: dict with the raw service call result.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true and destructiveHint=false, and the description adds that the call is made over HTTP with no data and that it affects every currently shown banner. It does not state reversibility (dismissed banners are gone) or required auth. Useful addition beyond annotations, but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, front-loaded segments: action, transport, when-to-use, not-for, return. Every sentence earns its place and the routing information comes early.

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 idempotent dismissal with an existing output schema, the description covers purpose, routing, transport, and return type. It omits minor details like the exact result shape or auth requirements, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter count is 0, which gives a baseline of 4. The description correctly notes the service is called with no data, reinforcing that no parameters are expected. No additional parameter meaning exists to add.

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: 'Dismiss every persistent notification currently shown in the Home Assistant UI.' It also names the underlying service call, removing ambiguity. Distinguishes from sibling services_notify_persistent_dismiss by scope (all vs single).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use section ('clearing all UI banners at once') and an explicit not-for section routing the agent to the single-dismiss sibling. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_press_buttonPress a button entityA

Press a button entity, running whatever action it is configured to perform.

Calls button.press with {"entity_id": entity_id} over HTTP.

Use when: running a button entity's configured action, such as a template button or a device's physical-button equivalent. Returns: the list of states changed by the press.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull button entity ID to press, e.g. 'button.restart_service'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, idempotent=false, destructive=false. The description adds real value beyond that: it discloses the underlying call (`button.press` with entity_id over HTTP) and the return payload ('list of states changed'). It does not mention permissions or side effects on the entity beyond its configured action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then the mechanism, then usage and return. Four short sentences, each doing work; the return note is slightly redundant given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering the safety profile, a fully described single parameter, and an output schema, the description supplies enough context to invoke correctly. The only gap is the absence of explicit sibling alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single documented parameter, so the schema already carries full parameter meaning. The description repeats entity_id only via the call signature; 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 ('Press a button entity') and explains the effect ('running whatever action it is configured to perform'), which distinguishes it from siblings like entities_toggle or services_call_service. An agent can tell what this 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a 'Use when' clause with concrete examples (template button, physical-button equivalent). It lacks explicit alternatives or when-not guidance (e.g., vs entities_toggle or generic services_call_service), so it stops short of the top tier.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_reload_configReload domain configurationA
Idempotent

Reload one domain's configuration from disk by calling its reload action.

Calls <domain>.reload (e.g. automation.reload, input_boolean.reload) over HTTP with no data.

Use when: applying YAML changes for automations, scripts, scenes or input helpers without restarting Home Assistant. Not for: reloading every helper domain in one call — use helpers_reload_helpers. Returns: the list of states changed by the reload.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesDomain to reload, e.g. 'automation', 'script' or 'scene'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readonly, idempotent, non-destructive, closed-world. The description adds meaningful context beyond that: the call carries no data payload and the purpose is picking up on-disk YAML changes without a restart. It does not contradict any annotation, though it stops short of discussing error behavior if the domain is invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then cleanly segmented into mechanism, 'Use when', 'Not for', and 'Returns'. Every line carries distinct information with no 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 single-parameter mutation tool, the description covers action, mechanism, selection criteria, alternative routing, and even the return value (redundant given the output schema, but harmless). 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already gives examples, so baseline is 3. The description goes further by explaining what the parameter actually does semantically — it maps to the `<domain>.reload` service — and adds 'input_boolean' as an example not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Reload one domain's configuration from disk') and explains the mechanism ('calls `<domain>.reload` over HTTP with no data'). An agent can distinguish it from sibling reload tools like automations_reload_automations or themes_reload_themes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause (applying YAML changes for automations, scripts, scenes, input helpers without restarting HA) and an explicit 'Not for' clause that routes the agent to helpers_reload_helpers. This is the full when/when-not/alternative pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_render_templateRender a Jinja2 templateA
Read-onlyIdempotent

Render a Jinja2 template string once through HA's template engine over HTTP.

Posts to /api/template with {"template": template} and returns the rendered text.

Use when: testing a template's output before saving it into an automation, script or template sensor. Not for: rendering through the WebSocket subscription transport — use ws_render_template. Returns: the rendered template as plain text.

ParametersJSON Schema
NameRequiredDescriptionDefault
templateYesJinja2 template string to render, e.g. '{{ states("sensor.temp") }}'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds material context beyond that: the HTTP transport, the exact endpoint and request payload shape, and the return type ('rendered template as plain text'). It doesn't cover failure behavior (e.g., render errors in the template), but this is solid 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?

Front-loaded one-line purpose, then transport detail, then Use when / Not for / Returns. Every sentence earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, yet the description still names the plain-text return. For a single-parameter read tool, the purpose, transport, endpoint, usage conditions and the sibling exclusion are all present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter already documents the Jinja2 syntax with an example. The description's payload mention ('{ "template": template }') restates the schema rather than adding new meaning. Baseline 3 applies 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+resource (render a Jinja2 template) and adds the crucial transport qualifier: 'once through HA's template engine over HTTP', posting to `/api/template`. This precisely distinguishes it from the sibling ws_render_template, which it names explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: testing a template's output before saving it into an automation, script or template sensor' plus an explicit 'Not for:' exclusion routing to ws_render_template. Both the when and the when-not are stated with the alternative named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_send_notificationSend a notificationA

Send a notification through a Home Assistant notify service.

Calls notify.<target> (or plain notify.notify when target is omitted) with message and optional title; target may include the domain (notify.xyz) or be a bare service name, but a dotted target must name the notify domain itself (ADR-0006 D6) — otherwise it would let any domain.service be reached under cover of a "notification". Each call dispatches a new notification to whatever device or channel that service delivers to, which can be outside the local network (e.g. a phone push).

Use when: pushing a message to a person or device through a configured notify service. Not for: an in-UI banner tracked by an ID — use services_notify_persistent_create. Returns: the list of states changed by the call (notify services typically change none). Errors: {"error": "invalid_notify_target", "message": ...} when a dotted target names a domain other than notify; {"error": "invalid_service_name"} when the part after notify. is not itself a bare [A-Za-z0-9_]+ service name (e.g. a second dot).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoOptional notification title. Omit for no title.
targetNoNotify service to use, e.g. 'mobile_app_phone' or 'notify.mobile_app_phone'. Omit to use the default 'notify' service.
messageYesNotification body text to deliver.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, openWorldHint=true and idempotentHint=false, but the description adds substantially more: each call dispatches a new notification, it can reach outside the local network (phone push), the ADR-0006 D6 dotted-target constraint, the return value (list of changed states), and concrete error shapes/invalid_notify_target. This is rich context beyond 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?

Front-loads what the tool does, then cleanly segments Use when / Not for / Returns / Errors. The description is long but every section carries distinct, actionable information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent, open-world dispatch tool with an output schema, the description covers target resolution rules, side effects, return shape, and failure modes. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the schema already documents message/title/target, but the description adds a non-obvious constraint absent from the schema: a dotted `target` must name the `notify` domain and the part after `notify.` must be a bare service name. This meaningfully extends the parameter contract beyond the field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Send a notification through a Home Assistant notify service') and specifies exactly what it calls (`notify.<target>` or `notify.notify`). It distinguishes itself from sibling services_notify_persistent_create by explaining that it dispatches to a device/channel rather than an in-UI banner.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: pushing a message to a person or device through a configured notify service' and 'Not for: an in-UI banner tracked by an ID — use services_notify_persistent_create.' It names the alternative and the condition that selects it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_set_climate_modeSet climate modeA
Idempotent

Set a climate entity's heating/cooling mode.

Calls climate.set_hvac_mode with {"entity_id": entity_id, "hvac_mode": hvac_mode} over HTTP.

Use when: switching a thermostat between heat/cool/auto/off/fan_only/dry. Not for: the target temperature — use entities_set_value. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull climate entity ID to change, e.g. 'climate.living_room'.
hvac_modeYesTarget mode: one of heat, cool, auto, off, fan_only, dry.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotent=true, destructive=false, and openWorld=false, so safety is covered. The description adds useful context beyond annotations: it discloses the exact service call, the JSON payload shape, the HTTP transport, and the return value (changed states) — though the return detail is partly redundant given an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, followed by the underlying call, then clearly labeled Use when / Not for / Returns lines. Tight and zero waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param, fully-specified mutation, the definition covers purpose, routing to the correct sibling, transport/payload, and return behavior. Nothing needed to invoke it correctly is missing, even though some of the return information overlaps the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (entity_id, hvac_mode) are already fully documented in the schema, including the mode list. The description restates the mode values but adds no syntax, format, or edge-case detail beyond what the schema provides; 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 (Set) and resource (a climate entity's heating/cooling mode), and names the exact underlying call `climate.set_hvac_mode`. An agent can distinguish it from siblings like services_set_cover_position or entities_set_value 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 gives when to use (switching a thermostat between heat/cool/auto/off/fan_only/dry) and an explicit not-for clause that routes temperature changes to `entities_set_value`. This is the full when/when-not/alternative pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_set_cover_positionSet cover positionA
Idempotent

Set a cover/blind/shutter to a specific open position.

Calls cover.set_cover_position with {"entity_id": entity_id, "position": position} over HTTP.

Use when: moving a cover to a specific percentage rather than fully open/closed. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
positionYesTarget position, 0 (closed) to 100 (open).
entity_idYesFull cover entity ID to move, e.g. 'cover.living_room_blind'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, idempotent=true, destructive=false, so the safety profile is covered. The description adds the underlying service call (cover.set_cover_position) and the exact payload shape, which is useful context beyond the structured fields. The stated return value is somewhat redundant given an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then usage and return in short labeled lines. The inline payload block duplicates the schema's parameter names exactly, which is mild redundancy rather than waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety/idempotency, full schema coverage, and an output schema for return values, the description supplies the remaining when-to-use context. The only gap is not addressing the closely related tilt sibling, which would help disambiguation.

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 both parameters, including the 0-100 range for position, are fully documented in the schema. The description merely restates the payload keys without adding format or edge-case semantics, so baseline 3 is correct.

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 (set) and resource (cover/blind/shutter) with the exact operation (specific open position), and clarifies the distinction from full open/close. It does not, however, name or differentiate itself from the adjacent services_set_cover_tilt sibling, so an agent must infer scope from the name 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?

"Use when: moving a cover to a specific percentage rather than fully open/closed" gives a clear positive selection condition. It stops short of naming an alternative tool (e.g. set_cover_tilt) for the when-not case, so routing against the close sibling relies on inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_set_cover_tiltSet cover tilt positionA
Idempotent

Set a cover's slat/tilt position independently of its open/closed position.

Calls cover.set_cover_tilt_position with {"entity_id": entity_id, "tilt_position": tilt_position} over HTTP.

Use when: adjusting slat angle on a cover that supports tilt. Not for: the cover's overall open/closed position — use services_set_cover_position. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull cover entity ID to tilt, e.g. 'cover.living_room_blind'.
tilt_positionYesTarget tilt position, 0 (closed) to 100 (open).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the mutation and safety profile is covered structurally. The description adds value by naming the underlying service call and payload shape and noting it returns changed states, though it does not discuss what happens if the cover lacks tilt support.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what the tool does, then the mechanism, then when/when-not, then the return value — each in a short, scannable line with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety/idempotency, a full input schema, and an output schema, the description needs only purpose, routing, and mechanism — all present. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (entity_id, tilt_position with 0-100 range) are already fully documented. The description only restates them in the service-call payload form and adds no range, format, or constraint detail beyond the schema. 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 (set) and resource (cover tilt/slat position) and explicitly distinguishes itself from services_set_cover_position, the nearest sibling. An agent can select it 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?

Provides an explicit 'Use when' condition (adjusting slat angle on a cover that supports tilt) and a 'Not for' exclusion that routes to the correct alternative tool by name. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_set_light_colorSet light color and brightnessA
Idempotent

Set a light's color, color temperature and/or brightness in one call.

Calls light.turn_on with only the given fields set (rgb_color, color_temp_kelvin, brightness); a given color_temp (mireds) is converted to Kelvin (round(1_000_000 / mireds)) first, since HA's light.turn_on no longer accepts mireds.

Use when: adjusting a light's color/brightness, whether it is currently on or off — light.turn_on also turns it on. Not for: a plain on/off/toggle with no color change — use entities_turn_on, which supports the same brightness/color options for lights alongside generic on/off for any domain. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesFull light entity ID to change, e.g. 'light.kitchen'.
rgb_colorNoTarget RGB color as [r, g, b], each 0-255. Omit to leave color unchanged.
brightnessNoTarget brightness, 0-255. Omit to leave brightness unchanged.
color_tempNoDeprecated mired color temperature. Converted to Kelvin; prefer color_temp_kelvin.
color_temp_kelvinNoTarget color temperature in Kelvin. Omit to leave it unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation safety profile is covered. The description adds substantial behavioral context beyond annotations: it calls light.turn_on with only the given fields, converts deprecated mireds to Kelvin, turns the light on if it is off, and returns the list of changed states. This is unusually transparent for a service wrapper.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then structured into implementation notes, use-when, not-for, and returns. Each section earns its place and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, rich annotations, and full schema coverage, so the description does not need to explain return values. It nevertheless completes the picture by covering behavior, parameter conversion, light-on side effect, and sibling routing. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter thoroughly. The description still adds semantic value by explaining that only provided fields are forwarded and by giving the exact mired-to-Kelvin conversion formula, which the schema only alludes to. It does not add meaning for entity_id, but the parameter contract is otherwise clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: set a light's color, color temperature, and/or brightness in one call. It distinguishes itself from the sibling entities_turn_on by explaining that entities_turn_on is for plain on/off/toggle without color changes. An agent can identify the tool's exact purpose 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?

It gives explicit when-to-use guidance: adjusting color/brightness whether the light is on or off. It also gives explicit when-not-to-use guidance: use entities_turn_on for plain on/off/toggle with no color change. This directly routes the agent between competing siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

services_set_volumeSet media player volumeA
Idempotent

Set a media player's volume level.

Calls media_player.volume_set with {"entity_id": entity_id, "volume_level": volume} over HTTP.

Use when: setting an exact volume rather than stepping it up/down. Returns: the list of states changed by the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
volumeYesTarget volume level, 0.0 (silent) to 1.0 (maximum).
entity_idYesFull media_player entity ID to change, e.g. 'media_player.living_room'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, readOnlyHint=false. The description goes beyond them by naming the underlying service called (media_player.volume_set), the HTTP transport, and the return shape (list of changed states). No auth or rate-limit context, but this is solid 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?

Front-loaded with the core action, then labeled 'Use when' and 'Returns' clauses. Every sentence earns its place; the inline payload documents the exact service invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained (though they are). With 2 fully-documented params, annotations covering the safety profile, and the underlying service named, 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both params fully. The description only adds the mapping of 'volume' to the underlying 'volume_level' key, which is minor. 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 ('Set a media player's volume level') and immediately distinguishes itself from sibling volume-stepping operations. An agent can tell this apart from services_media_play_pause / services_media_seek 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?

Explicit when-to-use clause: 'setting an exact volume rather than stepping it up/down.' This names the alternative behavior pattern, though it does not name a sibling tool by name or give when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snapshot_get_area_snapshotGet area-scoped HA snapshotA
Read-onlyIdempotent

Return states, devices and entities for one area in a single call.

Convenience wrapper that calls snapshot_get_snapshot with include=["states", "devices", "entities", "areas"] and area_id fixed to the given area; it adds no filtering beyond summary.

Use when: exploring or controlling everything in one physical area without composing snapshot_get_snapshot's include/area_id arguments by hand. Not for: a snapshot spanning several areas or other sections — call snapshot_get_snapshot directly; entity registry rows without state values — use areas_get_area_entities; live state values without registry context — use areas_get_area_states. Returns: same dict shape as snapshot_get_snapshot with include=["states", "devices", "entities", "areas"]. Limits: no pagination; every state/device/entity in the area is returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
area_idYesArea registry ID to scope the snapshot to; states, devices and entities outside this area are excluded.
summaryNoIf true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive/non-open-world, so the safety profile is covered. The description adds genuine extra context beyond that: it discloses the wrapper internals (fixed include list and area_id), states the only added filter is `summary`, and documents the no-pagination limit that every state/device/entity is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded summary sentence, then clearly labeled Use when / Not for / Returns / Limits blocks. It is longer than a two-parameter tool strictly needs, but every section carries distinct information, so the length is largely earned.

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 rich annotations, a full output schema, and documented return shape ('same dict shape as snapshot_get_snapshot'), the description leaves no gap an agent needs to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds meaning the schema cannot express: it explains that area_id is effectively pinned, that include is forced to four sections, and that `summary` is the sole filter knob. This clarifies what the two parameters actually control.

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 (return states/devices/entities for one area) and immediately positions itself as a wrapper over `snapshot_get_snapshot`. The agent can distinguish it from that sibling and from areas_get_area_entities/areas_get_area_states 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?

Explicit 'Use when' and 'Not for' sections, each naming the correct alternative (snapshot_get_snapshot for multi-area, areas_get_area_entities for registry rows, areas_get_area_states for live state). Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snapshot_get_snapshotGet filtered HA snapshotA
Read-onlyIdempotent

Return a single filtered snapshot combining HA states, registries and config.

Reads live states via ha.get_states() and, depending on include, the area/floor/device/entity registries and config entries over HTTP in one call, applies domains/area_id filtering and limit/offset pagination to the states list, and returns one dict keyed by section name. Every call in this path is a read; nothing here writes to HA.

Use when: a client needs several registries and/or states together and should not spend several round-trips assembling that context. Not for: a single registry without filtering — use entities_list_entities or ws_get_states for a plain state list, or areas_list_devices/ devices_list_devices for a plain device list. Returns: dict keyed by requested section (states, areas, floors, devices, entities, integrations, config), plus _meta (echoed filters and per-section counts) and _states_total (pre-pagination count) when states is included. Errors: {"error": "unknown_include", "unknown": [...], "valid": [...]} when include names a section outside the valid set. Limits: limit/offset paginate only the states section; every other section is always returned in full.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of states to return after filtering, for pagination on large setups. Omit for no limit.
offsetNoNumber of filtered states to skip before applying limit, for pagination. 0 starts from the first matching state.
area_idNoArea registry ID; keeps only states/devices/entities assigned to this area, directly or via their device. Omit for no area filter.
domainsNoEntity domain filter applied to the states/entities sections, e.g. ['light', 'climate']. Omit to include every domain.
includeNoSections to return. Omit for the default states/areas/devices/entities/integrations set. Valid values: states, areas, floors, devices, entities, integrations, config.
summaryNoIf true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes; ignored when state_fields is given.
state_fieldsNoExplicit per-state keys to return, overriding summary. Valid: entity_id, state, friendly_name, attributes, last_changed, last_updated. Omit to use summary instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds material context beyond them: reads go over HTTP via ha.get_states(), 'nothing here writes to HA', the exact error shape for an invalid include value, and the important constraint that limit/offset paginate only the states section. This is a strong complement to the structured safety hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded opening sentence, then clearly labelled Use when / Not for / Returns / Errors / Limits blocks. Despite covering a rich behaviour surface, every sentence carries actionable information with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing and seven parameters, the description supplies the error contract, the pagination scoping rule, the section-keyed return shape, and _meta/_states_total semantics. An agent has everything needed to invoke and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description still adds value by clarifying that filtering applies to states/entities, that include defaults to the states/areas/devices/entities/integrations set, and that pagination affects only the states section while other sections are returned in full. The schema already documents most parameter behaviour, so it stops short of a 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 concrete verb and resource ('Return a single filtered snapshot combining HA states, registries and config') and enumerates exactly which sections are merged. It also explicitly names the sibling tools it is not (entities_list_entities, ws_get_states, areas_list_devices, devices_list_devices), so an agent can discriminate it from neighbours without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' condition (a client needs several registries and/or states together and should avoid multiple round-trips) and a 'Not for' exclusion that routes each rejected case to a specific alternative tool. Both when-to-use and when-not-to-use are covered with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statistics_get_energy_statisticsGet energy sum statistics for recent daysA
Read-onlyIdempotent

Get sum statistics for every energy-related sensor over the last N days.

Auto-discovers 'sum' statistic IDs via WS recorder/list_statistic_ids, keeps only those whose unit is an energy/volume unit (kWh, MWh, Wh, m³, ft³, L, gal — instantaneous power sensors in 'W' are excluded since a 'sum' statistic on a power sensor is not a meaningful energy value), then fetches sum/change via WS recorder/statistics_during_period for the requested window. This is a convenience wrapper around statistics_get_statistics.

Use when: a quick overview of overall energy consumption trends is needed without first listing statistic IDs by hand. Not for: a hand-picked set of statistic IDs or non-energy sensors — use statistics_get_statistics directly. Returns: {"days", "period", "statistic_count", "data": {statistic_id: {"unit": ..., "rows": [{"start": <date>, "change": ..., "sum": ...}, ...]}}}, or {"message": "..."} when no energy statistic IDs are found. Errors: {"error": "days must be between 1 and 365"} for an out-of-range days; {"error": "..."} when either WS call raises or returns an unexpected shape.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of days back from now to include, between 1 and 365.
periodNoAggregation bucket size passed to the underlying statistics query, e.g. 'day', 'week', 'month'.day

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/safe profile, but the description goes much further: it names the two WS calls used, explains the unit-filtering logic (excludes 'W' power sensors and why), describes the wrapper relationship, and documents error conditions. This is rich behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with purpose first, then mechanism, then use/not-for, returns, errors. Information-dense with no wasted sentences, though the parenthetical unit explanation is somewhat verbose and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a 2-param read tool with output schema: description covers purpose, routing, mechanics, returns shape summary, and error cases. An agent can invoke it confidently without further discovery.

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. The description adds meaning by stating the error for out-of-range days, clarifying the window as 'last N days' from now, and explaining that period is passed to the underlying statistics query, which adds slight value 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 (Get sum statistics) and resource (energy-related sensors over last N days), and explicitly distinguishes itself from the sibling statistics_get_statistics by describing its auto-discovery mechanism and energy-only filter.

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?

Has explicit 'Use when' (quick overview of overall energy consumption trends without listing statistic IDs by hand) and 'Not for' (hand-picked statistic IDs or non-energy sensors — use statistics_get_statistics directly) sections. This is textbook routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statistics_get_statisticsGet aggregated statistics for a time rangeA
Read-onlyIdempotent

Get aggregated recorder statistics for one or more IDs over a time range.

Calls WS recorder/statistics_during_period with start/end parsed into UTC timestamps, converts each row's epoch start back to an ISO string, and rounds numeric aggregates to 4 decimals.

Use when: analysing energy/temperature/etc. trends over hours, days, weeks or months using the recorder's pre-aggregated data. Not for: raw short-term state changes between two points in time — use history_get_state_history instead. Returns: {"period", "start", "end", "types", "data": {statistic_id: [{"start": <iso>, "sum": ..., "mean": ..., ...}, ...]}}. Errors: {"error": "..."} for an empty statistic_ids, an invalid period/types value, an unparsable start/end, a non-dict WS response, or when the WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd of the range, same formats as `start`. Omit to use the current time.
startYesStart of the range: a date ('2024-01-01') or datetime ('2024-01-01T00:00:00').
typesNoWhich aggregates to include per bucket, any of 'sum', 'mean', 'min', 'max', 'state', 'change'. Omit to use ['sum', 'mean', 'min', 'max'].
periodNoAggregation bucket size: one of '5minute', 'hour', 'day', 'week', 'month'.day
statistic_idsYesEntity or statistic IDs to fetch, e.g. ['sensor.energy_consumption']. Discover valid values with `statistics_list_statistic_ids`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond them: it reveals the WS call made, that start/end are parsed to UTC, that epoch starts are converted to ISO, that numeric aggregates are rounded to 4 decimals, and it enumerates error conditions. The Returns block partially duplicates the output schema, which keeps this just below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then use/not-for routing, then return and error contract. Every line is scannable and earns its place, though the Returns paragraph overlaps the output schema and costs a little efficiency.

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 5-parameter read tool with full schema coverage and an output schema, this is complete: it covers purpose, routing, defaults, output transformation, and a full error taxonomy, leaving nothing an agent needs to call it correctly unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description goes further by explaining cross-cutting parameter behavior (start/end parsed into UTC timestamps) and the rounding applied to results, adding meaning the schema does not carry.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (aggregated recorder statistics) plus the scope (one or more IDs over a time range). It names the exact upstream WS command and distinguishes itself from history_get_state_history and statistics_list_statistic_ids, so an agent can route without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains an explicit 'Use when' clause (trend analysis over hours/days/weeks/months using pre-aggregated data) and an explicit 'Not for' clause that names the alternative tool (history_get_state_history) and the condition that selects it (raw short-term state changes).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statistics_get_statistics_metadataGet statistics metadataA
Read-onlyIdempotent

Get metadata (unit, source, name) for specific recorder statistic IDs.

Calls WS recorder/get_statistics_metadata and returns one entry per requested ID.

Use when: you already know the statistic IDs and only need their unit/source/name, without their historical values. Not for: the actual aggregated values — use statistics_get_statistics. Returns: list of {"statistic_id", "name", "source", "unit", "has_sum", "has_mean"} dicts. Errors: [{"error": "..."}] when the WS response isn't a list or the WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
statistic_idsYesStatistic IDs to fetch metadata for, e.g. ['sensor.energy_consumption']. Discover valid values with `statistics_list_statistic_ids`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description goes further by disclosing the underlying WS call, the one-entry-per-ID return shape, and the error format when the WS response isn't a list or the call raises. This is meaningful added context, though nothing about pagination or large-ID 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?

Front-loaded one-line purpose followed by cleanly labeled Use when / Not for / Returns / Errors sections. Every sentence carries information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, yet the description still summarizes the returned fields and error shape, and it fully covers routing and preconditions. Nothing an agent needs to select or invoke this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

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 is documented in the schema with an example value and a pointer to statistics_list_statistic_ids. The description restates that IDs must be known but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) + resource (statistics metadata) and the exact fields returned (unit, source, name), and explicitly differentiates itself from the sibling statistics_get_statistics. An agent can distinguish it from statistics_get_statistics and statistics_list_statistic_ids without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' clause (IDs already known, only need unit/source/name) and a 'Not for' exclusion that routes to the correct alternative (statistics_get_statistics for aggregated values). Conditions and alternatives are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statistics_list_statistic_idsList recorder statistic IDsA
Read-onlyIdempotent

List recorder statistic IDs of the requested type.

Calls WS recorder/list_statistic_ids and returns one entry per statistic the recorder tracks, with its source and unit.

Use when: discovering which entities have long-term statistics before calling statistics_get_statistics or statistics_get_statistics_metadata. Not for: raw short-term state history — use history_get_state_history instead. Returns: list of {"statistic_id", "name", "source", "unit", "has_sum", "has_mean"} dicts. Errors: [{"error": "..."}] when statistic_type is not 'sum'/'mean', when the WS response isn't a list, or when the WS call raises.

ParametersJSON Schema
NameRequiredDescriptionDefault
statistic_typeNoWhich kind of statistic to list: 'sum' for counters (energy, gas, water) or 'mean' for sensors (temperature, humidity).sum

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, but the description adds meaningful context: the exact WS endpoint, the returned entry shape, and specific error conditions when statistic_type is invalid or the WS response is malformed. This gives the agent a richer behavioral picture than annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, immediately followed by use/when-not guidance, then return shape and error behavior. Every sentence carries useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description coherently explains the result shape and failure modes, and it routes the agent to the right sibling tools. For a one-parameter read tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the allowed values and meaning of statistic_type are already documented in the input schema. The description adds useful error semantics by stating that errors occur when statistic_type is not 'sum' or 'mean', which goes slightly 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: list recorder statistic IDs of the requested type. It also names the underlying WS call and clarifies that it returns one entry per tracked statistic with source and unit, which distinguishes it from related statistics and history tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it: discovering entities with long-term statistics before calling statistics_get_statistics or statistics_get_statistics_metadata. It also states when not to use it: raw short-term state history should use history_get_state_history instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_create_backupCreate a Supervisor backupA

Create a new Supervisor backup, full or partial.

Calls POST /backups/new/full when neither addons nor folders is given, otherwise POST /backups/new/partial with those slugs/folders. Unlike system_create_backup, this never deletes older backups — it only adds a new one.

Use when: a named, partial and/or password-protected backup is needed on a Supervisor install. Not for: a quick backup using the instance's own automatic-backup settings (which may prune old ones) — use system_create_backup. Returns: Supervisor's backup-job result, including the new backup's slug on success. Errors: {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} on a timeout or failure — check supervisor_list_backups before retrying. Limits: a full backup can take minutes; on a timeout error, check supervisor_list_backups before retrying rather than assuming failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name to store on the new backup.
addonsNoAdd-on slugs to include for a partial backup. Omit together with `folders` for a full backup of everything.
foldersNoFolder names to include for a partial backup, e.g. 'share', 'ssl', 'media', 'addons/local'. Omit together with `addons` for a full backup of everything.
passwordNoPassword to encrypt the backup with. Omit for an unencrypted backup.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false. The description adds substantial behavioral context beyond that: it explains the full-vs-partial endpoint selection, clarifies that older backups are never deleted, documents the required SUPERVISOR_TOKEN environment variable, describes HTTP and timeout error shapes, and warns that full backups can take minutes. This is rich operational disclosure that goes well past the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then structured into Use when, Not for, Returns, Errors, and Limits sections. Every sentence adds distinct value, and there is no redundant restatement of the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a non-idempotent, mutating backup-creation tool with four parameters, this description covers the necessary context: when to use it versus system_create_backup, endpoint behavior, authentication failures, timeout handling, and expected return content. An output schema exists, but the description still helpfully notes that a new backup slug is returned on success.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description still adds useful semantics by explaining the conditional endpoint behavior: full backup when neither addons nor folders is given, otherwise partial backup using those slugs/folders. It also frames password as enabling a password-protected backup, which reinforces the parameter's purpose.

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 (Create), resource (Supervisor backup), and scope (full or partial), and explicitly distinguishes itself from system_create_backup by noting it never deletes older backups. An agent can immediately understand what the tool does and how it differs from the closest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' guidance, naming system_create_backup as the alternative for quick automatic backups that may prune old ones. It also tells the agent to check supervisor_list_backups before retrying after a timeout, giving clear operational context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_delete_backupDelete a Supervisor backupA
DestructiveIdempotent

Permanently delete one backup after an explicit confirmation.

Calls DELETE /backups/<slug>. Without confirm=True nothing is deleted; the call only returns a confirmation prompt. There is no undo once the backup file is gone — a backup is itself the undo mechanism for every other change in this add-on.

Use when: cleaning up a backup that is confirmed to be no longer needed. Not for: any situation where the backup might still be needed — there is no recovery after this call, even with confirm=True. Returns: Supervisor's delete result when confirmed, otherwise a confirmation prompt. Errors: {"error": "invalid_slug"} for a bad slug; returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} if the slug does not exist. Limits: requires confirm=True; deletion is immediate and permanent with no undo once confirmed.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBackup slug to delete, from `supervisor_list_backups`.
confirmNoSet true to actually delete the backup. False (default) performs no action and instead returns a confirmation prompt; the backup is not looked up or touched in that case.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the safety profile is known, yet the description adds substantial context beyond it: the confirm gate and the fact that nothing is looked up when confirm is false, the irreversibility ('a backup is itself the undo mechanism'), and the token/add-on prerequisite. It even enumerates concrete error payloads.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the single most important fact (permanent, confirmation-gated) and cleanly sectioned into Use when / Not for / Returns / Errors / Limits. Slight redundancy: the no-undo warning appears twice (opening paragraph and Limits), and Returns/Errors partially restate the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, output-schema-bearing mutation tool, the description covers everything an agent needs: prerequisites, confirmation flow, irreversibility, return shape and specific error cases. Having an output schema means the Returns/Errors detail is a bonus rather than a necessity.

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 both parameters (slug, confirm) are already fully documented there, including the same 'returns a confirmation prompt' behavior. The description reinforces the confirm gate but adds no syntax or value 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?

States a specific verb + resource ('Permanently delete one backup') and adds the crucial qualifier 'after an explicit confirmation'. It also names the sibling that supplies the slug (`supervisor_list_backups`), letting an agent separate it from supervisor_create_backup / supervisor_restore_backup without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Its structured 'Use when: cleaning up a backup that is confirmed to be no longer needed' and 'Not for: any situation where the backup might still be needed' sections give explicit inclusion and exclusion criteria plus the reason (no recovery). Nothing about routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_get_addonGet add-on detailsA
Read-onlyIdempotent

Get full Supervisor info for one add-on, with secret option values redacted.

Calls GET /addons/<slug>/info: every field Supervisor stores for that add-on (options schema, current options, ports, boot mode, version, state and more), except options values are replaced with a fixed placeholder wherever the schema marks a field a password, the key name looks like a secret (password/pass/pwd, token, api_key, secret, credential, private, key as a word/suffix), or the value is a URL with inline credentials (scheme://user:pass@host) — covers nexus's own API key and other add-ons' secrets/connection strings alike, recursively through nested groups and lists. An empty/unset value stays empty. Adds redacted_fields: {"path", "reason"} dicts.

Use when: the full add-on record is needed, e.g. before editing its options with supervisor_set_addon_options, which accepts the same placeholder back for an unchanged secret field without overwriting it. Not for: a quick overview across all add-ons — use supervisor_list_addons. Returns: Supervisor's add-on info payload with secret-looking options values replaced by a placeholder, plus redacted_fields. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} if the slug does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug, e.g. from `supervisor_list_addons`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint, idempotentHint and destructiveHint, but the description adds a rich redaction contract (fixed placeholder, empty values stay empty, redacted_fields with path and reason, recursive redaction through nested groups and lists) plus an errors section naming invalid_slug, missing SUPERVISOR_TOKEN, and HTTP-status failures. It does not strictly contradict any annotation. A minor gap is that it doesn't restate the read-only guarantee.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It front-loads the redaction behavior and usage guidance and separates content into Purpose, Redaction, Use when, Not for, Returns and Errors sections. The redaction enumeration (password/pass/pwd, token, api_key, secret, credential, private, key) is verbose and could be tightened, costing one point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having output schema the description still covers the relevant parts of the return (redacted options values plus redacted_fields), states the empty-value behavior, and documents failure modes. Nothing an agent needs to call this 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 the schema already documents the single slug parameter. The description adds a cross-reference to supervisor_list_addons as the source of slugs but no syntax or format detail beyond what the schema provides, so the baseline of 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get full Supervisor info for one add-on') and names the sibling it is not ('Not for: a quick overview across all add-ons — use supervisor_list_addons'). An agent can distinguish it from supervisor_list_addons 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?

Explicit 'Use when' and 'Not for' clauses name concrete alternatives (supervisor_set_addon_options for editing, supervisor_list_addons for a quick overview) along with the exact condition that selects each.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_get_addon_logsGet add-on log linesA
Read-onlyIdempotent

Get the most recent log lines from one add-on.

Calls GET /addons/<slug>/logs, which returns plain text, and keeps only the last lines lines.

Use when: debugging one add-on's runtime behaviour. Not for: the ESPHome add-on's per-device compile/upload logs — use esphome_get_addon_logs if that distinction matters to the caller. Returns: {"logs": "<joined log lines>"}. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "SUPERVISOR_TOKEN not set or empty response"} when the token is missing; {"error": "HTTP <status>", "detail": ...} on a Supervisor API error.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug to fetch logs for, e.g. from `supervisor_list_addons`.
linesNoMaximum number of most-recent log lines to return. 100 by default; 0 or negative returns the full fetched log text.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context: the underlying GET endpoint, that it returns plain text, truncation behavior for `lines`, the exact return shape, and specific error cases including missing token. This goes beyond the annotations, though it could still mention authentication prerequisites more directly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then structured with 'Use when', 'Not for', 'Returns', and 'Errors' labels. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, two-parameter tool with full schema coverage and an output schema, the description is complete: it states purpose, usage boundaries, the alternative tool, return shape, and error modes. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents both `slug` (with example source) and `lines` (default and 0/negative behavior). The description references `lines` only obliquely ('keeps only the last `lines` lines'), adding no meaning beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get the most recent log lines from one add-on') and explicitly names the sibling tool it is not, `esphome_get_addon_logs`. An agent can distinguish this from other log-related siblings 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?

It provides explicit 'Use when' (debugging one add-on's runtime behaviour) and 'Not for' (ESPHome per-device compile/upload logs) guidance, and names the alternative tool. This is precisely the routing information an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_get_addon_statsGet add-on resource statsA
Read-onlyIdempotent

Get an add-on's current runtime resource usage.

Calls GET /addons/<slug>/stats for CPU, memory, network and disk I/O figures at the moment of the call.

Use when: checking whether an add-on is consuming unexpected resources. Not for: historical usage over time — this returns only a snapshot. Returns: Supervisor's raw stats payload (CPU percent, memory usage/limit, network and block I/O counters). Errors: {"error": "invalid_slug"} for a bad slug; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} if the add-on is not running.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug to fetch stats for, e.g. from `supervisor_list_addons`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe-read profile (readOnlyHint, idempotentHint, destructiveHint false), and the description goes well beyond them by disclosing the raw return shape (CPU percent, memory usage/limit, network/block I/O counters) and three concrete error modes, including the SUPERVIZOR_TOKEN env-var prerequisite. That auth/environment constraint is exactly the kind of context an agent cannot infer from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then scoping, returns, and errors in clearly labeled sections, so an agent can scan it quickly. The error block is somewhat verbose (the full token-error string is quoted), which is slightly more than strictly needed, but every line still carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only stats tool with an output schema, this description covers purpose, when-to-use, when-not-to-use, return shape, and failure modes. 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%, so the single slug parameter is already fully documented in the schema, including the pointer to supervisor_list_addons. The description adds no further slug syntax or format detail, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb ('Get') and resource ('an add-on's current runtime resource usage') and even discloses the backing endpoint GET /addons/<slug>/stats. It explicitly distinguishes this snapshot tool from historical-usage tools, so an agent can tell it apart from siblings like supervisor_get_addon_logs 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?

The description gives an explicit 'Use when' trigger ('checking whether an add-on is consuming unexpected resources') and an explicit 'Not for' exclusion ('historical usage over time — this returns only a snapshot'). It also routes the agent to supervisor_list_addons as the source of slugs, 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.

supervisor_get_core_infoGet HA Core infoA
Read-onlyIdempotent

Get info about the Home Assistant Core container.

Calls GET /core/info for its version, CPU architecture and machine type.

Use when: checking Core's version/arch, as opposed to the Supervisor or host. Not for: HA's own location/units/component config — use history_get_ha_config. Returns: Supervisor's raw Core info payload (version, arch, machine). Errors: {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description still adds genuine context: the underlying endpoint, the specific error payload returned when SUPERVISOR_TOKEN is missing, and the requirement that Nexus run as an HA add-on. No behavioral trait beyond that (e.g. rate limits) is disclosed, but this is solid 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and clearly partitioned into Use when / Not for / Returns / Errors. Slightly redundant in that the endpoint line and the Returns line both restate version/arch/machine, which duplicates what the output schema already carries, but every block is otherwise useful.

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?

All call-relevant facts are present: the endpoint, the auth prerequisite and its failure mode, and differentiation from siblings. The return-value detail is redundant given the output schema but harmless, 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 per the rubric the baseline is 4. There is no parameter surface for the description to clarify, and it correctly does not invent any.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (get info about the Home Assistant Core container) and names the exact endpoint and fields returned (version, CPU architecture, machine type). It explicitly distinguishes itself from the Supervisor and host info siblings, so an agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit 'Use when' (checking Core version/arch vs Supervisor or host) and 'Not for' clauses that name the alternative tool (`history_get_ha_config`) for HA's own config. When-to-use, when-not-to-use, and the alternative are all stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_get_host_infoGet host OS infoA
Read-onlyIdempotent

Get info about the host operating system.

Calls GET /host/info for Home Assistant OS version, hostname, kernel and related host-level fields.

Use when: checking the underlying OS/hardware, as opposed to Core or the Supervisor. Not for: Supervisor's own version — use supervisor_get_supervisor_info. Returns: Supervisor's raw host info payload (Home Assistant OS version, hostname, kernel, and related fields). Errors: {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds real behavioural context by disclosing the underlying GET /host/info call and the concrete auth failure (SUPERVISOR_TOKEN not set, requires running as an HA add-on). It does not mention rate limits, but for a read-only info call that is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by clearly labelled Use when / Not for / Returns / Errors blocks that are easy to scan. The Returns block is somewhat redundant given an output schema exists, which keeps this from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the safety profile, the description only needs to add selection guidance and failure modes — and it does both, including the exact error payload. 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.

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 to document and the baseline of 4 applies. The description correctly adds no parameter prose, avoiding noise.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get info about the host operating system') and names the exact sibling it must not be confused with (Core, Supervisor, supervisor_get_supervisor_info). An agent can select this tool without opening any other 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?

Explicit 'Use when' clause scopes it to underlying OS/hardware rather than Core or Supervisor, and the 'Not for' clause routes Supervisor's own version to supervisor_get_supervisor_info. Both the trigger and the alternative are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_get_supervisor_infoGet Supervisor infoA
Read-onlyIdempotent

Get info about the Supervisor component itself.

Calls GET /supervisor/info for its version, update channel and health flag.

Use when: checking the Supervisor's own version/channel/health, as opposed to Core or the host. Not for: Home Assistant Core details — use supervisor_get_core_info; for the host OS — use supervisor_get_host_info. Returns: Supervisor's raw info payload (version, channel, healthy, and related fields). Errors: {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint, and openWorldHint, but the description adds meaningful context beyond them: the exact endpoint (GET /supervisor/info), the returned fields (version, channel, healthy), and a concrete error payload when SUPERVISOR_TOKEN is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then structured into Use when, Not for, Returns, and Errors sections. Every line earns its place and there is no redundant or vague filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, an output schema, and annotations covering safety traits, the definition is fully sufficient. The description still adds useful return-field and error details without needing to repeat what the output schema provides.

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 schema already has nothing to document and the baseline for this dimension is 4. The description appropriately adds no parameter guidance because none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get info about the Supervisor component itself.' It immediately distinguishes the target from Home Assistant Core and the host OS, so an agent can identify the correct scope without inspecting sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit 'Use when' and 'Not for' guidance, naming the alternative tools supervisor_get_core_info and supervisor_get_host_info. The conditions for selecting this tool versus its siblings are fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_install_addonInstall an add-onA
Idempotent

Install an add-on from its slug.

Calls POST /addons/<slug>/install. The add-on must already belong to a repository Supervisor knows about; this does not add repositories. Installing downloads the add-on's image, which reaches outside the HA instance and its host.

Use when: adding a new add-on that is already visible in an installed repository. Not for: starting/stopping an already-installed add-on — use supervisor_start_addon/supervisor_stop_addon. Returns: Supervisor's install-job result. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} if the slug is unknown. Limits: downloads the add-on image over the network; can take a while on a slow connection.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesSlug of an add-on already visible in a registered repository (e.g. from `hacs_list_hacs_repositories`-style store listings or Supervisor's own add-on store).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly=false, openWorld=true, idempotent=true, destructive=false), and the description goes well beyond them: it discloses that install downloads an image, reaches outside the HA instance/host, can take a while on slow connections, does not add repositories, and requires SUPERVISOR_TOKEN. Error shapes are enumerated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then prerequisites, usage, returns, errors, and limits in clearly labeled blocks. Each section carries distinct information (endpoint, network behavior, token requirement, error payloads) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter install mutation with an output schema present, the definition supplies everything an agent needs: prerequisites, side effects, auth requirement, latency caveat, and concrete error responses. Return values are only briefly noted, which is fine given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (slug) and schema description coverage is 100%, so the schema already documents it thoroughly (including examples of where slugs come from). The description adds nothing new about the parameter itself, 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 and resource ('Install an add-on from its slug') and even names the underlying endpoint POST /addons/<slug>/install. It clearly distinguishes itself from the sibling lifecycle tools supervisor_start_addon and supervisor_stop_addon, which are explicitly called out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause (adding an add-on already visible in an installed repository) and an explicit 'Not for' clause routing the agent to supervisor_start_addon/supervisor_stop_addon for already-installed add-ons. No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_list_addonsList installed add-onsA
Read-onlyIdempotent

List every installed add-on with its slug, name, state and version.

Calls Supervisor's GET /addons and projects each entry down to slug, name, state, version, version_latest and update_available.

Use when: getting an overview of installed add-ons and which have updates pending. Not for: full add-on detail (options, ports, boot mode) — use supervisor_get_addon. Returns: {"addons": [{slug, name, state, version, version_latest, update_available}, ...]}. Errors: {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} on a Supervisor API error.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds genuine value beyond that: the underlying Supervisor endpoint (GET /addons) and two concrete error shapes (missing SUPERVISOR_TOKEN, HTTP <status>), which tell the agent how failures manifest. It stops short of describing pagination or rate limits, but for a read-only list that is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then layers Use when / Not for / Returns / Errors in scannable blocks. Every sentence carries distinct information and none is redundant with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing tool with a full output schema and complete annotations, the description covers purpose, selection guidance, and failure modes. The explicit Returns block slightly duplicates the output schema but does not detract from completeness.

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. Schema coverage is 100% and there is nothing for the description to compensate for; the field list it provides pertains to output, not input.

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 installed add-on') and enumerates the projected fields, so the agent knows exactly what comes back. It also names the sibling it is not (supervisor_get_addon), making it trivially distinguishable from the other supervisor_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit 'Use when' and 'Not for' clauses, and routes the agent to the correct alternative ('use supervisor_get_addon') for the excluded case. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_list_backupsList Supervisor backupsA
Read-onlyIdempotent

List every backup Supervisor manages.

Calls GET /backups for the full backup catalogue Supervisor tracks.

Use when: finding a backup's slug before restoring or deleting it, or checking whether a scheduled backup succeeded. Not for: HA Core's own backup.create/backup.create_automatic backups when they were not made through Supervisor — those may not appear here under the same view. Returns: Supervisor's raw backups payload. Errors: {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real value beyond that: the underlying endpoint (GET /backups), the raw response shape, and a concrete token-missing error payload. It stops short of describing pagination or catalogue size limits, so not a full 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?

Front-loads the core action, then uses labeled sections (Use when / Not for / Returns / Errors) that are easy to scan. No wasted sentences; each line earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still usefully notes the raw payload and the auth failure mode. Prerequisites, scope, and error conditions are all covered for a zero-arg listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly avoids inventing parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (every backup Supervisor manages) and immediately clarifies the scope distinction from HA Core's own backups. An agent can tell it apart from system_create_backup, supervisor_create_backup, or supervisor_restore_backup 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 provides both a "Use when" list (finding a slug before restoring/deleting, checking scheduled backup success) and a "Not for" exclusion (HA Core backups not made through Supervisor). This is exactly the routing guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_restart_addonRestart an add-onA
DestructiveIdempotent

Restart an add-on (stop, then start).

Calls POST /addons/<slug>/restart. The add-on — which could be this nexus add-on itself — is briefly unavailable during the restart.

Use when: an add-on needs to pick up new options or recover from a stuck state. Not for: a one-way stop — use supervisor_stop_addon; for restarting Core instead — use supervisor_restart_core. Returns: Supervisor's restart-job result. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} if the slug is unknown. Limits: briefly interrupts the add-on's availability.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug to restart, e.g. from `supervisor_list_addons`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial context beyond them: the add-on may be this nexus add-on itself, it is briefly unavailable during restart, the underlying endpoint (POST /addons/<slug>/restart), the return value, and three distinct error shapes including a missing-token condition. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with labeled sections (Use when / Not for / Returns / Errors / Limits) so an agent can scan quickly. The verbose inline error strings are slightly long but each carries actionable information, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation tool with annotations and an output schema, the description covers purpose, alternatives, side effects, return value, and failure modes. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (slug) with 100% schema description coverage, so the baseline is 3. The description adds only indirect value via the 'invalid_slug' error example; the schema already documents the slug format and its source.

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 ('Restart an add-on (stop, then start)') and immediately clarifies the semantics of what restart means. It explicitly distinguishes itself from the two nearest siblings (supervisor_stop_addon for one-way stop, supervisor_restart_core for Core), so an agent can disambiguate without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' (picking up new options, recovering from a stuck state) and 'Not for' clauses that name the correct alternative tools by name. This is exactly the routing information an agent needs to choose among supervisor_* tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_restart_coreRestart HA CoreA
DestructiveIdempotent

Restart Home Assistant Core through the Supervisor after an explicit confirmation.

Calls POST /core/restart. WARNING: causes downtime for HA Core (and everything depending on it) until it comes back up. Without confirm=True nothing is restarted.

Use when: Core needs restarting on a Supervisor install specifically. Not for: the equivalent call via HA's own service — use system_restart_ha; for rebooting the whole host — use supervisor_restart_host. Returns: Supervisor's restart-job result when confirmed. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing. Limits: requires confirm=True; interrupts Core until it restarts.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet true to actually restart Core. False (default) performs no action.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it destructive and non-read-only, but the description adds important operations context: downtime impact on Core and dependents, the confirmation requirement, specific error payloads, and a token prerequisite. This goes well beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is front-loaded with the core action and warning, then efficiently structured into 'Use when', 'Not for', 'Returns', 'Errors', and 'Limits'. Every sentence adds information an agent needs to call the tool correctly.

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 Supervisor-level restart tool, the description covers when to use it, when not to, return behavior, error cases, and side effects. With an output schema present and annotations covering safety, this is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the single `confirm` parameter is already well described in the schema. The description reinforces that `confirm=True` is required and that without it nothing is restarted, but adds little new semantic content 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?

States a specific verb and resource: restart Home Assistant Core through the Supervisor. It explicitly distinguishes from the two closest siblings by explaining it is for Supervisor installs specifically and naming `system_restart_ha` and `supervisor_restart_host` as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' sections, directing the agent to `system_restart_ha` for the HA service equivalent and `supervisor_restart_host` for a host reboot. The conditions that select this tool versus alternatives are fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_restart_hostReboot the hostA
DestructiveIdempotent

Reboot the whole host machine after an explicit confirmation.

Calls POST /host/reboot. WARNING: Home Assistant, every add-on (including this nexus add-on) and the host OS go offline for minutes. Without confirm=True nothing is rebooted.

Use when: a host-level change (e.g. a Home Assistant OS update) requires a full reboot. Not for: restarting only Core — use supervisor_restart_core; for restarting one add-on — use supervisor_restart_addon. Returns: Supervisor's reboot-job result when confirmed. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing. Limits: requires confirm=True; takes the whole host, including this add-on, offline for minutes — the call itself may not receive a reply.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet true to actually reboot the host. False (default) performs no action.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true, but the description goes well beyond them: it warns that Home Assistant, every add-on including the caller itself, and the OS go offline for minutes, that the call may not receive a reply, that `confirm=True` is mandatory, and it documents specific error payloads (`confirmation_required`, missing SUPERVISOR_TOKEN). This is exactly the context annotations cannot encode.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the destructive action and confirmation requirement, then cleanly partitioned into Use when / Not for / Returns / Errors / Limits blocks. Length is justified by the irreversibility of the operation; no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive host operation with an output schema present, the description supplies everything an agent needs: the routing decision, the confirmation gate, the blast radius, and failure modes. Return values are covered by the output schema, so omitting them is correct.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single `confirm` parameter with 100% schema description coverage, so the schema already explains that false (the default) performs no action. The description reinforces that nothing is rebooted without `confirm=True`, but adds no syntax or format detail beyond what the schema provides — the baseline 3 for full coverage 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 states a specific verb and resource — rebooting the whole host machine — and immediately scopes it against the near-miss siblings `supervisor_restart_core` and `supervisor_restart_addon`. An agent can distinguish this tool from every restart sibling without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (host-level change such as an HA OS update requiring a full reboot) and 'Not for' clauses that name the two alternative tools and the condition selecting each. Both the positive trigger and the exclusions 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.

supervisor_restore_backupRestore a full backupA
DestructiveIdempotent

Restore a full backup after an explicit confirmation.

Calls POST /backups/<slug>/restore/full, which replaces the HA configuration, every add-on with its data, and the backed-up folders with the backup's contents; anything changed since the backup was taken is lost. Core and this nexus add-on restart as part of the restore, so the call may drop the connection before it can reply. Without confirm=True nothing is restored.

Use when: reverting to a known-good state after a failed update or misconfiguration. Not for: restoring only some add-ons/folders — Supervisor's partial restore is not exposed by this tool. Returns: Supervisor's restore-job result when confirmed; the reply may never arrive because the add-on restarts mid-call. Errors: {"error": "invalid_slug"} for a bad slug; returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false; {"error": "HTTP <status>", "detail": ...} if the slug or password is wrong. Limits: WARNING: discards every change made since the backup; requires confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesBackup slug to restore, from `supervisor_list_backups`.
confirmNoSet true to actually restore the backup. False (default) performs no action.
passwordNoPassword for an encrypted backup. Omit for an unencrypted one.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it enumerates exactly what is replaced (HA configuration, every add-on with its data, backed-up folders), warns that all post-backup changes are lost, and discloses that core and the nexus add-on restart mid-call so the reply may never arrive. This is exactly the extra context a destructiveHint=true flag cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded summary followed by clean labeled sections (Use when / Not for / Returns / Errors / Limits) makes it easy to scan. Minor redundancy: the confirm requirement and the destructive warning each appear more than once across body, Errors, and Limits.

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 operation it covers scope of data loss, restart/connection-drop behavior, the confirmation gate, expected job result, and distinct error shapes. With an output schema present, no return-value detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it ties slug to the supervisor_list_backups source, stresses that confirm=False performs no action, and describes the password's role for encrypted backups with matching error replies.

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 (restore) plus resource (a FULL backup) and even names the underlying endpoint. It distinguishes itself from siblings like supervisor_list_backups/supervisor_create_backup and explicitly rules out the partial-restore variant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (reverting to a known-good state after a failed update/misconfiguration) and 'Not for' (partial add-on/folder restore, which is not exposed) leave no inference for the agent. The confirm prerequisite is stated up front as a gating condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_set_addon_optionsSet add-on optionsA
DestructiveIdempotent

Replace an add-on's stored options with the given object.

Calls POST /addons/<slug>/options as {"options": options}. Read current values via supervisor_get_addon, modify them, and send the full dict back — overwrites previous options entirely, so omitted fields are lost. A value left as the placeholder for a secret field is swapped for the real stored value first, so echoing it back unchanged never overwrites the secret — a list containing it must keep every item's order/count as read, or the call is refused rather than guessed. Once a placeholder was resolved, a Supervisor error strips detail (it can otherwise echo the rejected payload, secret included). Takes effect after supervisor_restart_addon. Refuses to run against nexus's own add-on — could otherwise lift its own restrictions.

Use when: changing an add-on's configuration programmatically. Not for: reading the current options first — use supervisor_get_addon; for changing nexus's own configuration — use the Home Assistant Supervisor UI instead. Returns: Supervisor's options-update result. Errors: {"error": "invalid_slug"} for a bad slug; self_addon_options_blocked for nexus's own add-on; redaction_marker_list_length_mismatch on a placeholder list-length mismatch; SUPERVISOR_TOKEN not set when the token is missing; {"error": "HTTP <status>"} on a schema-validation or placeholder read-back failure. Limits: does not apply until the add-on is restarted.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug whose options to set, e.g. from `supervisor_list_addons`.
optionsYesFull options object to store, validated by Supervisor against the add-on's schema. Any field read via `supervisor_get_addon` and left out here is not preserved automatically — include the whole dict, not just changed keys.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give the coarse profile (destructive, idempotent, not read-only); the description goes well beyond by explaining full-overwrite semantics, that omitted fields are lost, secret placeholder substitution rules, the list-order/count refusal condition, detail-stripping on error after placeholder resolution, and the self-add-on block. This is exactly the kind of behavioral context that prevents misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core semantic (full replacement) and then uses labeled sections (Use when / Not for / Returns / Errors / Limits) that make scanning easy. It is dense and long, but nearly every clause carries operational information; the secret-placeholder passage is repetitive in places.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no elaboration, and the description still enumerates error codes, the restart requirement, and the self-add-on guard. For a destructive mutation tool, an agent has everything needed to call it safely.

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, but the description adds real value: it clarifies that omitted fields are not preserved and that the placeholder value for secrets is resolved before write. It reinforces the schema's whole-dict requirement rather than adding new syntax, so it lands just above 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?

Names a specific verb and resource ('Replace an add-on's stored options with the given object') and pins down the API operation (POST /addons/<slug>/options). It clearly distinguishes itself from the read path by naming supervisor_get_addon as the sibling that reads current values.

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?

Has explicit 'Use when' and 'Not for' sections, each naming the correct alternative (supervisor_get_addon for reading, Supervisor UI for nexus's own config). The restart dependency is also stated, so an agent knows the ordering constraint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_start_addonStart an add-onA
Idempotent

Start an installed, stopped add-on.

Calls POST /addons/<slug>/start.

Use when: bringing an installed add-on online after it was stopped. Not for: installing a new add-on — use supervisor_install_addon; for stopping it — use supervisor_stop_addon. Returns: Supervisor's start-job result. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} if the slug is unknown or already running.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug to start, e.g. from `supervisor_list_addons`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly=false, destructive=false), and the description adds genuinely new behavioral context: the HTTP endpoint, the SUPERVISOR_TOKEN prerequisite, and three distinct error payloads including invalid slug and token-missing conditions. The 'already running' error is in mild tension with idempotentHint=true, but this is a hint-level nuance rather than a contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then uses labeled Use when / Not for / Returns / Errors sections. Each line carries distinct information (routing, prerequisite, error taxonomy) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be detailed, yet the description still notes the start-job result. Combined with the error catalogue and auth prerequisite, an agent has everything needed to invoke this correctly and handle failures.

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 schema's slug description already explains the format and points to supervisor_list_addons. The description adds nothing beyond flagging a possible 'invalid_slug' error, so the baseline 3 for schema-covered parameters 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+state transition ('Start an installed, stopped add-on') and even names the underlying endpoint. It explicitly distinguishes itself from supervisor_install_addon and supervisor_stop_addon, so an agent can select it without opening sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit 'Use when' and 'Not for' clauses, each routing to the correct alternative tool (supervisor_install_addon for installing, supervisor_stop_addon for stopping). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_stop_addonStop an add-onA
DestructiveIdempotent

Stop a running add-on.

Calls POST /addons/<slug>/stop. The add-on — e.g. an MQTT broker other integrations depend on — becomes unavailable until started again. Refuses to run at all against nexus's own add-on (by its real slug or the literal alias Supervisor resolves to the caller itself): nexus stopping itself would cut off the very connection carrying this call, with no guarantee the response ever comes back, and — unlike supervisor_restart_addon — leaves nexus down until someone starts it again some other way.

Use when: taking one add-on offline without uninstalling it. Not for: removing it entirely — use supervisor_uninstall_addon; for bringing it back — use supervisor_start_addon; for a brief restart of nexus itself — use supervisor_restart_addon instead, which is allowed. Returns: Supervisor's stop-job result. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "self_addon_stop_blocked", "message": ...} when slug is nexus's own add-on; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} if the slug is unknown. Limits: interrupts the add-on's availability, and anything depending on it, until it is started again.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug to stop, e.g. from `supervisor_list_addons`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover destructive/idempotent/readOnly status, but the description adds critical behavior: the add-on and dependents become unavailable until started again, stopping nexus's own add-on is blocked, the token prerequisite, error payloads, and limits. No annotation contradiction is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then organized into effect, use/not-for, returns, errors, and limits. It is long but most sentences earn their place; some error detail could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description gives a useful return summary and enumerates the important error cases, token prerequisite, self-call restriction, and availability impact. An agent has enough information to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single slug parameter is already documented in the schema. The description reinforces where slugs come from and mentions invalid_slug/self-add-on errors, but adds little parameter 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+resource: 'Stop a running add-on.' It also names the endpoint and effect, and clearly distinguishes itself from start, restart, and uninstall siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives a 'Use when' condition and a 'Not for' section naming alternatives: uninstall for removal, start for bringing it back, and restart for a brief restart of nexus itself. The routing guidance is complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_uninstall_addonUninstall an add-onA
DestructiveIdempotent

Uninstall an add-on and its persistent data after an explicit confirmation.

Calls POST /addons/<slug>/uninstall. Refuses to run at all against nexus's own add-on (its real slug, or the alias Supervisor resolves to the caller itself — see self_protection.is_own_addon) — checked first, with no Supervisor request made either way, before even the confirmation gate: nexus removing itself is never the right tool for that regardless of confirm. Otherwise, without confirm=True nothing is removed; the call only returns an error asking for confirmation (ADR-0003 D1).

Use when: permanently removing an add-on that is no longer needed. Not for: temporarily stopping it while keeping its data and config — use supervisor_stop_addon. Returns: Supervisor's uninstall-job result when confirmed. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "self_addon_uninstall_blocked", "message": ...} when slug is nexus's own add-on; returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false; {"error": "HTTP <status>", "detail": ...} on a Supervisor API error. Limits: WARNING: deletes the add-on's data with no separate backup step; requires confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug to uninstall, e.g. from `supervisor_list_addons`.
confirmNoSet true to actually uninstall the add-on and its data. False (default) performs no action.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond annotations: discloses the self-protection special case (nexus's own add-on blocked with no Supervisor request made), the confirmation gate semantics (ADR-0003 D1), that data is deleted with no separate backup step, and enumerates specific error shapes. This is richer than the destructiveHint/readOnlyHint annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and the critical refusal behaviors, then uses clear labeled sections (Use when / Not for / Returns / Errors / Limits). It is longer than typical but every segment carries distinct operational value; slight verbosity in the error enumeration.

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 mutation tool, it covers the action, the guard conditions, the confirm requirement, the data-loss warning, and all error paths — everything an agent needs to call it safely and interpret the result. Output schema exists so return values need not be re-explained.

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 3. The description adds meaning by tying 'confirm' to the confirmation gate behavior and explaining that the self-addon check precedes the confirm gate, which is behavioral nuance not captured in the schema's field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Uninstall an add-on and its persistent data') and explicitly names the sibling it is NOT for ('supervisor_stop_addon') and the condition that distinguishes them (temporary stop vs permanent removal). An agent can route correctly 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?

Provides explicit 'Use when' and 'Not for' clauses, naming the alternative tool (supervisor_stop_addon) and the exact contrasting scenario. This is the when/when-not/alternatives pattern in full.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

supervisor_update_addonUpdate an add-onA
Destructive

Update an add-on to its latest available version.

Calls POST /addons/<slug>/update, which downloads and installs the new version over the network; the previous version is only recoverable from a backup taken beforehand.

Use when: update_available is true for the add-on and the new version should be applied. Not for: reverting an update — restore a backup via supervisor_restore_backup instead; there is no dedicated rollback call. Returns: Supervisor's update-job result. Errors: {"error": "invalid_slug"} for a bad slug; {"error": "SUPERVISOR_TOKEN not set — Nexus must run as HA add-on for Supervisor API"} when the token env var is missing; {"error": "HTTP <status>", "detail": ...} on a failed update. Limits: downloads the new version over the network; no automatic rollback on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesAdd-on slug to update, e.g. from `supervisor_list_addons`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, openWorldHint=true and non-idempotent, and the description meaningfully extends them: network download, previous version only recoverable from a prior backup, no automatic rollback on failure, plus concrete error shapes and the missing-token failure mode.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by labelled blocks (Use when / Not for / Returns / Errors / Limits) makes it scannable. It is on the longer side, but each block carries non-redundant operational 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 destructive, network-touching Supervisor mutation, the definition covers trigger, exclusions, reversibility, failure modes and even the API route; the output schema already handles return values, so 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?

Only one parameter and schema coverage is 100%, so the schema fully documents slug, including its source (supervisor_list_addons). The description adds no syntax or format detail beyond that, 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+resource ('Update an add-on to its latest available version') plus the underlying endpoint POST /addons/<slug>/update. Clearly distinct from supervisor_install_addon, supervisor_uninstall_addon and hacs_update_hacs_repository.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: update_available is true' trigger, and an explicit 'Not for' with the correct alternative (supervisor_restore_backup) for reverting, noting there is no rollback call. Nothing left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_check_configValidate HA configurationA
Read-onlyIdempotent

Validate the current Home Assistant configuration without applying anything.

Calls POST /api/config/core/check_config, the same YAML validation HA runs internally before a restart; nothing is reloaded or restarted by this call.

Use when: verifying configuration.yaml and related files are valid before calling system_restart_ha. Not for: applying a change into the running instance — use system_reload_all for a no-downtime reload or system_restart_ha for a full restart. Returns: HA's check payload, typically {"result": "valid"|"invalid", "errors": ...}. Errors: raises httpx.HTTPStatusError if the HA API request itself fails (e.g. HA unreachable).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds value beyond them: it discloses the exact endpoint, that nothing is reloaded or restarted, the typical response payload, and that an httpx.HTTPStatusError is raised when HA is unreachable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by labeled Use when / Not for / Returns / Errors sections. Each block is short and earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a parameterless validation tool: purpose, non-mutating guarantee, routing guidance, return shape and error behavior are all present. An output schema exists, so the brief Returns note is a bonus rather than a necessity.

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 expectation is 4. The description cannot and need not add parameter meaning, and it doesn't over-explain a parameterless signature.

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 ('Validate the current Home Assistant configuration') and immediately scopes it as non-applying. It names the exact endpoint it calls and distinguishes itself from siblings like system_restart_ha and system_reload_all.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (verify configuration.yaml before system_restart_ha) and 'Not for' (applying changes) sections, with the correct alternatives named for each case. An agent can route unambiguously.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_create_backupCreate automatic HA backupA
Destructive

Create a Home Assistant backup using whichever backup service the instance registers.

On Supervisor installs backup.create does not exist, so this calls backup.create_automatic instead, which creates a backup using the automatic-backup settings configured in Settings -> System -> Backups; when a retention count is configured there, those same settings prune older automatic backups as a side effect of this call. On HA Core/Container installs, where backup.create exists, that one is called instead — no name, folder selection or password. Returns an error if neither service is registered.

Use when: HA already has the wanted automatic-backup settings configured and a quick backup with no extra parameters is enough. Not for: a named, partial, and/or password-protected backup on a Supervisor install, or a backup that never deletes older ones — use supervisor_create_backup. Returns: the called service's result, or an error dict when neither service is registered. Errors: {"error": "Neither backup.create nor backup.create_automatic is registered on this Home Assistant instance."}. Limits: on Supervisor installs, applies the instance's configured retention count, which can delete older backups.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and non-idempotent, and the description goes well beyond them: it warns that a configured retention count prunes older automatic backups as a side effect, discloses the conditional service dispatch, and specifies the exact error returned when neither service is registered. This is rich behavioral context an agent could not infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then structured into Use/Not-for/Returns/Errors/Limits sections. It is somewhat verbose and the Supervisor-vs-Core dispatch is explained twice, but nearly every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter mutation tool whose annotations already flag destructiveness, the description covers dispatch logic, side effects, usage exclusions, and the exact error payload. Even though an output schema exists, the additional return/error notes make the definition fully self-sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters the baseline is 4, and the description reinforces this by stating the Core/Container path takes 'no name, folder selection or password', confirming there is nothing to pass. No further param semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (create) and resource (HA backup) plus the exact service dispatch logic (`backup.create` on Core/Container vs `backup.create_automatic` on Supervisor). It explicitly differentiates itself from the sibling `supervisor_create_backup`, so an agent can select between them without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' clauses, and names the alternative tool (`supervisor_create_backup`) along with the conditions that select it (named/partial/password-protected backup, or one that never deletes older ones). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_get_all_integrationsList config entries compactlyA
Read-onlyIdempotent

List every config entry as a compact summary of its key fields.

Calls the same config_entries/get WebSocket command as system_list_integrations and projects each entry down to entry_id, domain, title, state and source; every state is included, so filter on state yourself.

Use when: scanning or filtering integrations by domain/state without the full raw payload. Not for: every field HA stores on the entry — use system_list_integrations. Returns: list of {entry_id, domain, title, state, source} dicts. Errors: raises RuntimeError if the underlying WebSocket call fails (e.g. auth or WS-level error).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly/idempotent/non-destructive), but the description adds real behavioral context: it uses the same config_entries/get WS command as the sibling, projects down to 5 fields, includes every state (so the agent must filter), and raises RuntimeError on WS/auth failure. This goes meaningfully beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly sectioned into Use when / Not for / Returns / Errors. Every section earns its place, though the 'Returns' dict listing is mildly redundant given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param read tool with an output schema and full annotations, the description is complete: it tells the agent when to use it, when to use the alternative instead, the projection shape, and the failure mode. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is an empty object, so there are no parameter semantics to document. Baseline 4 applies; nothing is missing or misleading.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (list every config entry as a compact summary) and names the sibling it differs from (system_list_integrations). An agent can distinguish the compact projection from the full-payload tool 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?

Has explicit 'Use when: scanning or filtering integrations by domain/state without the full raw payload' and 'Not for: every field HA stores — use system_list_integrations'. It names the alternative and the exact condition that selects it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_get_repairsList active repair issuesA
Read-onlyIdempotent

List Home Assistant's active repair issues.

Calls the repairs/list_issues WebSocket command and projects each issue down to its id, domain, severity, breaks_in_ha_version, learn-more URL, translation key, and ignored/is_fixable flags.

Use when: surfacing deprecated config, broken integrations or required migrations that need attention. Not for: the full raw repair-issue payload with every field HA stores — this always returns the projected subset above. Returns: list of {issue_id, domain, severity, breaks_in_ha_version, learn_more_url, translation_key, ignored, is_fixable} dicts. Errors: raises RuntimeError if the underlying WebSocket call fails (e.g. auth or WS-level error).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description adds genuinely new behavior: the projected field subset, the specific WebSocket command, and error semantics (RuntimeError on auth/WS failure). Only minor gap is pagination/scale behavior, which is minor for a read-only list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then labeled Use when / Not for / Returns / Errors blocks. Every sentence carries distinct information with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still summarizes the projected return fields and documents failure behavior, covering both success and error paths. Complete for a zero-argument read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so per the baseline this scores 4. The description correctly adds no parameter prose since there is nothing to configure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (Home Assistant's active repair issues) and names the underlying operation (`repairs/list_issues`). An agent can clearly distinguish this from sibling listing tools like system_get_system_health or history_get_error_log.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when:' clause gives the trigger scenario (deprecated config, broken integrations, migrations needing attention) and a 'Not for:' clause scopes out the raw full payload. Nothing about when to reach for this is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_get_system_healthGet system health checksA
Read-onlyIdempotent

Get Home Assistant's system-health report across its core subsystems.

Runs the system_health/info WebSocket subscription to completion and merges its initial/update/finish events into one dict, since HA exposes system health only as a WebSocket stream, not over HTTP.

Use when: checking recorder/websocket/cloud/network-style health checks and basic system info (version, dev mode, virtualenv) in one call. Not for: a plain liveness check — use system_ping_ha; for HA version/location/config use history_get_ha_config. Returns: dict keyed by integration domain, each with an info dict mapping check name to value (or {"error": ...} for a failed check). Errors: raises RuntimeError on WebSocket auth failure or a WS-level error from system_health/info. Limits: waits up to an internal 15-second timeout for the stream's finish event; on timeout it returns whatever partial data arrived instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses that the tool must run a WebSocket subscription to completion, that it merges initial/update/finish events, that it raises RuntimeError on auth or WS-level failure, and that a 15-second internal timeout yields partial data rather than an error. That partial-result behavior is exactly the kind of trait annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then cleanly segmented into Use when / Not for / Returns / Errors / Limits. The WebSocket-implementation sentence is slightly more background than an agent strictly needs, but every labeled section carries actionable content and nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description usefully characterizes the return shape (dict keyed by integration domain with per-check info or error entries) and closes the remaining gaps an agent would face: failure modes and the timeout/partial-data limit. Nothing material is left unspecified.

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; baseline for a no-parameter tool is 4. The description correctly adds no parameter prose, which is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (Home Assistant's system-health report across core subsystems), plus the mechanism (the `system_health/info` WebSocket subscription merged into one dict). This is clearly distinguishable from siblings like `system_ping_ha` and `history_get_ha_config`, both of 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?

Has explicit 'Use when' (recorder/websocket/cloud/network health checks plus version/dev-mode/virtualenv info) and 'Not for' clauses that route the agent to named alternatives (`system_ping_ha` for liveness, `history_get_ha_config` for version/location/config). Both the positive and negative selection criteria are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_get_updatesList available HA updatesA
Read-onlyIdempotent

List Home Assistant's update.* entities, one per updatable component.

Reads all HA states and filters to entities in the update domain (core, add-ons, HACS repositories, custom components), extracts installed/latest version and release info from their attributes, and sorts pending updates first.

Use when: checking what has an update available across the whole instance in one call. Not for: live Supervisor add-on state beyond this snapshot — use supervisor_get_addon or supervisor_list_addons. Returns: list of {entity_id, name, installed_version, latest_version, update_available, release_url, release_notes, skipped_version, in_progress, auto_update}, sorted with available updates first.

ParametersJSON Schema
NameRequiredDescriptionDefault
pending_onlyNoIf true (default), return only components with an update available. Set false to also include up-to-date components.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is carried structurally. The description adds real context beyond that: it reads all HA states and filters to the update domain, extracts version/release attributes, and sorts pending updates first. This is useful mechanism disclosure, though it stops short of noting any rate limits or performance caveats of scanning all states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then clean 'Use when'/'Not for'/'Returns' sections; every line has a clear role. The Returns field enumerates fields an output schema already exists for, which is mild redundancy, but the overall structure is efficient and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema, full annotation coverage, 100% schema description coverage and 1 optional param, the description supplies everything an agent needs: what it scans, how it filters, what it excludes, and the alternative tools. Nothing required for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single pending_only parameter is fully documented in the schema, so the baseline is 3. The description reinforces the sort behavior ('pending updates first') but adds no syntax or edge-case detail beyond what the schema already 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?

States a specific verb+resource ('List Home Assistant's update.* entities, one per updatable component') and enumerates the covered domains (core, add-ons, HACS repos, custom components). It also explicitly distinguishes itself from supervisor_get_addon/supervisor_list_addons, so an agent can tell it apart from siblings 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?

Uses explicit 'Use when' and 'Not for' clauses: whole-instance update checking in one call, with the exclusion pointing to supervisor_get_addon and supervisor_list_addons for live Supervisor add-on state. When, when-not and alternatives are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_list_integrationsList all config entriesA
Read-onlyIdempotent

List every Home Assistant config entry, whatever its state.

Calls the raw config_entries/get WebSocket command and returns it unfiltered: every field HA stores per entry, in any state (loaded, not_loaded, setup_error, disabled). On instances with many integrations this can be a large payload.

Use when: the raw config-entry objects, with every field, are needed. Not for: a compact, easier-to-scan listing — use system_get_all_integrations, which strips this down to entry_id/domain/title/state/source. Returns: list of raw config-entry dicts as returned by HA's WebSocket API. Errors: raises RuntimeError if the underlying WebSocket call fails (e.g. auth or WS-level error). Limits: no pagination or filtering; large HA instances get a large response.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which already declare readOnly/idempotent/non-destructive), the description adds meaningful behavior: it discloses that output is unfiltered, that the response can be large on busy instances, that there is no pagination or filtering, and that a RuntimeError is raised on WS failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what it does, then uses labeled sections (Use when / Not for / Returns / Errors / Limits) that are easy to scan. Every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite a zero-param schema and an existing output schema, the description covers return shape, failure mode, and the large-payload caveat. An agent has everything needed to select and call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema baseline is 4. The description correctly conveys there is nothing to configure (no filtering or pagination), matching the empty input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List every Home Assistant config entry') and explicitly scopes it to raw, unfiltered output. It distinguishes itself from the sibling system_get_all_integrations by name and by what each returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' clause (raw config-entry objects with every field) and a 'Not for' clause that names the alternative tool and the reason to pick it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_ping_haCheck HA API reachabilityA
Read-onlyIdempotent

Check whether the Home Assistant API is reachable over HTTP.

Calls GET /api/ through ha.ping(), which catches any connection error internally and reports plain reachability, not health or subsystem status.

Use when: confirming HA is up before other calls, quick liveness probing. Not for: the raw /api/ payload itself — use history_get_system_info; for HA version/location/config use history_get_ha_config; for subsystem health use system_get_system_health. Returns: {"reachable": bool, "url": <configured HA_URL>}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds non-obvious behavior: `ha.ping()` catches connection errors internally and reports plain reachability rather than health, which is genuine context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core definition, then cleanly segmented into 'Use when', 'Not for', and 'Returns'. Every sentence carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter liveness probe with full annotation coverage and an output schema, the description supplies everything needed: scope, alternatives, and a note on what the result does and does not represent.

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 per the rubric the baseline is 4. The description additionally documents the return shape (`{reachable, url}` with the configured HA_URL), though with no inputs there is no parameter semantics to add.

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 (check) and resource (HA API reachability over HTTP) and even names the underlying call (`GET /api/` via `ha.ping()`). It distinguishes itself from `history_get_system_info`, `history_get_ha_config`, and `system_get_system_health` without the agent needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (confirming HA is up before other calls, liveness probing) and 'Not for' clauses route the agent to the correct alternative for raw payload, config, and subsystem health. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_reload_allReload core configurationA
Idempotent

Reload core Home Assistant configuration without restarting the instance.

Calls the homeassistant.reload_all service, which HA fans out to every component that supports a config reload (automations, scripts, scenes, groups and more), re-reading their YAML from disk.

Use when: YAML for automations/scripts/scenes/groups changed and a fast, no-downtime reload is enough. Not for: changes that require a full restart, e.g. new integrations or structural configuration.yaml edits — use system_restart_ha; for one integration only — use system_reload_integration. Returns: {"status": "reload_all triggered"}; it does not wait for or report individual component reload results.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety profile (non-destructive, idempotent, not read-only), and the description adds meaningful behavioral context beyond them: it calls homeassistant.reload_all, fans out to all reloadable components, re-reads YAML from disk, and crucially does not wait for or report per-component results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose, then uses clearly labeled sections (Use when / Not for / Returns). Every sentence earns its place, including the return note that warns the call is fire-and-forget.

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 system-level reload with zero parameters and an existing output schema, the description supplies everything needed: what it does, when to use it, when to avoid it, named alternatives, and the non-blocking behavior of the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool takes zero parameters, so the baseline is 4 per the rubric. The description correctly avoids inventing parameter semantics; no additional meaning is needed or possible.

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 (reload core Home Assistant configuration) and scope (without restarting). Explicitly distinguishes itself from siblings system_restart_ha and system_reload_integration, so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' (YAML for automations/scripts/scenes/groups changed, fast no-downtime reload) and 'Not for' (full restart cases, single integration) with named alternative tools. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_reload_integrationReload one config entryA
Idempotent

Reload a single integration's config entry without restarting Home Assistant.

Calls the homeassistant.reload_config_entry service for the given entry_id, which unloads and re-sets-up that one integration only.

Use when: one integration needs to pick up new options or recover from a transient setup error. Not for: reloading every reloadable component at once — use system_reload_all. Returns: the homeassistant.reload_config_entry service-call result. Errors: raises httpx.HTTPStatusError if entry_id does not exist or the domain does not support config-entry reload.

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYesConfig entry ID to reload, from `system_list_integrations` or `system_get_all_integrations`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds real context beyond them: the config entry is unloaded and re-set-up, errors surface as `httpx.HTTPStatusError` when the entry doesn't exist or the domain doesn't support reload, and it returns the service-call result. That error behavior is not derivable from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then uses labeled lines ('Use when', 'Not for', 'Returns', 'Errors') with zero filler. Every sentence carries distinct, decision-relevant 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 an output schema present, return values need not be explained, yet the description still names the service result and documents failure modes. For a single-parameter, non-destructive reload tool this is complete and leaves no ambiguity about scoping or error handling.

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 `entry_id` parameter is already documented in the schema as coming from `system_list_integrations` or `system_get_all_integrations`. The description adds no syntax, format, or constraint detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (reload) and resource (a single integration's config entry), and explicitly distinguishes scope from the sibling `system_reload_all`. It even names the underlying service (`homeassistant.reload_config_entry`), so an agent can tell it apart from the bulk-reload tool immediately.

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?

Contains an explicit 'Use when' clause (pick up new options / recover from a transient setup error) and a 'Not for' clause that names the alternative tool (`system_reload_all`) and the condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_restart_haRestart Home AssistantA
DestructiveIdempotent

Restart Home Assistant after an explicit confirmation.

Calls the homeassistant.restart service, which causes roughly 30 seconds of downtime for the whole instance, including this add-on. Without confirm=True nothing is restarted; the call only returns a safety prompt describing how to confirm.

Use when: a config change requires a full restart, e.g. after system_check_config reports the config is valid. Not for: a no-downtime reload — use system_reload_all; stopping HA without restarting it — use system_stop_ha; restarting only Core under Supervisor — use supervisor_restart_core. Returns: the homeassistant.restart service-call result when confirmed, otherwise a confirmation prompt. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false. Limits: interrupts Home Assistant for about 30 seconds; requires confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet true to actually restart HA. False (default) performs no restart and instead returns a confirmation prompt.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this destructive/non-read-only, and the description adds substantially more: ~30 seconds of whole-instance downtime including the add-on itself, the fact that `confirm=False` performs no restart and only returns a prompt, and the exact error payload shape. That is the kind of consequence detail annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its precondition, then segmented into Use when / Not for / Returns / Errors / Limits. Dense but every line carries operational information; nothing is redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-impact, single-parameter mutation tool, the description covers trigger conditions, exclusions, downtime, confirmation semantics, return values and error shapes. An agent has everything needed to decide and to call it safely.

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, but the description goes beyond the schema by spelling out the two distinct execution paths (no-op safety prompt vs. actual restart) and the `confirmation_required` error contract tied to `confirm`.

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 ('Restart Home Assistant') and immediately pins the scope with 'after an explicit confirmation' and the underlying `homeassistant.restart` service call. It is clearly distinguishable from the sibling restart/reload tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives a 'Use when' trigger (a config change requiring a full restart, e.g. after `system_check_config` validates), a 'Not for' list, and names three concrete alternatives (`system_reload_all`, `system_stop_ha`, `supervisor_restart_core`) with the condition that selects each. This is textbook routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_stop_haStop Home AssistantA
DestructiveIdempotent

Stop Home Assistant after an explicit confirmation.

Calls the homeassistant.stop service. Unlike a restart, nothing brings the instance back automatically — a manual restart is required. Without confirm=True nothing is stopped; the call only returns a safety prompt.

Use when: HA needs to be taken fully offline, e.g. before host maintenance. Not for: a temporary interruption that comes back on its own — use system_restart_ha. Returns: the homeassistant.stop service-call result when confirmed, otherwise a confirmation prompt. Errors: returns {"error": "confirmation_required", "message": ..., "action": ...} when confirm is false. Limits: requires a manual restart to bring HA back online; requires confirm=True.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSet true to actually stop HA. False (default) performs no action and instead returns a confirmation prompt.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive, non-read-only, idempotent, and closed-world, but the description adds critical behavioral context: confirmation is required, no automatic restart follows, the exact error shape when confirmation is missing, and the manual restart requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and confirmation requirement, then uses clearly labeled sections for use, non-use, returns, errors, and limits. Despite covering many points, each line earns its place for a destructive system-level tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description still explains the return behavior and error case, which is useful. Combined with explicit limits and alternatives, it gives an agent everything needed to invoke this destructive tool safely and correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents the `confirm` parameter and its default. The description reinforces that `confirm=True` is required but adds little semantic detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (Stop Home Assistant) and explicitly distinguishes it from restart by noting that nothing brings the instance back automatically. The service name `homeassistant.stop` further clarifies the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('HA needs to be taken fully offline, e.g. before host maintenance') and when-not-to-use guidance ('Not for: a temporary interruption that comes back on its own'), naming the alternative `system_restart_ha`.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_create_themeCreate theme fileA
DestructiveIdempotent

Create a new Lovelace theme file.

Writes themes/<name>.yaml as {<name>: variables}. The file is only loaded by the frontend if configuration.yaml has frontend: themes: !include_dir_merge_named themes. Fails instead of overwriting unless overwrite=True.

Use when: adding a brand-new theme. Not for: changing an existing theme in place — use themes_update_theme. Returns: dict with success, path, and reloaded (present when reload=True). Errors: {"success": false, "error": "Theme '<name>' already exists. Pass overwrite=True to replace."} when the file exists and overwrite is false; {"success": false, "error": "invalid_theme_name", "detail": ...} when name contains '/' or a backslash, starts with '.', or is blank. Limits: name must not contain '/' or a backslash, start with '.', or be blank.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTheme name, becomes the filename themes/<name>.yaml without the extension.
reloadNoIf true, calls frontend.reload_themes after writing the file; defaults to true.
overwriteNoIf true, replaces an existing theme file instead of failing; defaults to false.
variablesYesInner theme variable map to write, e.g. {'primary-color': '#03a9f4'} or a 'modes' block with 'light'/'dark' keys; not wrapped in the theme name.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety profile (not read-only, destructive, idempotent, closed-world). The description adds materially more: the fail-instead-of-overwrite default, the configuration.yaml `frontend: themes: !include_dir_merge_named` prerequisite for the file to actually load, the reload behavior, and two concrete error shapes. That is real behavioral context beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by clearly labeled Writes/Use when/Not for/Returns/Errors/Limits sections, so scanning is easy. The one weakness is redundancy: the invalid-name constraint appears twice (Errors and Limits), and Returns restates information the output schema already carries.

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 mutating, nested-object tool with an output schema present, the description covers the file-path convention, the config prerequisite, overwrite/reload semantics, and both failure modes. Nothing an agent needs to invoke it correctly is missing, and return values are described even though the output schema already handles them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already explains name, reload, overwrite, and variables. The description still adds value by translating `name` validation into observable failure modes ('/' or backslash, leading '.', blank) and by restating the overwrite default in outcome terms, which is more than the schema alone conveys.

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 Lovelace theme file) and even names the exact artifact written (`themes/<name>.yaml` as `{<name>: variables}`). It explicitly distinguishes itself from the sibling `themes_update_theme`, so an agent can route 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?

Contains explicit 'Use when: adding a brand-new theme' and 'Not for: changing an existing theme in place — use themes_update_theme', naming the alternative and the condition that selects it. This is the textbook when/when-not/alternative pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_delete_themeDelete theme fileA
DestructiveIdempotent

Delete a theme file.

Removes themes/<name>.yaml from disk if it exists.

Use when: a theme is no longer needed. Returns: dict with success and deleted (the removed path), plus reloaded when reload=True. Errors: {"success": false, "error": "Theme '<name>' not found at <path>"} when the file doesn't exist; {"success": false, "error": "invalid_theme_name", "detail": ...} when name contains '/' or a backslash, starts with '.', or is blank.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTheme name to delete; obtain it from themes_list_themes or themes_list_theme_files.
reloadNoIf true, calls frontend.reload_themes after deleting the file; defaults to true.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds substantial context beyond these: exact file path affected, the behavior when the file is missing, what the reload flag does, and detailed error conditions including invalid theme name patterns. This is rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then structured into 'Use when', 'Returns', and 'Errors' sections. Every sentence carries actionable information 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?

The description is nearly complete for a destructive file deletion tool. It outlines return fields and error cases, though the presence of an output schema makes the explicit return description redundant. Error detail is valuable and not fully covered elsewhere. Minor gap: no mention of permissions or whether deletion is reversible.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are documented in the schema. The description adds validation semantics for `name` (it fails if the name contains '/', a backslash, starts with '.', or is blank) and clarifies that `reload` triggers frontend.reload_themes. This meaningfully augments 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 'Delete' and resource 'theme file', and clarifies the exact operation: removing `themes/<name>.yaml` from disk if it exists. An agent can distinguish this from themes_create_theme, themes_update_theme, and themes_list_themes 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?

Provides a clear when-to-use condition: 'a theme is no longer needed.' It does not name alternative tools or explicitly warn about destructive side effects beyond the annotation, but the usage context is clear and sufficient for a delete operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_get_themeGet theme variablesA
Read-onlyIdempotent

Get one theme's CSS variable map by name.

Calls WS frontend/get_themes and looks up name in the result.

Use when: inspecting a single theme's variables rather than the whole registry from themes_list_themes. Returns: dict with name and variables (the CSS variable map). Errors: {"error": "Theme '<name>' not found", "available": [...]} if the name isn't registered.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTheme name to look up, matching a key in themes_list_themes' `themes` map.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive safety, and the description adds useful internals: it calls the `frontend/get_themes` WS command and looks up the name, plus an exact error shape listing available names when lookup fails. That error contract is real behavioral value beyond the annotations, though read-cost or caching behavior is not discussed.

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?

Uses labeled lines (Use when / Returns / Errors) with the core action front-loaded and no filler. Slightly more verbose than strictly needed given an output schema exists, keeping it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers lookup semantics, the failing-name error contract, and the return dict shape, and routes the agent against the sibling list tool. For a one-parameter read tool with full annotation coverage, 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 coverage is 100%, so the single `name` parameter and its 'matching a key in themes_list_themes' themes map' semantics are already documented. The description's 'by name' adds no syntax or format 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 ('Get one theme's CSS variable map by name') and immediately names the sibling it is distinct from, `themes_list_themes`. An agent can select this over the list tool 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?

Explicit 'Use when' clause contrasts inspecting a single theme's variables against pulling the whole registry from `themes_list_themes`, giving both the condition and the alternative tool by name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_list_theme_filesList theme files on diskA
Read-onlyIdempotent

List YAML theme files present on disk under themes/.

Scans <config>/themes/ recursively for .yaml/.yml files, returning their paths relative to the config directory; returns an empty list if the directory doesn't exist yet.

Use when: a theme exists on disk but isn't showing up in themes_list_themes (not yet loaded). Returns: list of file paths relative to the Home Assistant config directory.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds non-annotation behavior: recursive scan under `<config>/themes/`, path relativity, and the empty-list result when the directory is absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then scope, then usage, then return. Slightly redundant: the return format ('paths relative to the config directory') is stated twice, which is wasted given an output schema already exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Zero parameters, full annotation coverage, and an output schema means little is required of the description. It still covers scope, edge case (missing directory), and when to prefer this over the sibling list tool, 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 per the baseline this is scored 4. The schema is empty and additionalProperties=false, and the description correctly implies no filtering arguments exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List YAML theme files present on disk under themes/') and pins down the scan location and file types. Combined with the title and the sibling themes_list_themes, an agent can immediately tell this reads the filesystem rather than the loaded theme registry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when' line gives an explicit triggering condition and names the alternative tool ('a theme exists on disk but isn't showing up in themes_list_themes'). It lacks an explicit when-not-to-use clause, which is the only thing keeping it from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_list_themesList themesA
Read-onlyIdempotent

List all Lovelace themes registered with the frontend.

Calls WS frontend/get_themes and returns Home Assistant's response unchanged.

Use when: you need every theme's name plus which one is active before switching or editing. Returns: dict with themes (name to variable-map), default_theme, and default_dark_theme.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower; the description nonetheless adds real behavior: it calls the WS command frontend/get_themes and returns Home Assistant's response unchanged, signaling a raw passthrough with no server-side transformation. It does not discuss caching or failure behavior, so not 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 blocks — what it does, when to use it, what it returns — front-loaded with the core action and free of filler. Every sentence contributes information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety, an output schema present, and the description naming the underlying WS call and the shape of the result (themes map, default_theme, default_dark_theme), an agent has everything needed to select and invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case. There is nothing for the description to clarify beyond confirming the call is unfiltered and returns the entire theme registry.

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 all Lovelace themes registered with the frontend") and pins down the scope as themes registered with the frontend, which separates it from storage/file-oriented siblings like themes_list_theme_files. An agent can tell what it enumerates 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?

The "Use when" clause gives a concrete trigger: needing every theme's name and the active one before switching or editing, which ties it naturally to themes_set_active_theme and themes_update_theme. It does not explicitly name an alternative tool or an exclusion, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_reload_themesReload themes from diskA
Idempotent

Reload theme files from the themes directory.

Calls service frontend.reload_themes, making Home Assistant re-read every YAML file under <config>/themes/.

Use when: after themes_create_theme, themes_update_theme or themes_delete_theme writes a file with reload=False, or after editing a theme file outside nexus. Returns: dict with status: 'reloaded'.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, giving the safety profile. The description adds real substance beyond that: it names the underlying service (frontend.reload_themes) and the scope of the reload (every YAML file under <config>/themes/), which tells the agent the effect is broad and system-wide. It stops short of noting limits like error handling on malformed YAML.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then systematically structured into 'Use when' and 'Returns' blocks. Every sentence carries distinct information (scope, underlying service, trigger conditions, return value) with 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 no-param reload tool with an output schema, the description covers purpose, mechanism, triggers and even the return shape. An agent has everything needed to decide when to call it and what to expect.

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 document; the description correctly supplies none and instead focuses on behavior. Baseline 4 for a no-param tool 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 ('Reload theme files from the themes directory') and elaborates on what reloading actually means: re-reading every YAML file under `<config>/themes/`. This clearly distinguishes it from sibling themes_create_theme/update/delete and from themes_list_themes, which read rather than reload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' clause covering both trigger conditions: after a create/update/delete that wrote with reload=False, or after editing a theme file outside the toolset. It names the specific sibling tools whose effects it complements, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_set_active_themeSet active themeA
Idempotent

Set the active Lovelace frontend theme.

Calls service frontend.set_theme with name, and mode when it is 'light' or 'dark'; any other mode value is silently omitted from the call.

Use when: switching which theme the frontend displays. Returns: the raw result of the frontend.set_theme service call. Limits: mode values other than 'light'/'dark' are dropped rather than rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoOptional 'light' or 'dark' to also pin the color mode; any other value is ignored; omit to leave the mode as-is.
nameNoRegistered theme name to activate, e.g. 'default' or a custom theme name; defaults to 'default'.default

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful behavior beyond the annotations: it names the underlying service (frontend.set_theme) and discloses the non-obvious gotcha that invalid `mode` values are silently dropped rather than rejected, repeated in the Limits line. Annotations provide the safety profile (idempotent, non-destructive) but not this silent-failure nuance, so the description earns credit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and organized into Use when / Returns / Limits, which is easy to scan. Some redundancy between the service-call sentence and the Limits line, but overall tight with no wasted prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the Returns line is somewhat redundant, but the description is otherwise complete: it covers purpose, trigger, underlying call, the mode gotcha, and the raw-return nature. Nothing critical is missing for a two-parameter setter.

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 schema already documents both parameters including the 'any other value is ignored' behavior. The description largely restates this (mode only applied when 'light'/'dark'), so it does not add much beyond the schema; 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 ('Set the active Lovelace frontend theme') that an agent can immediately distinguish from siblings like themes_create_theme, themes_update_theme, and themes_reload_themes. The purpose is unambiguous 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?

'Use when: switching which theme the frontend displays' gives clear triggering context. It does not, however, name any alternative or exclusion (e.g., how it differs from themes_list_themes or themes_create_theme), so routing between the many theme siblings still relies on the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

themes_update_themeUpdate theme fileA
Destructive

Update an existing Lovelace theme file.

With merge=True (default), shallow-merges the given variables into the existing top-level keys — a passed modes key replaces the whole modes block rather than merging inside it; with merge=False, replaces the entire variable set. Fails if the theme file doesn't exist yet.

Use when: changing some or all variables on a theme that already exists. Not for: a theme that doesn't exist yet — use themes_create_theme. Returns: dict with success, path, merged, and reloaded (present when reload=True). Errors: {"success": false, "error": "Theme '<name>' not found at <path>"} when the file doesn't exist; {"success": false, "error": "invalid_theme_name", "detail": ...} when name contains '/' or a backslash, starts with '.', or is blank.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesTheme name to update; obtain it from themes_list_themes or themes_list_theme_files.
mergeNoIf true, shallow-merges variables into the existing top-level keys; if false, replaces the whole variable set; defaults to true.
reloadNoIf true, calls frontend.reload_themes after writing the file; defaults to true.
variablesYesVariable map to apply; merged into or replacing the existing set depending on `merge`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=false, and the description adds the exact mechanics of that destructiveness: 'merge=True' shallow-merges and a passed 'modes' key replaces the whole block, while 'merge=False' replaces the entire variable set. It also discloses the failure mode (theme must exist), the reload side effect, and concrete error payloads.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then uses labeled 'Use when / Not for / Returns / Errors' blocks so an agent can skim to the section it needs. Every sentence carries distinct information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with four parameters, nested objects, and an output schema, the description covers semantics, preconditions, side effects, return shape, and error cases. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by spelling out the shallow-merge caveat with the 'modes' example and the full-replace behavior of merge=False. The only gap is that 'reload' and 'name' are left entirely to the schema text.

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 ('Update an existing Lovelace theme file') and immediately distinguishes itself from its sibling by naming themes_create_theme as the tool for non-existent themes. An agent can route 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit 'Use when' and 'Not for' blocks, plus a named alternative (themes_create_theme) with the precise condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

todo_add_itemAdd a todo list itemA

Add a new item to a todo list via the todo.add_item service.

Sends due_date or due_datetime depending on whether due_date contains a time component ('T' or a space). Calling this twice with the same item text creates two separate items with distinct uids.

Use when: adding a new entry to a todo list. Not for: changing or completing an existing item — use todo_update_item. Returns: {"entity_id", "item", "result": ...} where result is the service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemYesItem text, e.g. 'Buy milk'.
due_dateNoOptional due date ('YYYY-MM-DD') or datetime ISO string. Omit for no due date.
entity_idYesTodo list entity ID to add the item to, e.g. 'todo.shopping_list'.
descriptionNoOptional longer item description/notes. Omit for none.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description goes beyond them by disclosing the duplicate-creation semantics (calling twice creates two items with distinct uids) and the due_date vs due_datetime dispatch logic, which are non-obvious behaviors an agent must anticipate. It is somewhat redundant in restating the return shape despite an output schema existing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then behavior, usage, exclusion, and return value in a tight structured layout. The 'Returns' block is partly redundant given the output schema, which is a minor waste but does not undermine clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a 4-parameter tool with full schema coverage, annotations, and an output schema, the description covers intent, usage, alternatives, duplicate semantics, and date handling. The only nit is duplicated return-value detail, 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 four parameters are already documented in the schema; the baseline is 3. The description adds the date-vs-datetime dispatch rule, which is useful, but the other three parameters receive no additional description-level detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (add) and resource (todo list item) and names the underlying `todo.add_item` service. It explicitly distinguishes itself from `todo_update_item`, so an agent can tell it apart from its nearest sibling 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?

Provides an explicit 'Use when' and 'Not for' pair, naming the alternative tool (`todo_update_item`) and the condition that selects it. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

todo_list_itemsList items on a todo listA
Read-onlyIdempotent

List items on a todo list, optionally filtered by status.

Calls WS todo/item/list and filters the returned items by status in Python (HA's response shape for this command has varied between "items" dicts and a bare list across versions, both are handled here).

Use when: reading a todo list's current items. Not for: listing the todo entities themselves — use todo_list_todo_lists. Returns: list of item dicts as returned by HA (fields include uid, summary/item text, status).

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoClient-side status filter: 'needs_action', 'completed', or 'all' for no filter.needs_action
entity_idYesTodo list entity ID, e.g. 'todo.shopping_list', from `todo_list_todo_lists`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description goes further with implementation context an agent cannot get elsewhere: it names the underlying WS command (`todo/item/list`), discloses that the status filter is applied client-side in Python, and warns that HA's response shape has varied across versions. Not a 5 only because return-format details are partly redundant with the existing output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded and organized into purpose, mechanism, 'Use when/Not for', and 'Returns' sections, so every part is scannable. Slight deduction because the parenthetical about version-varying response shapes, while useful, sits mid-paragraph and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not enumerate return fields, yet it still summarizes them helpfully. Combined with annotations covering safety and a complete schema, an agent has everything needed to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (including the enum-like `status` values and `entity_id` example) are already fully documented in the schema, establishing the baseline of 3. The description confirms status filtering happens post-fetch in Python, which adds mild behavioral nuance but little that the schema does not already state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('List items on a todo list') and immediately clarifies scope with 'optionally filtered by status.' It also explicitly distinguishes itself from the closest sibling by name (`todo_list_todo_lists`), 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?

Uses explicit 'Use when' and 'Not for' framing, naming the exact alternative tool (`todo_list_todo_lists`) for the confusingly similar case of listing todo entities. This is precisely the when/when-not/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.

todo_list_todo_listsList todo list entitiesA
Read-onlyIdempotent

List all todo.* entities currently registered in HA.

Filters ha.get_states() for entity IDs starting with todo..

Use when: discovering which entity_id to pass to todo_list_items/todo_add_item/todo_update_item/todo_remove_item. Not for: the items within a list — use todo_list_items. Returns: list of {"entity_id", "state", "friendly_name"} dicts, one per todo.* entity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds useful mechanism ('filters ha.get_states() for entity IDs starting with todo.*') and the return shape, going beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then layers Use when / Not for / Returns into scannable segments. No sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values in depth, yet it still names the emitted fields. Combined with rich annotations and explicit routing guidance, nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (todo.* entities) plus scope ('currently registered in HA'). It explicitly distinguishes itself from the sibling todo_list_items, which handles the items inside a 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?

Gives an explicit 'Use when' clause pointing to the exact follow-up tools (todo_list_items/todo_add_item/todo_update_item/todo_remove_item) that consume the entity_id, and an explicit 'Not for' clause naming the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

todo_remove_itemRemove a todo list itemA
DestructiveIdempotent

Remove an item from a todo list by its uid via the todo.remove_item service.

Use when: permanently deleting an item, e.g. after completing a task you don't want to keep marked completed. Not for: marking an item completed without deleting it — use todo_update_item with status='completed'. Returns: {"entity_id", "uid", "result": ...} where result is the service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesItem UID to remove, as returned by `todo_list_items`.
entity_idYesTodo list entity ID the item belongs to, e.g. 'todo.shopping_list'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, idempotentHint=true, readOnlyHint=false, so safety is partly covered. The description adds value beyond them by stressing the deletion is permanent and by disclosing the return shape, though it does not detail failure modes or whether a non-existent uid errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by clearly labeled Use when / Not for / Returns blocks. Every sentence earns its place with zero 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 simple two-parameter destructive tool with annotations and an output schema, the description covers purpose, when-to-use, the alternative, and return shape. 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 coverage is 100% and both parameters are documented in the schema, including 'as returned by todo_list_items'. The description only references uid and the list implicitly, adding no syntax or format detail beyond the schema, 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 (Remove) and resource (item from a todo list), identifies the target service, and implicitly distinguishes from the sibling todo_update_item it does not do. An agent can tell it apart from other todo_* tools immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (permanent deletion after completing a task) and 'Not for' clause naming the alternative (todo_update_item with status='completed') and the condition selecting it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

todo_update_itemUpdate a todo list itemA
Destructive

Update a todo item's text and/or status via the todo.update_item service.

Maps item to the service's rename field. Only the fields you pass (item/status) are sent, so whichever value is omitted is left unchanged on HA's side.

Use when: renaming an item or marking it needs_action/completed. Not for: adding a new item — use todo_add_item; not for removing one — use todo_remove_item. Returns: {"entity_id", "uid", "result": ...} where result is the service-call response.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesItem UID to update, as returned by `todo_list_items`.
itemNoNew item text. Omit to keep the current text.
statusNoNew status: 'needs_action' or 'completed'. Omit to keep the current status.
entity_idYesTodo list entity ID the item belongs to, e.g. 'todo.shopping_list'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, non-idempotent, non-read-only, so the safety profile is carried structurally. The description adds genuinely useful behavior beyond that: partial-update semantics ('Only the fields you pass are sent, so whichever value is omitted is left unchanged'), which directly clarifies the non-idempotent hint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then a mapping note, then explicit Use when / Not for / Returns lines. Every sentence carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description still summarizes the return shape, and it covers partial-update semantics, sibling routing, and the field mapping. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds information the schema does not carry: the `item` parameter maps to the service's `rename` field, and it restates the omit-to-keep behavior for both optional fields. That is real value beyond the schema text.

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 ('Update a todo item's text and/or status') and even names the underlying service call. The mapping of `item` to the service's `rename` field tells the agent exactly what the operation does semantically.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause (renaming, marking needs_action/completed) and an explicit 'Not for' clause naming the two alternatives, `todo_add_item` and `todo_remove_item`. Routing is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_create_pipelineCreate an Assist pipelineA

Create a new Assist pipeline via WS assist_pipeline/pipeline/create.

Every parameter is forwarded as-is to HA; engine parameters are entity IDs of the relevant provider (stt.*, tts.*, wake_word.*) rather than free-form names. Calling this twice with the same name creates two separate pipelines with distinct IDs, since HA assigns a new ID each time.

Use when: setting up a new voice pipeline with a specific combination of conversation/STT/TTS/wake-word engines. Not for: changing an existing pipeline — use voice_update_pipeline. Returns: the created pipeline dict, as returned by HA (includes its new id). Limits: engine parameters must already be installed entity IDs; discover them with voice_list_stt_engines, voice_list_tts_engines, voice_list_wake_word_engines and voice_list_conversation_agents first.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new pipeline, e.g. 'Kitchen Assist'.
languageNoOverall pipeline language code, e.g. 'en' or 'pl'.en
tts_voiceNoVoice ID for the TTS engine. Omit to use its default voice.
stt_engineNoEntity ID of the speech-to-text engine, e.g. 'stt.faster_whisper'. Omit for no STT. Discover installed ones with `voice_list_stt_engines`.
tts_engineNoEntity ID of the text-to-speech engine, e.g. 'tts.piper'. Omit for no TTS. Discover installed ones with `voice_list_tts_engines`.
stt_languageNoLanguage code for the STT engine. Omit to use its default.
tts_languageNoLanguage code for the TTS engine. Omit to use its default.
wake_word_idNoSpecific wake word model ID within `wake_word_entity`. Omit for its default.
wake_word_entityNoEntity ID of the wake-word detector, e.g. 'wake_word.openwakeword'. Omit for no wake word. Discover installed ones with `voice_list_wake_word_engines`.
conversation_engineNoEntity ID of the conversation agent, e.g. 'homeassistant' for the built-in agent.homeassistant
conversation_languageNoLanguage code for the conversation agent, e.g. 'en' or 'pl'.en

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and idempotentHint=false, but the description adds genuinely useful behavior beyond the hints: engine params are entity IDs, not free-form names, they must already be installed, and re-using a name yields a second pipeline with a distinct HA-assigned ID. It adds no permission/error-handling detail, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the create action and then uses labeled blocks (Use when / Not for / Returns / Limits) that make scanning trivial. Every sentence carries information; nothing is redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 11 parameters, an output schema, and full annotation coverage, the description supplies everything the agent still needs: the create semantics, the sibling to avoid, the discovery prerequisites, and the create-twice caveat. Return-value detail is minimal precisely because an output schema exists.

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, but the description adds value by clarifying that engine parameters are provider entity IDs (stt.*, tts.*, wake_word.*) rather than human-readable names and by pointing to the list_*_engines tools for discovery. It does not document defaults or the conversation_engine fallback, which the schema covers.

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 new Assist pipeline') and even names the underlying WS command (assist_pipeline/pipeline/create). It is clearly distinguishable from siblings like voice_update_pipeline, voice_list_pipelines, and voice_set_preferred_pipeline.

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?

Contains explicit 'Use when' and 'Not for' clauses, routing existing-pipeline changes to voice_update_pipeline. It also names the four discovery tools the agent must call before supplying engine entity IDs, so the prerequisites are unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_delete_pipelineDelete an Assist pipelineA
DestructiveIdempotent

Delete an Assist pipeline via WS assist_pipeline/pipeline/delete.

HA rejects deleting the pipeline currently marked preferred — call voice_set_preferred_pipeline with a different id first in that case.

Use when: permanently removing a pipeline that is no longer needed. Not for: the preferred pipeline without switching preference first, and not for temporarily disabling a pipeline (HA has no such state). Returns: HA's WS response for assist_pipeline/pipeline/delete (typically empty on success).

ParametersJSON Schema
NameRequiredDescriptionDefault
pipeline_idYesID of the pipeline to delete, from `voice_list_pipelines`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the non-obvious behavioral constraint that HA rejects deleting the currently-preferred pipeline and requires switching preference first, plus the fact that no 'disabled' state exists. That is substantive context beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then structured Use when / Not for / Returns sections. Every sentence carries load — the precondition, the exclusion, and the return behavior — with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param destructive tool with an output schema present, the description covers the destructive caveat, the required precondition, and even summarizes the return. Nothing an agent needs to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter already documents itself ('ID of the pipeline to delete, from voice_list_pipelines'). The description adds no format or syntax 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 (Delete) and resource (Assist pipeline) and even names the underlying WS command `assist_pipeline/pipeline/delete`, which cleanly separates it from the sibling voice_update_pipeline and voice_create_pipeline. An agent knows exactly what this 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?

Explicit 'Use when' and 'Not for' clauses: permanent removal only, not for the preferred pipeline without switching preference first, and not for disabling (which HA does not support). It routes the agent to voice_set_preferred_pipeline as the required prior step, 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.

voice_get_pipelineGet an Assist pipelineA
Read-onlyIdempotent

Get a single Assist pipeline by id, or the preferred one if omitted.

Calls WS assist_pipeline/pipeline/get, passing pipeline_id only when given.

Use when: you need one pipeline's full configuration (engines, languages) rather than the whole list. Not for: every pipeline at once — use voice_list_pipelines. Returns: dict with the pipeline's engine/language fields, as returned by HA.

ParametersJSON Schema
NameRequiredDescriptionDefault
pipeline_idNoPipeline ID to fetch, from `voice_list_pipelines`. Omit to return the current preferred pipeline instead.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower; the description still adds value by disclosing the WS method used (assist_pipeline/pipeline/get), the conditional argument passing, and the preferred-pipeline fallback. It doesn't discuss auth or error behavior, but that is minor given the safety 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?

Short, front-loaded (purpose first, then dispatch detail, then when/when-not, then return shape), with no redundant sentences.

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-param read tool with full annotations and an output schema, the description covers purpose, routing, dispatch mechanism, fallback behavior, and return shape. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter description already explains the omit-for-preferred behavior, so the description mostly restates it. Baseline 3 applies since the schema carries the parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a single Assist pipeline by id, or the preferred one if omitted'), and explicitly distinguishes itself from the sibling voice_list_pipelines. The fallback-to-preferred behavior is called out up front.

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?

Contains explicit 'Use when' and 'Not for' clauses naming the alternative (voice_list_pipelines) with the selecting condition. An agent can route between the two tools without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_list_conversation_agentsList conversation agentsA
Read-onlyIdempotent

List conversation agents available for a pipeline's conversation step.

Calls WS conversation/agent/list and returns its payload unchanged.

Use when: discovering which conversation_engine value to pass to voice_create_pipeline/voice_update_pipeline. Not for: STT/TTS/wake-word engines — use voice_list_stt_engines/ voice_list_tts_engines/voice_list_wake_word_engines. Returns: dict as returned by HA's conversation/agent/list WS command.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world behavior. The description adds meaningful backend context beyond that: it names the underlying WS command (`conversation/agent/list`) and states the payload is returned unchanged, telling the agent this is a raw passthrough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then cleanly organized into 'Use when', 'Not for' and 'Returns' blocks. Every sentence carries routing or behavioral information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only discovery tool with full annotations and an output schema, the description is complete. It even discloses the WS command and passthrough return behavior, which the output schema alone would not make obvious.

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 to document and the baseline is 4. The description correctly implies no input is required.

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 conversation agents') and scopes it precisely to a pipeline's conversation step. It also names the sibling engine-list tools it is not, so the agent can distinguish 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?

Explicit 'Use when' clause ties the tool to discovering the `conversation_engine` value needed by `voice_create_pipeline`/`voice_update_pipeline`, and a 'Not for' clause routes STT/TTS/wake-word lookups to the specific alternative tools. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_list_pipelinesList Assist pipelinesA
Read-onlyIdempotent

List all Assist pipelines plus the preferred pipeline id.

Calls WS assist_pipeline/pipeline/list and returns its payload unchanged.

Use when: you need every configured pipeline, e.g. to pick one for voice_set_preferred_pipeline or before editing one with voice_update_pipeline. Not for: a single pipeline's full detail — use voice_get_pipeline. Returns: {"pipelines": [...], "preferred_pipeline": "<id>"}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false). The description adds useful behavioral context beyond annotations: it calls WS 'assist_pipeline/pipeline/list' and returns the payload unchanged, and notes the response includes the preferred pipeline id. It does not address auth or rate limits, so it is not 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?

Front-loads the one-line purpose, then gives the underlying WS endpoint, use/not-for routing, and return shape. Every sentence earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, an output schema, and full annotations, the description supplies all routing and return context an agent needs. It even describes the return object despite the output schema already covering it, which is harmless reinforcement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description appropriately avoids inventing parameter semantics and instead clarifies the return shape, which is extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all Assist pipelines') and includes the preferred pipeline id. It explicitly distinguishes itself from the single-pipeline sibling by noting that full detail requires voice_get_pipeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' sections. It names the relevant alternatives (voice_set_preferred_pipeline, voice_update_pipeline, voice_get_pipeline) and the conditions under which each applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_list_stt_enginesList speech-to-text enginesA
Read-onlyIdempotent

List installed speech-to-text engines as their stt.* entities.

Filters ha.get_states() for entity IDs starting with stt..

Use when: discovering which STT engine entity ID to pass to voice_create_pipeline/voice_update_pipeline. Not for: TTS or wake-word engines — use voice_list_tts_engines/ voice_list_wake_word_engines. Returns: list of {"entity_id", "state", "attributes"} for each stt.* entity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds the underlying mechanism ('Filters ha.get_states() for entity IDs starting with stt.*'), which tells the agent the result is derived from current state rather than a registry. It does not add auth/permission or freshness caveats, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then cleanly segmented into Use when / Not for / Returns. Every sentence carries information, though the 'Returns' line partially duplicates the existing output schema, which is mild redundancy in an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing tool with an output schema and full annotation coverage, the description supplies everything an agent needs: what it lists, how it is derived, when to use it, which siblings to avoid, and the shape of the result.

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 clarify or compensate for. The description correctly implies the only 'filter' is implicit (the stt.* prefix) rather than a caller-supplied argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('installed speech-to-text engines'), plus the exact entity namespace ('stt.*') it operates on. It explicitly distinguishes itself from the TTS and wake-word listing siblings by name, so an agent can route 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?

Provides explicit 'Use when' guidance tied to a concrete downstream need (discovering the STT entity ID to pass to voice_create_pipeline/voice_update_pipeline) and an explicit 'Not for' exclusion pointing to voice_list_tts_engines and voice_list_wake_word_engines. This is the full when/when-not/alternatives pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_list_tts_enginesList text-to-speech enginesA
Read-onlyIdempotent

List installed text-to-speech engines as their tts.* entities.

Filters ha.get_states() for entity IDs starting with tts..

Use when: discovering which TTS engine entity ID to pass to voice_create_pipeline/voice_update_pipeline. Not for: STT or wake-word engines — use voice_list_stt_engines/ voice_list_wake_word_engines. Returns: list of {"entity_id", "state", "attributes"} for each tts.* entity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds behavioral context beyond that: it explains the list is derived by filtering ha.get_states() for `tts.` prefixes, which tells the agent the source of data and scope of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then organized into terse Use-when / Not-for / Returns clauses. Every sentence adds routing or behavioral value with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero params, rich annotations, and an existing output schema, the description covers everything an agent needs: what it lists, when to use it, which siblings to avoid, and the shape of the result. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the empty schema is self-explanatory. Baseline of 4 applies for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (text-to-speech engines) and pins down exactly what is returned ('as their `tts.*` entities'). It distinguishes itself from the nearby voice_list_stt_engines and voice_list_wake_word_engines siblings by name, so an agent can route 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?

Contains explicit 'Use when' and 'Not for' clauses, and names the alternative sibling tools for the disallowed STT/wake-word cases. The selecting condition (discovering a TTS entity ID to pass to voice_create_pipeline/voice_update_pipeline) is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_list_wake_word_enginesList wake-word enginesA
Read-onlyIdempotent

List installed wake-word detection engines as their wake_word.* entities.

Filters ha.get_states() for entity IDs starting with wake_word..

Use when: discovering which wake-word entity ID to pass to voice_create_pipeline/voice_update_pipeline. Not for: STT or TTS engines — use voice_list_stt_engines/ voice_list_tts_engines. Returns: list of {"entity_id", "state", "attributes"} for each wake_word.* entity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered. The description adds genuine behavioral context by disclosing the data source (a filtered ha.get_states scan over the wake_word domain), which explains why no parameters are needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by labelled 'Use when / Not for / Returns' blocks; every sentence is short and functional, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A no-param read-only lister with annotations covering safety and an output schema covering shape. The description supplies routing, exclusions, and data source, leaving nothing an agent needs 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 the baseline is 4; the description correctly implies there is nothing to configure by noting the result is a fixed filter over states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List installed wake-word detection engines') and pins the exact entity domain (`wake_word.*`), which cleanly separates it from the STT/TTS engine listers among its many siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause ties it to the downstream need (discovering an entity ID for voice_create_pipeline/voice_update_pipeline), and the 'Not for' clause names both alternative tools and the condition that selects them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_set_preferred_pipelineSet the preferred Assist pipelineA
Idempotent

Set the default Assist pipeline, used when no pipeline is specified.

Calls WS assist_pipeline/pipeline/set_preferred.

Use when: changing which pipeline Assist uses by default. Not for: reading the current preference — use voice_list_pipelines, whose response includes preferred_pipeline. Returns: HA's WS response for assist_pipeline/pipeline/set_preferred (typically empty on success).

ParametersJSON Schema
NameRequiredDescriptionDefault
pipeline_idYesID of the pipeline to make preferred, from `voice_list_pipelines`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Mentions the underlying WS call and what it returns, which adds some context. However, annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, covering the key behavioral traits. The description doesn't add much beyond that – no mention of permissions, side effects, or whether the previous preference is lost.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each earning its place: statement of purpose, WS endpoint, usage guidance, return value. Front-loaded with the action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple single-parameter mutation with full schema coverage and an output schema, the description is nearly complete. It mentions return value despite the output schema, which is slightly redundant, but otherwise 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter is fully documented in the schema. The description doesn't add syntax or constraints beyond what the schema provides. 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: 'Set the default Assist pipeline, used when no pipeline is specified.' The WS endpoint reference adds precision, and it clearly distinguishes itself from voice_list_pipelines.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when:' and 'Not for:' guidance, naming the alternative tool (voice_list_pipelines) for the read case. This is textbook routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

voice_update_pipelineUpdate an Assist pipelineA
Destructive

Update an existing Assist pipeline's fields via WS assist_pipeline/pipeline/update.

HA's WS API requires the full set of fields on every update call, so this first fetches the current pipeline with WS assist_pipeline/pipeline/get and fills in any parameter left as None from that current state before sending the update — only the parameters you actually pass are changed; the previous value of any field you omit is lost from this call's perspective and replaced by whatever assist_pipeline/pipeline/get returned for it.

Use when: changing one or more fields of an existing pipeline. Not for: creating a new pipeline — use voice_create_pipeline. Returns: the updated pipeline dict, as returned by HA.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew display name. Omit to keep the current name.
languageNoNew overall pipeline language code. Omit to keep the current one.
tts_voiceNoNew TTS voice ID. Omit to keep the current one.
stt_engineNoNew STT engine entity ID. Omit to keep the current one.
tts_engineNoNew TTS engine entity ID. Omit to keep the current one.
pipeline_idYesID of the pipeline to update, from `voice_list_pipelines`.
stt_languageNoNew STT language code. Omit to keep the current one.
tts_languageNoNew TTS language code. Omit to keep the current one.
wake_word_idNoNew wake word model ID. Omit to keep the current one.
wake_word_entityNoNew wake-word detector entity ID. Omit to keep the current one.
conversation_engineNoNew conversation agent entity ID. Omit to keep the current one.
conversation_languageNoNew conversation language code. Omit to keep the current one.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false. The description adds substantial non-obvious context: HA's WS API requires the full field set, so the tool first fetches the current pipeline and fills omitted parameters from it, meaning only passed parameters are changed. It also states the return value, but does not mention auth needs or other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then explains the non-obvious fetch/update mechanism, then gives use/not-for and return information. The middle sentence about omitted fields is slightly convoluted and could be tighter, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter mutation with full annotations and an output schema, the description covers purpose, selection criteria, the unusual WS full-set behavior, and the alternative tool. Nothing needed for correct invocation is missing; return values are covered by the output schema even though the description also mentions them.

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 the schema already documents every optional parameter with 'Omit to keep the current one.' The description reinforces the omission behavior and explains the fetch mechanism, but adds no per-parameter syntax or meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Update') and resource ('Assist pipeline'), and explicitly differentiates from the sibling create tool: 'Not for: creating a new pipeline — use voice_create_pipeline.' The WS endpoint name confirms the exact operation being performed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: changing one or more fields of an existing pipeline' and 'Not for: creating a new pipeline — use voice_create_pipeline.' This provides condition, exclusion, and the exact alternative in two sentences.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ws_call_serviceCall a service and return its responseA
Destructive

Call a Home Assistant action over WebSocket and return its response data.

Sends call_service with return_response=True always set, so actions that support a response (e.g. weather.get_forecasts, calendar.get_events) return it; actions without one (light.turn_on, most control actions) fail with a validation error. domain/service must match [A-Za-z0-9_]+ (ADR-0006 D3) or the call is refused first. Refuses hassio.addon_stop/app_stop/addon_stdin/app_stdin against nexus's own add-on (self_protection.is_own_addon); addon_restart/ app_restart stay allowed. Outright refuses the eight services services_call_service gates behind confirm (ADR-0006 D5) — none support a response (F1).

Use when: the action's response payload is needed, not just the changed states. Not for: a plain control action, or one of the eight guarded services — use services_call_service for both. Returns: raw WS result: {success, result: {context, response}} on success, or a failure dict from HA; {"success": False} if no result message arrives. Errors: raises RuntimeError on a handshake timeout; {"error": "invalid_service_name"} for a malformed domain/service; {"error": "self_addon_hassio_service_blocked", "message": ...} for a blocked hassio.* case; {"error": "guarded_service_refused", "message": ..., "use": "services_call_service"} for a guarded service. Limits: blocks for up to timeout seconds (default 10), including the initial handshake.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoService data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data.
domainYesService domain to call, e.g. 'weather' or 'calendar'.
serviceYesService name within the domain, e.g. 'get_forecasts' or 'get_events'.
timeoutNoMaximum seconds to wait for the WebSocket handshake and the result message before giving up; must be between 1 and 300.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the annotations (which only flag destructive/openWorld/idempotent hints): it discloses that return_response=True is always sent, that non-response actions fail with a validation error, the domain/service name regex, the self-addon protection for hassio.* services, the guarded-service refusal, the full error taxonomy, and the blocking timeout behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then cleanly sectioned into Use when / Not for / Returns / Errors / Limits. Dense and nearly every line earns its place, though the ADR/requirement citations (D3, D5, F1) add provenance noise for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description covers return shape, error variants, and timeout limits, plus the refusal paths. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, but the description adds a constraint not present in the schema: domain/service must match [A-Za-z0-9_]+ or the call is refused, plus the timeout blocks for handshake and result. That is meaningful extra semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (call), resource (Home Assistant action over WebSocket) and the differentiator (return its response data). It is immediately distinguishable from services_call_service, which is named as the sibling for the non-response case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (response payload is needed, not just changed states) and 'Not for' (plain control actions, the eight guarded services), each routing to the named alternative services_call_service. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ws_get_configGet HA config via WebSocketA
Read-onlyIdempotent

Get Home Assistant's own configuration over WebSocket.

Sends get_config and waits up to timeout seconds for the matching result message.

Use when: reading HA's location, unit system, version and component list over the WebSocket transport. Not for: the same data over HTTP — use history_get_ha_config. Returns: HA's config dict from result.result (location, unit_system, version, components, ...). Errors: raises RuntimeError when the WebSocket handshake or the result message does not arrive within timeout, or when a result message arrives but is not successful. Limits: blocks for up to timeout seconds (default 10), including the initial handshake.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNoMaximum seconds to wait for the WebSocket handshake and the result message before raising an error; must be between 1 and 300.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: the blocking nature, the default and max timeout, and the precise failure conditions (handshake or result not arriving -> RuntimeError, unsuccessful result). This is richer than annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded summary sentence followed by clearly labeled Use when/Not for/Returns/Errors/Limits blocks. Each line carries information; the structured form is slightly heavier than needed but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists (so return shape is documented structurally), the description names the return path and fields, documents error modes and timing limits. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents the timeout with default, min and max. The description repeats the default (10) and adds that blocking includes the initial handshake, but adds little beyond the schema. 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 ('Get Home Assistant's own configuration over WebSocket') and pins the underlying command (`get_config`). It explicitly distinguishes itself from the HTTP sibling that returns the same data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' (reading location, unit system, version, components over WebSocket) and 'Not for' ('the same data over HTTP — use history_get_ha_config'). Both the condition and the alternative are named directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ws_get_statesGet all entity states via WebSocketA
Read-onlyIdempotent

Get all entity states over the WebSocket API in one call.

Sends get_states and waits up to timeout seconds for the matching result message; this can be faster than the HTTP /api/states endpoint on large installs since it avoids per-entity HTTP overhead.

Use when: fetching every entity's state on a large installation. Not for: a filtered or paginated state list — use entities_list_entities. Returns: the list of state dicts from HA's result.result. Errors: raises RuntimeError when the WebSocket handshake or the result message does not arrive within timeout, or when a result message arrives but is not successful. Limits: blocks for up to timeout seconds (default 10), including the initial handshake.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNoMaximum seconds to wait for the WebSocket handshake and the result message before raising an error; must be between 1 and 300.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds value beyond that: it discloses that the call blocks up to timeout seconds (including handshake), and that it raises RuntimeError on handshake failure or an unsuccessful result message. This is meaningful failure-mode context, though return shape is deferred to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and uses labeled sections (Use when / Not for / Returns / Errors / Limits) that make it scannable. The 'Returns' line is somewhat redundant given the output schema, but overall the text 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?

Covers purpose, selection criteria, error conditions, and blocking limits, which is ample for a single-parameter read tool. Since an output schema exists, the brief 'Returns' note is a minor redundancy rather than a 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 timeout parameter (range, default) is fully documented there. The description mentions the default of 10 and the blocking semantics, but adds no syntax or format beyond the schema. 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 ('Get all entity states') plus the transport mechanism (WebSocket API) and scope ('in one call'). It explicitly contrasts with the HTTP /api/states endpoint and the filtered sibling entities_list_entities, so an agent can distinguish 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?

Provides explicit 'Use when' (fetching every entity on a large installation) and 'Not for' (filtered/paginated lists) guidance, naming the alternative tool by name. The selection condition is fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ws_listen_eventsListen for a HA event typeA
Read-onlyIdempotent

Passively wait for and collect events of one HA event type.

Subscribes to event_type via subscribe_events and collects up to count events, returning early once that many arrive or whatever arrived once timeout elapses.

Use when: observing any event type, e.g. integration or automation events not tied to a single entity's state. Not for: state changes on one specific entity — use ws_listen_state_changes. Returns: list of raw event payloads as HA sent them. Errors: raises RuntimeError when the WebSocket handshake does not complete within timeout. Limits: blocks for up to timeout seconds, including the initial handshake; collects at most count events.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoMaximum number of events to collect before returning early.
timeoutNoMaximum seconds to wait for `count` events before returning what arrived; must be between 1 and 300.
event_typeYesHA event type to subscribe to, e.g. 'zha_event' or 'call_service'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already covering read-only safety, the description adds substantial behavioral context beyond them: it blocks for up to `timeout` seconds including the initial handshake, returns early once `count` events arrive, returns raw event payloads, and raises `RuntimeError` if the WebSocket handshake does not complete within `timeout`. These are meaningful operational traits not present in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and organized into clear sections for use, non-use, returns, errors, and limits. Every sentence adds useful information without redundancy, and the structure makes scanning easy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's blocking listen behavior, the existing output schema, and annotations, the description covers the necessary usage, behavioral limits, error condition, and return payload shape. Nothing critical for correct invocation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by noting that `timeout` includes the initial WebSocket handshake and that `count` is a maximum before early return. These details go beyond the schema's parameter descriptions, though the schema already covers the core semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Passively wait for and collect events of one HA event type.' It also distinguishes itself from the sibling `ws_listen_state_changes` by saying it is not for state changes on one specific entity. An agent can identify the tool's 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it ('observing any event type, e.g. integration or automation events not tied to a single entity's state') and when not to use it ('state changes on one specific entity — use `ws_listen_state_changes`'). This gives clear routing guidance between alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ws_listen_state_changesListen for one entity's state changesA
Read-onlyIdempotent

Passively wait for and collect state_changed events for one entity.

Subscribes to HA's state_changed event type, which has no server-side per-entity filter, and counts only events matching entity_id toward count, so unrelated entities' events do not displace the target's. Returns early once count matching events arrive, or whatever arrived once timeout elapses.

Use when: waiting for a specific entity to change state, e.g. to confirm an action took effect. Not for: any entity's events — use ws_listen_events with event_type='state_changed'; a one-shot trigger condition — use ws_subscribe_trigger. Returns: list of dicts with entity_id, old_state, new_state, last_changed. Errors: raises RuntimeError when the WebSocket handshake does not complete within timeout. Limits: blocks for up to timeout seconds, including the initial handshake; collects at most count events.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoMaximum number of matching events to collect before returning early.
timeoutNoMaximum seconds to wait for `count` matching events before returning what arrived; must be between 1 and 300.
entity_idYesFull entity ID to watch for state changes, e.g. 'binary_sensor.motion'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows this is a safe, non-destructive operation. The description adds significant behavioral context beyond that: it explains the lack of server-side filtering, the client-side counting, early-return condition, timeout behavior, RuntimeError on handshake failure, and the blocking nature. It doesn't contradict annotations and adds useful operational details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections (core behavior, usage, returns, errors, limits). It is somewhat verbose with multiple paragraphs, but every sentence carries useful information for a complex streaming tool. The core behavior is stated first, though not as a single front-loaded sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description adds full return value explanation (list of dicts with entity_id, old_state, new_state, last_changed), error conditions, and blocking limits. It covers all aspects an agent needs to call the tool correctly and interpret results, making it fully complete for a complex long-running 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%, so the schema already documents all three parameters with types, defaults, and bounds. The description mentions entity_id, count, and timeout in its behavioral narrative, but adds no syntax or format details beyond what the schema provides. Baseline 3 is appropriate.

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 ('wait for and collect') and resource ('state_changed events for one entity'), and the sibling list confirms related tools. It distinguishes itself from ws_listen_events via the 'Not for' clause, but the core purpose is not front-loaded as a single location; it requires scanning the usage section to fully understand it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' clauses naming the exact alternatives (ws_listen_events with event_type='state_changed' and ws_subscribe_trigger) and their scenarios. Nothing is left to inference about when to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ws_render_templateRender a Jinja2 template via subscriptionA
Read-onlyIdempotent

Render a Jinja2 template through HA's WebSocket render_template subscription.

Sends render_template; HA acknowledges the subscription with a null result, then streams the rendered value in a follow-up event. This waits up to timeout seconds for that event and returns its result.

Use when: the WebSocket transport itself is specifically required. Not for: a one-shot render — use services_render_template, a plain HTTP call with no subscription semantics. Returns: the rendered template value from the event's result field. Errors: raises RuntimeError when the template itself errors (e.g. an undefined variable), when the WebSocket handshake does not complete within timeout, or when no event arrives within timeout. Limits: blocks for up to timeout seconds (default 10), including the initial handshake.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNoMaximum seconds to wait for the rendered value before raising an error; must be between 1 and 300.
templateYesJinja2 template string to render, e.g. '{{ states("sensor.temp") }}'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial protocol context: the subscription ack, streaming of the value in a follow-up event, blocking up to timeout seconds, and the three RuntimeError conditions. This is well beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then clearly labelled Use/Not for/Returns/Errors/Limits sections. Every sentence carries distinct, non-redundant information despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still names the return field and enumerates failure modes and blocking limits. Nothing an agent needs to call this correctly — transport choice, timeout behavior, error conditions — is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both template and timeout (including range 1-300, default 10). The description reinforces the timeout blocking behavior but adds no syntax 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 (render), resource (Jinja2 template), and mechanism (HA WebSocket render_template subscription). It explicitly distinguishes itself from the one-shot sibling services_render_template, so an agent can route 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?

Provides an explicit 'Use when: the WebSocket transport itself is specifically required' and 'Not for: a one-shot render — use services_render_template'. Both the selection condition and the named alternative are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ws_subscribe_triggerWait for a HA trigger to fireA
Read-onlyIdempotent

Passively wait for a Home Assistant trigger definition to fire once.

Sends subscribe_trigger with the given trigger and waits up to timeout seconds for the matching event.

Use when: waiting for a specific trigger condition (state, time, numeric state, ...) rather than polling. Not for: raw state_changed events on one entity — use ws_listen_state_changes. Returns: the trigger's event context dict when it fires, or None if timeout elapses first. Errors: raises RuntimeError when the WebSocket handshake does not complete within timeout. Limits: blocks for up to timeout seconds, including the initial handshake.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNoMaximum seconds to wait for the trigger to fire before returning None; must be between 1 and 300.
triggerYesHA trigger definition dict, e.g. {'platform': 'state', 'entity_id': 'binary_sensor.motion', 'to': 'on'}.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, not open-world), and the description adds substantial non-obvious behavior: it blocks up to `timeout` seconds including the handshake, returns the event context dict or None on timeout, and raises RuntimeError on a failed handshake.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded first line states the action, then labeled blocks (Use when / Not for / Returns / Errors / Limits) make it scannable with no filler sentences.

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 blocking wait tool with an output schema, the description covers return value, failure mode, and the blocking time budget, leaving no gap an agent needs before invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — the schema already documents the trigger dict example and the timeout bounds (1-300, default 30) — so the description's mention of `trigger` and `timeout` adds little. The only marginal extra is that the blocking window includes the handshake, which is behavioral rather than parametric.

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 ('passively wait for a Home Assistant trigger definition to fire once') and names the sibling it is not, ws_listen_state_changes, so an agent can route correctly 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?

Explicit 'Use when' clause (waiting for a specific trigger condition rather than polling) and explicit 'Not for' clause pointing to ws_listen_state_changes for raw state_changed events. Both the positive and negative routing conditions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_create_zoneCreate zone helperA

Create a zone as a UI helper (storage collection), not a YAML zone.

Calls WS zone/create with the given coordinates and radius; only zones created this way can later be changed through zones_update_zone or zones_delete_zone. zone.home (core config) and YAML-defined zones live outside this storage collection and cannot be created here.

Use when: adding a new geofence zone without editing configuration.yaml. Returns: dict with status, name, and the raw WS result. Errors: on failure, returns {"error": "<message>", "hint": "...", "name": ...} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoOptional mdi icon identifier, e.g. 'mdi:office-building'; omit for none.
nameYesDisplay name for the new zone, e.g. 'Office'.
radiusNoZone radius in meters; defaults to 100.
passiveNoIf true, excludes the zone from device-tracker zone suggestions; defaults to false.
latitudeYesLatitude in decimal degrees, e.g. 52.23.
longitudeYesLongitude in decimal degrees, e.g. 21.01.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already covering safety hints (readOnlyHint=false, destructiveHint=false), the description adds substantial behavioral context: it discloses the underlying WS call (zone/create), the persistence constraint that only zones created this way can be updated/deleted later, the return shape (status, name, raw WS result), and error behavior (returns an error dict instead of raising). This goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and distinction, then flows into behavioral details, usage guidance, return values, and error handling in a logical order. Every sentence carries useful information without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a create mutation with full annotation coverage and an output schema, the description is complete: it explains purpose, usage context, behavioral constraints, return format (though output schema exists, the description still clarifies), and error handling. No critical gaps remain for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema itself fully documents all six parameters with examples and defaults. The description only alludes to 'given coordinates and radius', adding no new semantic information beyond the schema. A 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?

The description states a specific verb (Create) and resource (zone), and explicitly distinguishes it from YAML zones and from the update/delete siblings by noting that only zones created this way can later be changed through zones_update_zone or zones_delete_zone. An agent can immediately tell what the tool does and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit usage guidance ('Use when: adding a new geofence zone without editing configuration.yaml') and clear exclusions ('zone.home (core config) and YAML-defined zones live outside this storage collection and cannot be created here'). The alternative approach (editing configuration.yaml) is named, leaving no ambiguity about when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_delete_zoneDelete zone helperA
DestructiveIdempotent

Delete a zone helper.

Calls WS zone/delete; accepts either the bare helper id or the full zone.<id> entity_id. Only works for zones created via zones_create_zone — zone.home and YAML-defined zones reject this WS command.

Use when: removing a UI-helper zone that is no longer needed. Returns: dict with status, zone_id, and the raw WS result. Errors: on failure, returns {"error": "<message>", "hint": "...", "zone_id": ...} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
zone_idYesZone helper id or full entity_id like 'zone.office'; obtain it from zones_list_zones.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations (destructiveHint=true, idempotentHint=true, readOnlyHint=false): it names the underlying WS command (`zone/delete`), the two accepted id formats, the return shape (`status`, `zone_id`, raw WS `result`), and the non-raising error contract with an `error`/`hint` payload. An agent knows exactly how failures surface before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line purpose, then uses labeled "Calls / Use when / Returns / Errors" lines so each sentence carries distinct information. Nothing is padded and no section repeats another.

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, the definition covers purpose, eligibility constraints, id formats, return shape, and error semantics. Even though an output schema exists (so return details were optional), the added error contract leaves no ambiguity about invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the `zone_id` description already covers the id-vs-entity_id form, so the baseline would be 3. The description restates and reinforces the dual-format acceptance and ties the value's origin to `zones_list_zones`, which is marginally useful but largely duplicative of the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete a zone helper") and immediately scopes it: only zones created via `zones_create_zone`, while `zone.home` and YAML-defined zones reject the command. That distinction is what separates it from sibling helpers like `zones_update_zone` or `zones_reload_zones` 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?

Contains an explicit "Use when" line (removing a UI-helper zone no longer needed) plus a negative condition naming the zone classes that will fail. It also points at `zones_create_zone` as the counterpart and `zones_list_zones` as the id source, so both when and when-not are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_get_user_locationGet person locationA
Read-onlyIdempotent

Get one person entity's current location.

Prefixes person_entity_id with person. if missing, then reads its state and location attributes.

Use when: you need just one person's coordinates rather than scanning a zone with zones_list_persons_in_zone. Returns: dict with entity_id, state, latitude, longitude, gps_accuracy, source. Errors: {"error": "<message>", "entity_id": ...} if the person entity does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
person_entity_idYesPerson entity_id, e.g. 'person.alice'; a bare id like 'alice' is prefixed with 'person.' automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is carried by structured data. The description adds real context beyond that: the automatic 'person.' prefix mutation and the error shape for a missing entity. It does not cover the case where the entity exists but has no location attributes, so it stops short of full disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and cleanly sectioned with Use when / Returns / Errors, so an agent can scan the relevant part. There is mild redundancy: 'reads its state and location attributes' overlaps with the Returns list, and the title restates the opening line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Annotations carry safety, an output schema exists, and the description still supplies routing, the returned fields, and the error contract — more than enough for a one-parameter read tool. Only edge behavior (person present without GPS coordinates) is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter at 100% schema description coverage, the baseline is 3. The schema already documents the bare-id prefixing behavior, so the description's mention of it is reinforcement rather than added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one person entity's current location') and names the sibling tool it is distinct from ('rather than scanning a zone with zones_list_persons_in_zone'). An agent can separate it from zones_list_persons_in_zone and entities_get_entity 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?

Uses an explicit 'Use when' clause and names the alternative operation plus the condition ('need just one person's coordinates rather than scanning a zone'). Routing between this and zone-scanning is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_get_zoneGet zoneA
Read-onlyIdempotent

Get one zone entity's full state and attributes.

Prefixes entity_id with zone. if missing, then fetches it with ha.get_state.

Use when: you need every attribute of a single zone rather than the slimmed list from zones_list_zones. Returns: the full HA state object for the zone (entity_id, state, attributes). Errors: {"error": "<message>", "entity_id": ...} if the zone entity does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesZone entity_id, e.g. 'zone.office'; a bare id like 'office' is prefixed with 'zone.' automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds useful behavior beyond that: automatic 'zone.' prefixing, the underlying ha.get_state call, and the error shape when the entity is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then tight labeled lines for behavior, usage, returns, and errors. Every line carries distinct information with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't detail the return payload, and its brief 'Returns' note suffices. Error behavior, prefixing, and usage context are all covered for a simple single-parameter read.

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 is fully documented, including the bare-id prefixing rule. The description restates that prefixing behavior but adds no new syntax or format detail, so the baseline 3 for high coverage 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+resource ('Get one zone entity's full state and attributes') and contrasts it with the sibling 'zones_list_zones'. An agent can distinguish it from other zone tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use when: you need every attribute of a single zone rather than the slimmed list from zones_list_zones', naming the alternative and the condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_list_persons_in_zoneList persons in zoneA
Read-onlyIdempotent

List person entities currently inside a given zone.

Reads the zone's own persons attribute (maintained by Home Assistant's zone component); falls back to matching each person's state string against the zone only when that attribute is entirely absent, which also special-cases zone.home (Home Assistant always reports "home" there regardless of the zone's friendly_name).

Use when: checking who is currently inside a specific zone. Returns: list of dicts (entity_id, state, friendly_name, latitude, longitude) for persons in the zone; empty list if the zone does not exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
zone_entity_idYesZone entity_id, e.g. 'zone.home'; a bare id like 'home' is prefixed with 'zone.' automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint and idempotentHint already declared, the description adds substantial behavioral context: it reads the zone's own `persons` attribute, explains the fallback path when that attribute is absent, and flags the zone.home special case where Home Assistant always reports 'home'. This is real implementation-detail disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the primary purpose, then conditions, then 'Use when' and 'Returns'. The middle paragraph on the persons-attribute fallback is dense but informative; slightly longer than strictly needed for a one-parameter read tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists (so return shape enumeration carries less burden), the description still summarizes the returned dict fields and the empty-list edge case, and explains the resolution order for identifying zone members. For a read-only single-param tool, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema documents the bare-id auto-prefix behavior; the description adds the fallback semantics tied to the zone_entity_id (that a missing zone yields an empty list). It reinforces schema meaning rather than duplicating the format string, but adds limited new parameter-specific detail beyond coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+scope ('List person entities currently inside a given zone'), distinguishing it from sibling list tools like zones_list_zones and entities_list_entities. The 'currently inside' phrasing makes the temporal filter explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit 'Use when: checking who is currently inside a specific zone', which gives clear positive guidance. It does not name an alternative tool or an exclusion condition, so it falls short of 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_list_zonesList zonesA
Read-onlyIdempotent

List all zone entities with their common location attributes.

Reads all HA states and keeps zone.* entities, projecting each down to entity_id, state, and any of latitude, longitude, radius, friendly_name, passive and icon present in its attributes.

Use when: you need every zone's location and radius, e.g. before checking who is inside one. Returns: list of slimmed zone dicts as described above.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely non-obvious behavior: it scans ALL HA states and filters down to zone.* entities, then projects each to a slim attribute set. That implementation detail (broad read, filtered projection) is useful context the annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then mechanism, then usage, then return shape — a clean structure with no filler. The closing "as described above" is mildly redundant since the projection was just enumerated, costing it a point.

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-only list tool with an output schema present, the description covers purpose, filtering behavior, usage trigger and return shape, so nothing an agent needs to invoke it correctly is missing. The return-value sentence is technically duplicative of the output schema, but harmless.

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 per the rubric the baseline is 4. There is nothing for the description to disambiguate, and it correctly does not invent parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List all zone entities") and immediately narrows scope with "with their common location attributes," which distinguishes it from zones_get_zone (single zone) and zones_list_persons_in_zone (occupancy). An agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The explicit "Use when: you need every zone's location and radius, e.g. before checking who is inside one" gives a concrete trigger and even hints at the natural follow-up tool (zones_list_persons_in_zone). It stops short of naming alternatives or exclusions explicitly, so it falls just below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_reload_zonesReload zones from YAMLA
Idempotent

Reload zones defined in configuration.yaml.

Calls service zone.reload over HTTP, which makes Home Assistant re-read YAML-defined zones without a full restart.

Use when: you edited zone YAML and want the change applied, or after zones_create_zone reports that YAML zones aren't supported. Returns: dict with status and the raw service-call result. Errors: on failure, returns {"error": "<message>"} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, but the description adds real value: it names the underlying service call and the 'no full restart' effect, plus explicit error behavior (returns {"error": ...} rather than raising). Slight redundancy with the output schema on the return value, but error handling is not 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?

Front-loaded purpose sentence, then labeled 'Use when', 'Returns', and 'Errors' blocks. Every sentence earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param reload action, the description covers purpose, mechanism, when-to-use, return shape, and error behavior. With an output schema present, return-value detail needn't be deeper; nothing an agent needs to invoke correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing to document; the no-arg design is implicitly consistent with the description's service-call framing. Baseline 4 applies for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Reload zones defined in configuration.yaml') and reveals the underlying mechanism ('zone.reload' over HTTP). Clearly distinguishable from siblings like zones_create_zone, zones_update_zone, and zones_list_zones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause gives both triggering scenarios: after editing zone YAML, or after zones_create_zone reports YAML zones aren't supported. This directly routes the agent to this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

zones_update_zoneUpdate zone helperA
Destructive

Update fields on an existing zone helper.

Calls WS zone/update; only the parameters you pass are sent, so omitted fields keep their current value. Only works for zones created via zones_create_zone (UI helpers) — zone.home and YAML-defined zones reject this WS command.

Use when: adjusting a UI-helper zone's coordinates, radius or name. Returns: dict with status, zone_id, and the raw WS result. Errors: on failure (e.g. a YAML zone or zone.home), returns {"error": "<message>", "hint": "...", "zone_id": ...} instead of raising.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoNew mdi icon identifier; omit to leave the current icon unchanged.
nameNoNew display name; omit to leave the current name unchanged.
radiusNoNew zone radius in meters; omit to leave the current radius unchanged.
passiveNoNew passive flag; omit to leave the current setting unchanged.
latitudeNoNew latitude in decimal degrees; omit to leave the current latitude unchanged.
entity_idYesZone entity_id to update, e.g. 'zone.office'; obtain it from zones_list_zones.
longitudeNoNew longitude in decimal degrees; omit to leave the current longitude unchanged.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, but the description goes well beyond them by disclosing PATCH semantics ('only the parameters you pass are sent, so omitted fields keep their current value'), the scope restriction on which zones accept the WS command, the return shape, and the non-raising error contract. This is substantive behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then behavior, then use-when, then returns, then errors — each block earns its place with no filler. Size is proportionate to a 7-param mutation tool with non-obvious scope constraints.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, scope limits, partial-update behavior, use conditions, return shape, and error contract. Although an output schema exists, the explicit error-shape disclosure (error/hint/zone_id instead of raising) is exactly the kind of exception an agent must handle and is included.

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 documents its 'omit to leave unchanged' behavior, so the schema carries the burden. The description's partial-update sentence reinforces this but adds little syntax or format detail beyond structured fields. 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?

Specific verb+resource ('Update fields on an existing zone helper') with immediate scope qualification naming what it does NOT apply to (zone.home, YAML zones). An agent can distinguish it from zones_create_zone, zones_delete_zone, and zones_reload_zones without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when: adjusting a UI-helper zone's coordinates, radius or name' plus an exclusion ('only works for zones created via zones_create_zone — zone.home and YAML-defined zones reject this WS command'). Both when-to-use and when-not-to-use are stated, with the sibling to route to for unsupported cases.

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. 254 tool updatesv0.25.1
    • Changedareas_control_area3 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Service to call on the domain: 'turn_on', 'turn_off' or 'toggle'."
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID to target; obtain it from areas_list_areas."
      • addedInput schema / properties / domain / description
        Added value: +"Entity domain to target within the area, e.g. 'light' or 'switch'; defaults to 'light'."
    • Changedareas_create_area1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new area, e.g. 'Kitchen'."
    • Changedareas_delete_area1 field changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID to delete; obtain it from areas_list_areas."
    • Changedareas_get_area_entities1 field changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID whose entities to return; obtain it from areas_list_areas."
    • Changedareas_get_area_states1 field changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID whose entity states to return; obtain it from areas_list_areas."
    • Changedautomations_activate_scene1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full scene entity ID to activate, e.g. 'scene.movie_night'."
    • Changedautomations_delete_automation2 fields changed
      • addedInput schema / properties / automation_id / description
        Added value: +"Automation config id to delete — the entity's `id` attribute, not its entity_id. A leading 'automation.' is stripped if present."
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to actually delete the automation. False (default) returns a safety prompt instead of deleting anything."
    • Changedautomations_delete_scene2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to actually delete the scene. False (default) returns a safety prompt instead of deleting anything."
      • addedInput schema / properties / scene_id / description
        Added value: +"Scene id to delete, bare (e.g. 'movie_night') or prefixed ('scene.movie_night')."
    • Changedautomations_delete_script2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to actually delete the script. False (default) returns a safety prompt instead of deleting anything."
      • addedInput schema / properties / script_id / description
        Added value: +"Script id to delete, bare (e.g. 'goodnight') or prefixed ('script.goodnight')."
    • Changedautomations_disable_automation1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full automation entity ID to disable, e.g. 'automation.morning_routine'."
    • Changedautomations_enable_automation1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full automation entity ID to enable, e.g. 'automation.morning_routine'."
    • Changedautomations_get_automation_config1 field changed
      • addedInput schema / properties / automation_id / description
        Added value: +"Automation config id — the entity's `id` attribute, e.g. '1733294456585' — not its entity_id. A leading 'automation.' is stripped, but the rest must still be the config id (read it from `entities_get_entity(entity_id)` -> attributes.id), which differs from the entity's object_id for UI-created automations."
    • Changedautomations_get_automation_trace2 fields changed
      • addedInput schema / properties / automation_id / description
        Added value: +"Automation config id the trace belongs to, bare or prefixed ('automation.<id>')."
      • addedInput schema / properties / run_id / description
        Added value: +"Run id from `automations_list_automation_traces`, identifying one specific run."
    • Changedautomations_get_last_automation_trace2 fields changed
      • addedInput schema / properties / automation_id / description
        Added value: +"Automation config id to fetch the latest trace for, bare or prefixed ('automation.<id>')."
      • addedInput schema / properties / failed_only / description
        Added value: +"If True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False."
    • Changedautomations_get_last_script_trace2 fields changed
      • addedInput schema / properties / failed_only / description
        Added value: +"If True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False."
      • addedInput schema / properties / script_id / description
        Added value: +"Script id to fetch the latest trace for, bare or prefixed ('script.<id>')."
    • Changedautomations_get_scene_config1 field changed
      • addedInput schema / properties / scene_id / description
        Added value: +"Scene id to look up, bare (e.g. 'movie_night') or prefixed ('scene.movie_night'); the 'scene.' prefix is stripped if present."
    • Changedautomations_get_script_config1 field changed
      • addedInput schema / properties / script_id / description
        Added value: +"Script id to look up, bare (e.g. 'goodnight') or prefixed ('script.goodnight'); the 'script.' prefix is stripped if present."
    • Changedautomations_get_script_trace2 fields changed
      • addedInput schema / properties / run_id / description
        Added value: +"Run id from `automations_list_script_traces`, identifying one specific run."
      • addedInput schema / properties / script_id / description
        Added value: +"Script id the trace belongs to, bare or prefixed ('script.<id>')."
    • Changedautomations_list_automation_traces1 field changed
      • addedInput schema / properties / automation_id / description
        Added value: +"Automation config id to list traces for, bare or prefixed ('automation.<id>')."
    • Changedautomations_list_script_traces1 field changed
      • addedInput schema / properties / script_id / description
        Added value: +"Script id to list traces for, bare or prefixed ('script.<id>')."
    • Changedautomations_remove_group2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to actually remove the group. False (default) returns a safety prompt instead of removing anything."
      • changedInput schema / properties / group_id / description
        Previous value: -"Bare group id or 'group.<id>'."New value: +"Bare group id or 'group.<id>' to remove."
    • Changedautomations_run_script2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full script entity ID to start, e.g. 'script.goodnight'."
      • addedInput schema / properties / variables / description
        Added value: +"Values passed as the script's input fields. Omit to run with no variables."
    • Changedautomations_set_automation_config2 fields changed
      • addedInput schema / properties / automation_id / description
        Added value: +"Automation config id to create or replace — the entity's `id` attribute, not its entity_id. An id that does not exist yet creates a NEW automation instead of editing one; read the current id from `entities_get_entity(entity_id)` -> attributes.id before editing."
      • addedInput schema / properties / config / description
        Added value: +"Full automation config replacing whatever is stored at `automation_id` (alias, triggers, conditions, actions, mode). Must contain 'alias' or 'trigger'/'triggers'."
    • Changedautomations_set_group6 fields changed
      • changedInput schema / properties / add_entities / description
        Previous value: -"Add these entity_ids to existing members."New value: +"Entity_ids to add to the existing member list. Do not combine with `entities`."
      • changedInput schema / properties / all_entities / description
        Previous value: -"If True, group state = ON only when ALL members are on."New value: +"If True, the group's state is 'on' only when every member is on. False (default) does not clear an existing all:true."
      • changedInput schema / properties / entities / description
        Previous value: -"Full list of entity_ids to include (replaces current members)."New value: +"Full list of entity_ids to set as the group's members, replacing the current member list. Omit to leave members unchanged (use add_entities/remove_entities instead)."
      • changedInput schema / properties / icon / description
        Previous value: -"MDI icon string (e.g. 'mdi:lightbulb-group')."New value: +"MDI icon string, e.g. 'mdi:lightbulb-group'. Omit to leave it unset/unchanged."
      • changedInput schema / properties / name / description
        Previous value: -"Friendly name (optional)."New value: +"Friendly name for the group. Omit to leave it unset/unchanged."
      • changedInput schema / properties / remove_entities / description
        Previous value: -"Remove these entity_ids from existing members."New value: +"Entity_ids to remove from the existing member list. Do not combine with `entities`."
    • Changedautomations_set_scene_config3 fields changed
      • addedInput schema / properties / entities / description
        Added value: +"Non-empty mapping of entity_id to its target state dict for this scene, e.g. {'light.living_room': {'state': 'on', 'brightness': 76}}. Brightness is 0-255 (30% ~ 76, 50% ~ 128, 100% = 255)."
      • addedInput schema / properties / name / description
        Added value: +"Friendly name shown for the scene in the UI."
      • addedInput schema / properties / scene_id / description
        Added value: +"Scene id to create or overwrite, bare (e.g. 'movie_night') or prefixed ('scene.movie_night')."
    • Changedautomations_set_script_config2 fields changed
      • addedInput schema / properties / config / description
        Added value: +"Full script config replacing whatever is stored at `script_id` (sequence, fields, alias, mode). Must contain at least 'alias' or 'sequence'."
      • addedInput schema / properties / script_id / description
        Added value: +"Script id to create or replace, bare (e.g. 'goodnight') or prefixed ('script.goodnight'). An id that does not exist yet creates a new script."
    • Changedautomations_trigger_automation1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full automation entity ID to run now, e.g. 'automation.morning_routine'."
    • Changedautomations_validate_automation_references1 field changed
      • addedInput schema / properties / yaml_content / description
        Added value: +"YAML text of a single automation dict or a list of automation dicts to check. Parsed with plain `yaml.safe_load`, so HA-only tags like '!input'/'!secret' are not resolved."
    • Changedautomations_validate_best_practices1 field changed
      • addedInput schema / properties / yaml_content / description
        Added value: +"YAML text of a single automation dict or a list of automation dicts to lint. Parsed with plain `yaml.safe_load`, so HA-only tags like '!input'/'!secret' are not resolved."
    • Changedblueprints_delete_blueprint2 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"Blueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'."
      • addedInput schema / properties / path / description
        Added value: +"Blueprint path relative to /config/blueprints/<domain>/ to delete, e.g. 'author/blueprint_name.yaml'."
    • Changedblueprints_import_blueprint2 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"Blueprint domain the fetched blueprint belongs to, 'automation' or 'script'. Defaults to 'automation'."
      • addedInput schema / properties / url / description
        Added value: +"HTTP(S) URL to fetch the blueprint YAML from, e.g. a GitHub raw file link or a community forum export link."
    • Changedblueprints_list_blueprints1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"Blueprint domain folder under /config/blueprints/ to list, 'automation' or 'script'. Defaults to 'automation'."
    • Addedblueprints_save_blueprint
    • Changedblueprints_substitute_blueprint3 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"Blueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'."
      • addedInput schema / properties / input / description
        Added value: +"Input values keyed by the input name declared in the blueprint's own `input:` section."
      • addedInput schema / properties / path / description
        Added value: +"Blueprint path relative to /config/blueprints/<domain>/ to render, e.g. 'author/blueprint_name.yaml'."
    • Changedcalendar_create_event6 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Optional longer event description/notes. Omit for none."
      • addedInput schema / properties / end / description
        Added value: +"Event end as an ISO 8601 datetime, e.g. '2026-04-28T11:00:00'."
      • addedInput schema / properties / entity_id / description
        Added value: +"Calendar entity ID to add the event to, e.g. 'calendar.family'."
      • addedInput schema / properties / location / description
        Added value: +"Optional event location text. Omit for none."
      • addedInput schema / properties / start / description
        Added value: +"Event start as an ISO 8601 datetime, e.g. '2026-04-28T10:00:00'."
      • addedInput schema / properties / summary / description
        Added value: +"Event title, e.g. 'Dentist appointment'."
    • Changedcalendar_delete_event4 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Calendar entity ID the event belongs to, e.g. 'calendar.family'."
      • addedInput schema / properties / recurrence_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Narrows deletion to one instance of a recurring event. Omit to target the whole event/series."
        +}
      • addedInput schema / properties / recurrence_range
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Extends `recurrence_id` deletion to a range, e.g. 'THISANDFUTURE'. Omit for a single-instance deletion."
        +}
      • addedInput schema / properties / uid / description
        Added value: +"Event UID to delete, as returned by `calendar_list_events`."
    • Changedcalendar_list_events3 fields changed
      • addedInput schema / properties / end / description
        Added value: +"Range end as an ISO 8601 datetime, e.g. '2026-05-05T00:00:00'."
      • addedInput schema / properties / entity_id / description
        Added value: +"Calendar entity ID, e.g. 'calendar.family', from `calendar_list_calendars`."
      • addedInput schema / properties / start / description
        Added value: +"Range start as an ISO 8601 datetime, e.g. '2026-04-28T00:00:00'."
    • Changedcard_builder_build_from_recipe1 field changed
      • addedInput schema / properties / recipe / description
        Added value: +"Recipe shorthand: {slots, root_slot|root_entity, blocks, root_styles, root_dz_styles, canvas_styles, action_slots, ...} — see card_builder_recipe_guide for the full shape."
    • Changedcard_builder_build_styles4 fields changed
      • addedInput schema / properties / container / description
        Added value: +"Responsive container to wrap the result under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'."
      • addedInput schema / properties / extra / description
        Added value: +"Extra ContainerStyleData ({category: {prop: {value, unit}}}) merged in last, overriding the snippets. Omit for none."
      • addedInput schema / properties / snippet_names / description
        Added value: +"Ordered list of snippet names from card_builder_list_style_snippets to merge, e.g. ['card_padded', 'vertical_stack']."
      • addedInput schema / properties / target / description
        Added value: +"Style target key to wrap the result under, e.g. 'block' or 'state'. Defaults to 'block'."
    • Changedcard_builder_create_card6 fields changed
      • addedInput schema / properties / author / description
        Added value: +"Author name to store on the card. Empty string if omitted."
      • addedInput schema / properties / categories / description
        Added value: +"Category labels (e.g. domain names) for the Card Builder UI. Omit for none."
      • addedInput schema / properties / config / description
        Added value: +"Full DocumentData v3 block tree (version/rootId/slots/blocks). Build it with `card_builder_build_from_recipe` rather than hand-writing it."
      • addedInput schema / properties / description / description
        Added value: +"Free-text card description. Empty string if omitted."
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new card, e.g. 'AC Salon'."
      • addedInput schema / properties / tags / description
        Added value: +"Freeform tags for filtering in the Card Builder UI. Omit for no tags."
    • Changedcard_builder_create_css_custom_property4 fields changed
      • addedInput schema / properties / inherits / description
        Added value: +"Whether the property inherits from parent elements, per the CSS @property spec. Defaults to false."
      • addedInput schema / properties / initial_value / description
        Added value: +"Initial value matching `syntax`, e.g. '#2196f3' for a <color>."
      • addedInput schema / properties / name / description
        Added value: +"CSS custom property name, e.g. '--card-accent-color' (with the leading '--')."
      • addedInput schema / properties / syntax / description
        Added value: +"CSS @property syntax descriptor, e.g. '<color>' or '<length>'."
    • Changedcard_builder_create_style_preset4 fields changed
      • addedInput schema / properties / data / description
        Added value: +"CSS-style configuration blob, shaped like a style category map (see card_builder_list_style_categories)."
      • addedInput schema / properties / description / description
        Added value: +"Free-text preset description. Empty string if omitted."
      • addedInput schema / properties / extends_preset_id / description
        Added value: +"Id of another style preset this one extends/inherits from. Omit for no inheritance."
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new preset, e.g. 'Dark Hero'."
    • Changedcard_builder_delete_card1 field changed
      • addedInput schema / properties / card_id / description
        Added value: +"Id of the card to delete, from card_builder_list_cards."
    • Changedcard_builder_delete_css_custom_property1 field changed
      • addedInput schema / properties / custom_property_id / description
        Added value: +"Id of the property to delete, from card_builder_list_css_custom_properties."
    • Changedcard_builder_delete_media1 field changed
      • addedInput schema / properties / path / description
        Added value: +"Path of the file to delete, relative to www/card_builder/ (see card_builder_list_media)."
    • Changedcard_builder_delete_style_preset1 field changed
      • addedInput schema / properties / style_preset_id / description
        Added value: +"Id of the preset to delete, from card_builder_list_style_presets."
    • Changedcard_builder_design_for_intent3 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"HA entity domain to weight the match toward, e.g. 'sensor'. Omit to infer from entity_id or match on keywords alone."
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity id, e.g. 'sensor.battery'; used to infer domain when domain is omitted."
      • addedInput schema / properties / intent / description
        Added value: +"Free-text description of what the card should do, e.g. 'show battery level'."
    • Changedcard_builder_get_block_schema1 field changed
      • addedInput schema / properties / block_type / description
        Added value: +"Block type id, e.g. 'block-slider', from card_builder_list_block_types."
    • Changedcard_builder_get_card1 field changed
      • addedInput schema / properties / card_id / description
        Added value: +"Card id or card_id from card_builder_list_cards, e.g. a UUID string."
    • Changedcard_builder_get_card_template2 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Template name, e.g. 'sensor_hero', from card_builder_list_card_templates."
      • addedInput schema / properties / slot / description
        Added value: +"Override the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default."
    • Changedcard_builder_get_design_pattern1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Pattern name, e.g. 'sensor_hero', from card_builder_list_design_patterns."
    • Changedcard_builder_get_style_snippet3 fields changed
      • addedInput schema / properties / container / description
        Added value: +"Responsive container to wrap the snippet under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'."
      • addedInput schema / properties / name / description
        Added value: +"Snippet name, e.g. 'card_padded', from card_builder_list_style_snippets."
      • addedInput schema / properties / target / description
        Added value: +"Style target key to wrap the snippet under, e.g. 'block' or 'state'. Defaults to 'block'."
    • Changedcard_builder_list_block_types2 fields changed
      • addedInput schema / properties / category / description
        Added value: +"Block category to filter to: basic, layout, entities, controls, advanced, or weather. Omit for every category."
      • addedInput schema / properties / include_internal / description
        Added value: +"If true, also list internal-only block types (e.g. block-drop-zone) that a recipe must not use directly."
    • Changedcard_builder_list_button_toggle_features1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"HA entity domain to filter to, e.g. 'climate' or 'cover'. Omit to list every domain's features."
    • Changedcard_builder_list_card_templates1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"HA entity domain to filter to, e.g. 'climate' or 'light'. Omit to list every template."
    • Changedcard_builder_list_design_patterns1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"HA entity domain to filter to, e.g. 'climate' or 'sensor'. Omit to list every pattern."
    • Changedcard_builder_list_media1 field changed
      • addedInput schema / properties / path / description
        Added value: +"Sub-folder relative to www/card_builder/ to list. Empty string lists the root."
    • Changedcard_builder_list_style_targets1 field changed
      • addedInput schema / properties / block_type / description
        Added value: +"Block type id, e.g. 'block-entity-field-state', from card_builder_list_block_types."
    • Changedcard_builder_make_template_card6 fields changed
      • addedInput schema / properties / categories / description
        Added value: +"Replacement category list. Omit to default to the template's first domain, or 'tile' if it has none."
      • addedInput schema / properties / description / description
        Added value: +"Card description. Empty string uses the template's own description instead."
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new card, e.g. 'Battery Salon'."
      • addedInput schema / properties / slot / description
        Added value: +"Override the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default."
      • addedInput schema / properties / tags / description
        Added value: +"Replacement tag list. Omit to default to ['nexus-template', template]."
      • addedInput schema / properties / template / description
        Added value: +"Template name, e.g. 'sensor_hero', from card_builder_list_card_templates."
    • Changedcard_builder_renderer_card_config3 fields changed
      • addedInput schema / properties / card_id / description
        Added value: +"Id of the Card Builder card to render, from card_builder_list_cards."
      • addedInput schema / properties / slot_actions / description
        Added value: +"Per-instance overrides for the card's action slots. Omit to use the card's own defaults."
      • addedInput schema / properties / slot_entities / description
        Added value: +"Maps each slot id defined in the card to a HA entity_id, e.g. {'climate': 'climate.salon'}. Omit for no slot bindings."
    • Changedcard_builder_update_card7 fields changed
      • addedInput schema / properties / card_id / description
        Added value: +"Id of the card to update, from card_builder_list_cards."
      • addedInput schema / properties / categories / description
        Added value: +"Replacement category list. Omit to leave categories unchanged."
      • addedInput schema / properties / config / description
        Added value: +"New DocumentData v3 block tree, replacing the whole config. Omit to keep the current config."
      • addedInput schema / properties / description / description
        Added value: +"New description text. Omit to leave it unchanged."
      • addedInput schema / properties / name / description
        Added value: +"New display name. Omit to leave the current name unchanged."
      • addedInput schema / properties / skip_version_bump / description
        Added value: +"If true, do not bump the card's stored version counter for this change."
      • addedInput schema / properties / tags / description
        Added value: +"Replacement tag list. Omit to leave tags unchanged."
    • Changedcard_builder_update_style_preset5 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Replacement CSS-style configuration blob. Omit to leave the current data unchanged."
      • addedInput schema / properties / description / description
        Added value: +"New description text. Omit to leave it unchanged."
      • addedInput schema / properties / extends_preset_id / description
        Added value: +"Replacement parent preset id to inherit from. Omit to leave inheritance unchanged."
      • addedInput schema / properties / name / description
        Added value: +"New display name. Omit to leave the current name unchanged."
      • addedInput schema / properties / style_preset_id / description
        Added value: +"Id of the preset to update, from card_builder_list_style_presets."
    • Changedcard_builder_upload_image_from_url3 fields changed
      • addedInput schema / properties / filename / description
        Added value: +"Target filename to store as. Omit to derive one from the URL's last path segment."
      • addedInput schema / properties / path / description
        Added value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root."
      • addedInput schema / properties / url / description
        Added value: +"http(s) URL of the image to download, e.g. 'https://example.com/bg.png'."
    • Changedcard_builder_upload_media3 fields changed
      • addedInput schema / properties / content_base64 / description
        Added value: +"Raw file bytes, base64-encoded."
      • addedInput schema / properties / filename / description
        Added value: +"Bare target filename with an allowed image/SVG extension, e.g. 'bg-1.png'. No path separators."
      • addedInput schema / properties / path / description
        Added value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root."
    • Changedcard_builder_upload_media_from_path3 fields changed
      • addedInput schema / properties / filename / description
        Added value: +"Target filename to store as. Omit to reuse local_path's own filename."
      • addedInput schema / properties / local_path / description
        Added value: +"Absolute or relative path to the source file; must resolve under <config>/www or <config>/media."
      • addedInput schema / properties / path / description
        Added value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root."
    • Changedcard_builder_upload_svg3 fields changed
      • addedInput schema / properties / filename / description
        Added value: +"Bare target filename, e.g. 'gradient-bg'. '.svg' is appended if missing."
      • addedInput schema / properties / path / description
        Added value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root."
      • addedInput schema / properties / svg_content / description
        Added value: +"Raw SVG markup, starting with '<svg' or '<?xml ...'."
    • Changedcard_builder_validate_config1 field changed
      • addedInput schema / properties / config / description
        Added value: +"DocumentData config to check, as produced by card_builder_build_from_recipe or returned by card_builder_get_card."
    • Addeddashboards_add_card_to_section
    • Changeddashboards_add_card_to_view3 fields changed
      • addedInput schema / properties / card_config / description
        Added value: +"Lovelace card config, e.g. {'type': 'entities', 'entities': ['light.living_room']}."
      • addedInput schema / properties / url_path / description
        Added value: +"Dashboard url_path (not a view path), from dashboards_list_dashboards."
      • addedInput schema / properties / view_index / description
        Added value: +"Zero-based index of the target view within the dashboard's 'views' list."
    • Changeddashboards_add_dashboard_resource1 field changed
      • changedInput schema / properties / resource_type / description
        Previous value: -"'module' (default, ES module JS), 'js' (legacy script), or 'css'."New value: +"Resource kind: 'module' (ES module JS), 'js' (legacy script), or 'css'. Defaults to 'module'."
    • Addeddashboards_add_section_to_view
    • Changeddashboards_add_view_to_dashboard2 fields changed
      • addedInput schema / properties / url_path / description
        Added value: +"Dashboard url_path to add the view to, from dashboards_list_dashboards."
      • addedInput schema / properties / view_config / description
        Added value: +"Lovelace view config, e.g. {'title': 'Bedroom', 'icon': 'mdi:bed', 'cards': []}."
    • Changeddashboards_get_dashboard_config1 field changed
      • addedInput schema / properties / url_path / description
        Added value: +"Dashboard url_path (e.g. 'map', from dashboards_list_dashboards) or a view path inside the default dashboard (e.g. 'living-room', from /lovelace/living-room). Omit for the full default dashboard."
    • Addeddashboards_get_view_sections
    • Addeddashboards_remove_card_from_section
    • Changeddashboards_remove_dashboard_resource2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be true to actually remove the resource; false (the default) returns a confirmation prompt instead."
      • addedInput schema / properties / resource_id / description
        Added value: +"Numeric resource id, from dashboards_get_dashboard_resources."
    • Changeddashboards_save_dashboard_config2 fields changed
      • addedInput schema / properties / config / description
        Added value: +"Full dashboard object with a 'views' list, as returned by dashboards_get_dashboard_config for a dashboard path — never the {view, source, path} excerpt it returns for a view path."
      • addedInput schema / properties / url_path / description
        Added value: +"Dashboard url_path to save, from dashboards_list_dashboards. Omit for the default dashboard."
    • Changeddashboards_screenshot6 fields changed
      • changedInput schema / properties / full_page / description
        Previous value: -"Capture full scrollable page instead of just the viewport."New value: +"If true, use a fixed 4096px-tall viewport instead of height, approximating a full-scroll capture. Defaults to false."
      • changedInput schema / properties / height / description
        Previous value: -"Viewport height in pixels (default 800)."New value: +"Viewport height in pixels. Ignored when full_page=True. Defaults to 800."
      • changedInput schema / properties / url_path / description
        Previous value: -"Lovelace path, e.g. 'caly-dom' or 'lovelace/0'. Omit for default."New value: +"Frontend route to capture. A registered dashboard's own url_path (e.g. 'dashboard-porch', optionally with a view path appended: 'dashboard-porch/porch-tests') is used as-is. A path already starting with 'lovelace' (e.g. 'lovelace/0') is also used as-is. Anything else is treated as a view of the default dashboard and gets 'lovelace/' prepended (e.g. 'living-room' -> 'lovelace/living-room'). Omit for the default dashboard's root."
      • changedInput schema / properties / wait_ms / description
        Previous value: -"Settle time in ms after load — increase for heavy chart cards (default 2500)."New value: +"Settle time in milliseconds after page load before capturing — increase for heavy chart cards. Defaults to 2500."
      • changedInput schema / properties / width / description
        Previous value: -"Viewport width in pixels (default 1280)."New value: +"Viewport width in pixels. Defaults to 1280."
      • changedInput schema / properties / zoom / description
        Previous value: -"Zoom factor (default 1.0)."New value: +"Browser zoom factor applied by the engine. Defaults to 1.0 (no zoom)."
    • Addeddashboards_update_card_in_section
    • Changeddashboards_update_dashboard_resource3 fields changed
      • changedInput schema / properties / resource_id / description
        Previous value: -"Numeric ID of the resource to update."New value: +"Numeric resource id to update, from dashboards_get_dashboard_resources."
      • changedInput schema / properties / resource_type / description
        Previous value: -"'module', 'js', or 'css'."New value: +"Resource kind: 'module' (ES module JS), 'js' (legacy script), or 'css'. Defaults to 'module'."
      • changedInput schema / properties / url / description
        Previous value: -"New resource URL."New value: +"New resource URL, replacing the current one."
    • Changeddevices_list_devices_in_area1 field changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID to filter by; obtain it from areas_list_areas."
    • Changeddevices_remove_device2 fields changed
      • addedInput schema / properties / config_entry_id / description
        Added value: +"Config entry ID the device is attached to; the device is detached only from this entry."
      • addedInput schema / properties / device_id / description
        Added value: +"Device registry ID to remove; obtain it from devices_list_devices."
    • Changeddevices_update_device4 fields changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID to assign the device to, from areas_list_areas; omit to leave the current area unchanged."
      • addedInput schema / properties / device_id / description
        Added value: +"Device registry ID to update; obtain it from devices_list_devices."
      • addedInput schema / properties / disabled_by / description
        Added value: +"'user' disables the device and its entities, '' (empty string) re-enables it; omit to leave the disabled state unchanged."
      • addedInput schema / properties / name_by_user / description
        Added value: +"New user-facing name override for the device; omit to leave the current name unchanged."
    • Changeddiscover_get_tool_doc1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Full tool name including namespace, e.g. 'entities_get_entity', from `discover_tool_search`."
    • Changeddiscover_tool_search3 fields changed
      • addedInput schema / properties / namespace / description
        Added value: +"Restrict results to one namespace, e.g. 'card_builder'. Omit to search every namespace."
      • addedInput schema / properties / query / description
        Added value: +"Free-text search query, e.g. 'turn on light' or 'backup'."
      • addedInput schema / properties / top_k / description
        Added value: +"Maximum number of ranked hits to return, e.g. 10."
    • Changedenergy_add_battery_source2 fields changed
      • addedInput schema / properties / stat_energy_from / description
        Added value: +"Statistic/entity ID of the battery discharge (energy out) sensor to add, e.g. 'sensor.battery_discharge'."
      • addedInput schema / properties / stat_energy_to / description
        Added value: +"Statistic/entity ID of the battery charge (energy in) sensor to add, e.g. 'sensor.battery_charge'."
    • Changedenergy_add_grid_consumption2 fields changed
      • addedInput schema / properties / stat_cost / description
        Added value: +"Optional statistic/entity ID of the matching cost sensor for this flow, e.g. 'sensor.grid_cost'. Omit if no cost sensor should be linked to this flow."
      • addedInput schema / properties / stat_energy_from / description
        Added value: +"Statistic/entity ID of the grid-import energy sensor to add, e.g. 'sensor.grid_energy_import'. Discover candidates with `statistics_list_statistic_ids`."
    • Changedenergy_add_grid_return2 fields changed
      • addedInput schema / properties / stat_compensation / description
        Added value: +"Optional statistic/entity ID of the matching compensation/cost sensor for this export flow. Omit if no compensation sensor should be linked."
      • addedInput schema / properties / stat_energy_to / description
        Added value: +"Statistic/entity ID of the grid-export energy sensor to add, e.g. 'sensor.solar_export'. Discover candidates with `statistics_list_statistic_ids`."
    • Changedenergy_add_solar_source2 fields changed
      • addedInput schema / properties / config_entry_solar_forecast / description
        Added value: +"Optional config entry ID of a solar forecast integration (e.g. Forecast.Solar) to link to this source. Omit if no forecast should be linked."
      • addedInput schema / properties / stat_energy_from / description
        Added value: +"Statistic/entity ID of the solar production sensor to add, e.g. 'sensor.solar_production'. Discover candidates with `statistics_list_statistic_ids`."
    • Changedenergy_remove_energy_source1 field changed
      • addedInput schema / properties / stat_energy_from / description
        Added value: +"Statistic/entity ID identifying the source to remove, as originally passed to one of the `energy_add_*` tools, e.g. 'sensor.solar_production'."
    • Changedenergy_save_energy_prefs4 fields changed
      • addedInput schema / properties / currency / description
        Added value: +"Deprecated and not part of this WS schema; passing anything other than None now returns an error instead of being silently ignored. Omit this parameter."
      • addedInput schema / properties / device_consumption / description
        Added value: +"Full replacement for the Energy Dashboard's device_consumption list, one dict per tracked device. Omit to leave the currently saved device list untouched."
      • addedInput schema / properties / energy_per_unit / description
        Added value: +"Deprecated and not part of this WS schema; passing anything other than None now returns an error instead of being silently ignored. Omit this parameter."
      • addedInput schema / properties / energy_sources / description
        Added value: +"Full replacement for the Energy Dashboard's energy_sources list; each dict is one grid/solar/battery/gas/water source. Omit to leave the currently saved sources untouched."
    • Changedentities_assign_entity_to_area2 fields changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID to assign the entity to, replacing any current area."
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to reassign, e.g. 'light.kitchen'."
    • Changedentities_bulk_control2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Service to call per domain group: 'turn_on', 'turn_off' or 'toggle'."
      • addedInput schema / properties / entity_ids / description
        Added value: +"Full entity IDs to act on, e.g. ['light.a', 'light.b']."
    • Changedentities_bulk_set_entity_exposure3 fields changed
      • addedInput schema / properties / assistants / description
        Added value: +"Subset of voice assistants to target. Omit to apply to conversation, cloud.alexa and cloud.google_assistant."
      • addedInput schema / properties / entity_ids / description
        Added value: +"Full entity IDs to expose or hide, e.g. ['light.a', 'light.b']."
      • addedInput schema / properties / should_expose / description
        Added value: +"True to expose the entities to the target assistants, false to hide them."
    • Changedentities_bulk_set_state1 field changed
      • addedInput schema / properties / updates / description
        Added value: +"List of {entity_id, state, attributes?} dicts describing the virtual state to write per entity."
    • Changedentities_disable_entity1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to disable, e.g. 'sensor.old_device'."
    • Changedentities_enable_entity1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to re-enable, e.g. 'sensor.old_device'."
    • Changedentities_get_entity1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to read, e.g. 'light.kitchen'."
    • Changedentities_get_entity_exposure1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to query exposure for, e.g. 'light.kitchen'."
    • Changedentities_list_entities4 fields changed
      • changedInput schema / properties / domain / description
        Previous value: -"Filter by domain prefix (e.g. 'light', 'sensor')."New value: +"Entity domain prefix filter, e.g. 'light' or 'sensor'. Omit to include every domain."
      • changedInput schema / properties / fields / description
        Previous value: -"Keys to return per entity. Defaults to [entity_id, state, friendly_name].\n    Also accepts: attributes, area_id, device_id, labels."New value: +"Per-entity keys to return. Defaults to entity_id, state, friendly_name. Also accepts attributes, area_id, device_id, labels."
      • changedInput schema / properties / limit / description
        Previous value: -"Max number of results. Omit for all."New value: +"Maximum number of entities to return after filtering, for pagination. Omit for no limit."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip first N results (pagination)."New value: +"Number of filtered entities to skip before applying limit. 0 starts from the first match."
    • Changedentities_list_entity_registry1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"Entity domain prefix filter, e.g. 'light' or 'sensor'. Omit to include every domain."
    • Changedentities_list_exposed_entities1 field changed
      • addedInput schema / properties / assistant / description
        Added value: +"Voice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'."
    • Changedentities_select_option2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to set, e.g. 'input_select.house_mode'."
      • addedInput schema / properties / option / description
        Added value: +"Option string to select; must match one of the entity's configured options."
    • Changedentities_set_entity_exposure3 fields changed
      • addedInput schema / properties / assistant / description
        Added value: +"Voice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'."
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to expose or hide, e.g. 'light.kitchen'."
      • addedInput schema / properties / should_expose / description
        Added value: +"True to expose the entity to the assistant, false to hide it."
    • Changedentities_set_value2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to set, e.g. 'input_number.target_temp'."
      • addedInput schema / properties / value / description
        Added value: +"Numeric value to write; interpreted per domain, see Behaviour."
    • Changedentities_toggle1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to toggle, e.g. 'switch.fan'."
    • Changedentities_turn_off1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to turn off, e.g. 'light.kitchen'."
    • Changedentities_turn_on8 fields changed
      • addedInput schema / properties / brightness / description
        Added value: +"Light brightness, 0-255. Light-only; passing it for a non-light entity returns an error."
      • addedInput schema / properties / color_temp / description
        Added value: +"Deprecated mired color temperature, light-only. Converted to Kelvin before the call; prefer color_temp_kelvin."
      • addedInput schema / properties / color_temp_kelvin
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Light color temperature in Kelvin, light-only option."
        +}
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to turn on, e.g. 'light.kitchen'."
      • addedInput schema / properties / rgb_color / description
        Added value: +"Light RGB color as [r, g, b], each 0-255, light-only option."
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedentities_update_entity_name2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID whose registry entry is renamed, e.g. 'light.kitchen'."
      • addedInput schema / properties / name / description
        Added value: +"New display name to store in the entity registry, replacing the current one."
    • Changedesphome_clean_mqtt3 fields changed
      • addedInput schema / properties / log_lines
        Added value: +{
        +  "default": 200,
        +  "description": "Unused by this tool's HA-mqtt-integration implementation (kept only for API/parameter-surface compatibility with earlier versions that spawned a dashboard process and returned trailing log lines), e.g. 200.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'."
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 60,
        +  "description": "Maximum seconds to spend collecting retained MQTT discovery topics via a wildcard subscribe, e.g. 60. Only used when no matching HA device is found for this config's node name.",
        +  "type": "number"
        +}
    • Changedesphome_compile_device4 fields changed
      • addedInput schema / properties / log_lines
        Added value: +{
        +  "default": 200,
        +  "description": "Number of trailing build-log lines to return, e.g. 200.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'."
      • addedInput schema / properties / only_generate
        Added value: +{
        +  "default": false,
        +  "description": "If true, only generate the C++ source and skip the platform build. Set false for a full firmware build.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 180,
        +  "description": "Maximum seconds to wait for the compile process to finish, e.g. 180.",
        +  "type": "number"
        +}
    • Changedesphome_get_addon_logs1 field changed
      • addedInput schema / properties / lines / description
        Added value: +"Number of trailing log lines to return, e.g. 150."
    • Changedesphome_get_config1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. Discover names with `esphome_list_devices`."
    • Changedesphome_get_device_entities1 field changed
      • addedInput schema / properties / device_name / description
        Added value: +"Device name as used in HA, e.g. 'Kitchen Sensor' or 'kitchen_sensor' (matched case-insensitively against a slugified form)."
    • Changedesphome_lvgl_add_widget4 fields changed
      • addedInput schema / properties / device_name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
      • addedInput schema / properties / page_id / description
        Added value: +"LVGL page ID to add the widget to, from `esphome_lvgl_get_pages`."
      • addedInput schema / properties / properties / description
        Added value: +"Widget properties, e.g. {'id': ..., 'x': ..., 'y': ..., 'width': ..., 'height': ..., 'text': ..., 'value': ..., 'styles': ...}."
      • addedInput schema / properties / widget_type / description
        Added value: +"LVGL widget type, e.g. 'label', 'button', 'slider', 'arc', 'switch', 'spinbox', 'img', 'line', 'meter'."
    • Changedesphome_lvgl_delete_widget3 fields changed
      • addedInput schema / properties / device_name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
      • addedInput schema / properties / page_id / description
        Added value: +"LVGL page ID the widget belongs to, from `esphome_lvgl_get_pages`."
      • addedInput schema / properties / widget_id / description
        Added value: +"Widget `id` to delete, from `esphome_lvgl_get_page_widgets`."
    • Changedesphome_lvgl_get_page_widgets2 fields changed
      • addedInput schema / properties / device_name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
      • addedInput schema / properties / page_id / description
        Added value: +"LVGL page ID to inspect, from `esphome_lvgl_get_pages`."
    • Changedesphome_lvgl_get_pages1 field changed
      • addedInput schema / properties / device_name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
    • Changedesphome_lvgl_get_styles1 field changed
      • addedInput schema / properties / device_name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
    • Changedesphome_lvgl_validate1 field changed
      • addedInput schema / properties / device_name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
    • Changedesphome_upload_device5 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Set true to actually flash the device. False (default) performs no action and instead returns a confirmation prompt; `name` is not resolved or touched in that case.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / log_lines
        Added value: +{
        +  "default": 200,
        +  "description": "Number of trailing upload-log lines to return, e.g. 200.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'."
      • addedInput schema / properties / port
        Added value: +{
        +  "default": "OTA",
        +  "description": "'OTA' for wireless flash (default) or a serial device path, e.g. '/dev/ttyUSB0', for a wired flash.",
        +  "type": "string"
        +}
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 240,
        +  "description": "Maximum seconds to wait for the upload to finish, e.g. 240.",
        +  "type": "number"
        +}
    • Changedesphome_validate_config3 fields changed
      • addedInput schema / properties / log_lines
        Added value: +{
        +  "default": 200,
        +  "description": "Number of trailing log lines to return, e.g. 200.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'."
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 60,
        +  "description": "Maximum seconds to wait for the validation result, e.g. 60.",
        +  "type": "number"
        +}
    • Changedesphome_write_config2 fields changed
      • addedInput schema / properties / content / description
        Added value: +"Full YAML document to write, replacing the file's current content."
      • addedInput schema / properties / name / description
        Added value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. If the file already exists, its entire content is replaced."
    • Changedfiles_append_to_config_file3 fields changed
      • addedInput schema / properties / content / description
        Added value: +"Text appended after a newline to the file's existing content."
      • addedInput schema / properties / relative_path / description
        Added value: +"Path to an existing file relative to the HA config directory (HA_CONFIG_PATH), e.g. 'automations.yaml'. Must use an allowed extension (.yaml/.yml/.json/.txt) and not touch secrets.yaml or .storage/."
      • addedInput schema / properties / validate_yaml / description
        Added value: +"If True and the extension is .yaml/.yml, the combined text (existing content plus the appended `content`) is YAML-checked before writing. Defaults to False, so an invalid append is written without warning unless set True."
    • Changedfiles_delete_config_file2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Set true to actually delete the file. False (default) performs no action and instead returns a confirmation prompt; `relative_path` is not resolved or touched in that case.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / relative_path / description
        Added value: +"Path to the file relative to the HA config directory (HA_CONFIG_PATH) to delete, e.g. 'packages/old.yaml'. Must use an allowed extension (.yaml/.yml/.json/.txt) and not touch secrets.yaml or .storage/."
    • Changedfiles_list_config_files1 field changed
      • addedInput schema / properties / subdirectory / description
        Added value: +"Subdirectory relative to the HA config root to list, e.g. 'packages'. Omit (default '') to list from the config root."
    • Changedfiles_read_config_file1 field changed
      • addedInput schema / properties / relative_path / description
        Added value: +"Path to the file relative to the HA config directory (HA_CONFIG_PATH), e.g. 'automations.yaml' or 'packages/lights.yaml'. Must resolve inside that directory, use an allowed extension (.yaml/.yml/.json/.txt), and not touch secrets.yaml or .storage/."
    • Changedfiles_validate_yaml_content1 field changed
      • addedInput schema / properties / content / description
        Added value: +"YAML text to check for syntax errors; nothing is written or read from disk."
    • Changedfiles_write_config_file3 fields changed
      • addedInput schema / properties / content / description
        Added value: +"Full text to write as the file's new content, replacing whatever was there before."
      • addedInput schema / properties / relative_path / description
        Added value: +"Path to the file relative to the HA config directory (HA_CONFIG_PATH), e.g. 'automations.yaml' or 'packages/lights.yaml'. Parent directories are created if missing. Must use an allowed extension (.yaml/.yml/.json/.txt) and not touch secrets.yaml or .storage/."
      • addedInput schema / properties / validate_yaml / description
        Added value: +"If True (default) and the extension is .yaml/.yml, `content` is parsed with a HA-tolerant YAML loader before writing; a parse error aborts the write. Set False to skip that check for non-YAML or intentionally unusual content."
    • Changedgit_git_checkout_branch1 field changed
      • addedInput schema / properties / branch_name / description
        Added value: +"Name of an existing git branch to switch the config repository to."
    • Changedgit_git_commit_all1 field changed
      • addedInput schema / properties / message / description
        Added value: +"Commit message describing this checkpoint or change."
    • Changedgit_git_create_branch1 field changed
      • addedInput schema / properties / branch_name / description
        Added value: +"Name of the new git branch to create, e.g. 'automation-refactor'."
    • Changedgit_git_diff1 field changed
      • addedInput schema / properties / sha / description
        Added value: +"Commit SHA or ref to show a stat summary for, e.g. 'a1b2c3d'. Omit to show the unstaged diff instead."
    • Changedgit_git_log1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of commits to return, most recent first. Defaults to 20."
    • Changedgit_git_rollback_file3 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to actually restore the file. False (default) returns a safety prompt describing what would happen instead of touching anything."
      • addedInput schema / properties / relative_path / description
        Added value: +"Path to the file relative to the HA config directory to restore, e.g. 'automations.yaml'. Must resolve inside /config after following symlinks."
      • addedInput schema / properties / sha / description
        Added value: +"Commit SHA or ref to restore the file from. Defaults to 'HEAD', which discards uncommitted changes to this file."
    • Changedgit_git_rollback_to_commit2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to actually perform the reset. False (default) returns a safety prompt naming the current HEAD instead of touching anything."
      • addedInput schema / properties / sha / description
        Added value: +"Commit SHA or ref to hard-reset the entire config directory to."
    • Changedgit_safe_write_with_checkpoint3 fields changed
      • addedInput schema / properties / commit_message / description
        Added value: +"Commit message for the new-content commit. Omit to use a default 'chore: update <relative_path>' message."
      • addedInput schema / properties / content / description
        Added value: +"Full text to write as the file's new content, replacing whatever was there before."
      • addedInput schema / properties / relative_path / description
        Added value: +"Path to the file relative to the HA config directory to write, e.g. 'automations.yaml'. Same extension and location limits as `files_write_config_file`."
    • Changedhacs_add_custom_repository2 fields changed
      • addedInput schema / properties / category / description
        Added value: +"HACS category for the repository: integration, plugin, theme, template, appdaemon or python_script."
      • addedInput schema / properties / url / description
        Added value: +"Full URL of the repository to register with HACS, e.g. a GitHub repo URL."
    • Changedhacs_get_hacs_repository1 field changed
      • addedInput schema / properties / repo_id / description
        Added value: +"HACS repository id, e.g. from `hacs_list_hacs_repositories`."
    • Changedhacs_install_hacs_repository2 fields changed
      • addedInput schema / properties / repo_id / description
        Added value: +"HACS repository id to install, e.g. from `hacs_list_hacs_repositories`."
      • addedInput schema / properties / version / description
        Added value: +"Specific version/tag to pin. Omit to install the latest available version."
    • Changedhacs_list_hacs_repositories1 field changed
      • addedInput schema / properties / category / description
        Added value: +"Filter to one HACS category: integration, plugin, theme, template, appdaemon or python_script. Omit to list every category."
    • Changedhacs_uninstall_hacs_repository1 field changed
      • addedInput schema / properties / repo_id / description
        Added value: +"HACS repository id to uninstall, e.g. from `hacs_list_hacs_repositories`."
    • Changedhacs_update_hacs_repository1 field changed
      • addedInput schema / properties / repo_id / description
        Added value: +"HACS repository id to update, e.g. from `hacs_list_hacs_repositories`."
    • Changedhelpers_cancel_timer1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full timer entity ID to cancel, e.g. 'timer.laundry'."
    • Changedhelpers_increment_counter1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full counter entity ID to increment, e.g. 'counter.visits'."
    • Changedhelpers_reload_helpers4 fields changed
      • addedOutput schema / additionalProperties
        Added value: +true
      • removedOutput schema / properties
        Removed value: -{
        -  "result": {
        -    "items": {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    "type": "array"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "result"
        -]
      • removedOutput schema / x-fastmcp-wrap-result
        Removed value: -true
    • Changedhelpers_reset_counter1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full counter entity ID to reset, e.g. 'counter.visits'."
    • Changedhelpers_set_input_boolean2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full input_boolean entity ID to set, e.g. 'input_boolean.guest_mode'."
      • addedInput schema / properties / value / description
        Added value: +"Target boolean value; true calls turn_on, false calls turn_off."
    • Changedhelpers_set_input_datetime4 fields changed
      • addedInput schema / properties / date / description
        Added value: +"Date to set, formatted YYYY-MM-DD. Omit to leave the date unchanged."
      • addedInput schema / properties / datetime / description
        Added value: +"Combined date and time, formatted 'YYYY-MM-DD HH:MM:SS'. Takes precedence over date/time when given."
      • addedInput schema / properties / entity_id / description
        Added value: +"Full input_datetime entity ID to set, e.g. 'input_datetime.reminder'."
      • addedInput schema / properties / time / description
        Added value: +"Time to set, formatted HH:MM:SS. Omit to leave the time unchanged."
    • Changedhelpers_set_input_number2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full input_number entity ID to set, e.g. 'input_number.target_temp'."
      • addedInput schema / properties / value / description
        Added value: +"Target numeric value to write to the input_number."
    • Changedhelpers_set_input_select2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full input_select entity ID to set, e.g. 'input_select.house_mode'."
      • addedInput schema / properties / option / description
        Added value: +"Option string to select; must match one of the input_select's configured options."
    • Changedhelpers_set_input_text2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full input_text entity ID to set, e.g. 'input_text.last_visitor'."
      • addedInput schema / properties / value / description
        Added value: +"Target text value to write to the input_text."
    • Changedhelpers_start_timer2 fields changed
      • addedInput schema / properties / duration / description
        Added value: +"Duration to run for, formatted HH:MM:SS or a plain number of seconds. Omit to reuse the timer's configured duration."
      • addedInput schema / properties / entity_id / description
        Added value: +"Full timer entity ID to start, e.g. 'timer.laundry'."
    • Changedhistory_get_logbook2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to filter to, e.g. 'light.kitchen'. Omit to return logbook entries for every entity."
      • addedInput schema / properties / hours / description
        Added value: +"How many hours back from now to fetch, e.g. 24 for one day. Default 24."
    • Changedhistory_get_state_history2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to fetch history for, e.g. 'light.kitchen'."
      • addedInput schema / properties / hours / description
        Added value: +"How many hours back from now to fetch, e.g. 24 for one day. Default 24."
    • Changedintegrations_abort_config_flow1 field changed
      • addedInput schema / properties / flow_id / description
        Added value: +"Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`."
    • Changedintegrations_abort_options_flow1 field changed
      • addedInput schema / properties / flow_id / description
        Added value: +"Flow id from `integrations_start_options_flow`."
    • Changedintegrations_disable_integration1 field changed
      • addedInput schema / properties / entry_id / description
        Added value: +"Config entry ID to disable, from `system_list_integrations` or `system_get_all_integrations`."
    • Changedintegrations_enable_integration1 field changed
      • addedInput schema / properties / entry_id / description
        Added value: +"Config entry ID to re-enable, from `system_list_integrations` or `system_get_all_integrations`."
    • Changedintegrations_get_config_flow1 field changed
      • addedInput schema / properties / flow_id / description
        Added value: +"Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`."
    • Changedintegrations_remove_integration2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Set true to actually remove the integration. False (default) performs no action and instead returns a confirmation prompt."
      • addedInput schema / properties / entry_id / description
        Added value: +"Config entry ID to remove, from `system_list_integrations` or `system_get_all_integrations`."
    • Changedintegrations_start_config_flow2 fields changed
      • addedInput schema / properties / handler / description
        Added value: +"Integration domain to configure, e.g. 'shelly'; from `integrations_list_flow_handlers`."
      • addedInput schema / properties / show_advanced_options / description
        Added value: +"Whether to include the integration's advanced-options fields in the returned form. False (default) hides them."
    • Changedintegrations_start_options_flow2 fields changed
      • addedInput schema / properties / entry_id / description
        Added value: +"Config entry ID to edit, from `system_list_integrations` or `system_get_all_integrations`."
      • addedInput schema / properties / show_advanced_options / description
        Added value: +"Whether to include the integration's advanced-options fields in the returned form. False (default) hides them."
    • Changedintegrations_submit_config_flow_step2 fields changed
      • addedInput schema / properties / flow_id / description
        Added value: +"Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`."
      • addedInput schema / properties / user_input / description
        Added value: +"Answers for the current step, matching the fields in the flow's `data_schema` (e.g. host, API key, chosen device)."
    • Changedintegrations_submit_options_flow_step2 fields changed
      • addedInput schema / properties / flow_id / description
        Added value: +"Flow id from `integrations_start_options_flow`."
      • addedInput schema / properties / user_input / description
        Added value: +"Answers for the current step, matching the fields in the flow's `data_schema`."
    • Changedintegrations_update_integration_entry4 fields changed
      • addedInput schema / properties / entry_id / description
        Added value: +"Config entry ID to update, from `system_list_integrations` or `system_get_all_integrations`."
      • addedInput schema / properties / pref_disable_new_entities / description
        Added value: +"Whether newly discovered entities from this integration should start disabled. Omit to leave the current preference unchanged."
      • addedInput schema / properties / pref_disable_polling / description
        Added value: +"Whether HA should skip polling for this integration's entities. Omit to leave the current preference unchanged."
      • addedInput schema / properties / title / description
        Added value: +"New display title for the entry. Omit to leave the current title unchanged."
    • Changedlabels_assign_label_to_device2 fields changed
      • addedInput schema / properties / device_id / description
        Added value: +"Device registry ID to tag; obtain it from devices_list_devices."
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to assign; obtain it from labels_list_labels."
    • Changedlabels_assign_label_to_entity2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Entity ID to tag, e.g. 'light.kitchen'."
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to assign; obtain it from labels_list_labels."
    • Changedlabels_create_category3 fields changed
      • addedInput schema / properties / icon / description
        Added value: +"Optional mdi icon identifier, e.g. 'mdi:tag'; omit for no icon."
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new category."
      • addedInput schema / properties / scope / description
        Added value: +"Registry scope the new category belongs to, e.g. 'automation'."
    • Changedlabels_create_label4 fields changed
      • addedInput schema / properties / color / description
        Added value: +"Optional label color name recognised by the frontend, e.g. 'red'; omit for no color."
      • addedInput schema / properties / description / description
        Added value: +"Optional free-text description of the label's purpose; omit for none."
      • addedInput schema / properties / icon / description
        Added value: +"Optional mdi icon identifier, e.g. 'mdi:alert'; omit for no icon."
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new label, e.g. 'Battery Low'."
    • Changedlabels_delete_category2 fields changed
      • addedInput schema / properties / category_id / description
        Added value: +"Category registry ID to delete; obtain it from labels_list_categories."
      • addedInput schema / properties / scope / description
        Added value: +"Registry scope the category belongs to, e.g. 'automation'."
    • Changedlabels_delete_label1 field changed
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to delete; obtain it from labels_list_labels."
    • Changedlabels_list_categories1 field changed
      • addedInput schema / properties / scope / description
        Added value: +"Registry scope the categories belong to, e.g. 'automation'; defaults to 'automation'."
    • Changedlabels_list_devices_with_label1 field changed
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to filter by; obtain it from labels_list_labels."
    • Changedlabels_list_entities_with_label1 field changed
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to filter by; obtain it from labels_list_labels."
    • Changedlabels_remove_label_from_device2 fields changed
      • addedInput schema / properties / device_id / description
        Added value: +"Device registry ID to untag; obtain it from devices_list_devices."
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to remove; obtain it from labels_list_labels."
    • Changedlabels_remove_label_from_entity2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Entity ID to untag, e.g. 'light.kitchen'."
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to remove; obtain it from labels_list_labels."
    • Changedlabels_update_category4 fields changed
      • addedInput schema / properties / category_id / description
        Added value: +"Category registry ID to update; obtain it from labels_list_categories."
      • addedInput schema / properties / icon / description
        Added value: +"New mdi icon identifier; omit to leave the current icon unchanged."
      • addedInput schema / properties / name / description
        Added value: +"New display name; omit to leave the current name unchanged."
      • addedInput schema / properties / scope / description
        Added value: +"Registry scope the category belongs to, e.g. 'automation'."
    • Changedlabels_update_label5 fields changed
      • addedInput schema / properties / color / description
        Added value: +"New label color name; omit to leave the current color unchanged."
      • addedInput schema / properties / description / description
        Added value: +"New free-text description; omit to leave the current description unchanged."
      • addedInput schema / properties / icon / description
        Added value: +"New mdi icon identifier, e.g. 'mdi:alert'; omit to leave the current icon unchanged."
      • addedInput schema / properties / label_id / description
        Added value: +"Label registry ID to update; obtain it from labels_list_labels."
      • addedInput schema / properties / name / description
        Added value: +"New display name; omit to leave the current name unchanged."
    • Changedsearch_deep_search2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of ranked results to return; defaults to 20."
      • addedInput schema / properties / query / description
        Added value: +"Search text to fuzzy-match across entities, devices and areas."
    • Changedsearch_find_related1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Entity ID to look up, e.g. 'light.kitchen'; must exist in the entity registry."
    • Changedsearch_search_areas2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of ranked results to return; defaults to 20."
      • addedInput schema / properties / query / description
        Added value: +"Search text to fuzzy-match against area names."
    • Changedsearch_search_devices2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of ranked results to return; defaults to 20."
      • addedInput schema / properties / query / description
        Added value: +"Search text to fuzzy-match against a device's name, name_by_user, manufacturer and model."
    • Changedsearch_search_entities2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of ranked results to return; defaults to 20."
      • addedInput schema / properties / query / description
        Added value: +"Search text to fuzzy-match against entity_id, friendly_name and device_id."
    • Changedservices_call_service4 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Required True to actually run one of eight guarded services: homeassistant.restart/stop, hassio.host_reboot/host_shutdown/restore_full/restore_partial, update.install, group.remove. False (default) performs no action for those instead and returns a confirmation prompt; ignored for every other service.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / data / description
        Added value: +"Service data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data."
      • addedInput schema / properties / domain / description
        Added value: +"Service domain to call, e.g. 'light' or 'climate'."
      • addedInput schema / properties / service / description
        Added value: +"Service name within the domain, e.g. 'turn_on' or 'set_temperature'."
    • Changedservices_camera_record3 fields changed
      • addedInput schema / properties / duration / description
        Added value: +"Recording length in seconds."
      • addedInput schema / properties / entity_id / description
        Added value: +"Full camera entity ID to record, e.g. 'camera.front_door'."
      • addedInput schema / properties / filename / description
        Added value: +"Destination path inside the HA config directory, e.g. '/config/www/snapshots/clip.mp4'. Overwrites any existing file there."
    • Changedservices_camera_snapshot2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full camera entity ID to capture, e.g. 'camera.front_door'."
      • addedInput schema / properties / filename / description
        Added value: +"Destination path inside the HA config directory, e.g. '/config/www/snapshots/front.jpg'. Overwrites any existing file there."
    • Changedservices_fire_event2 fields changed
      • addedInput schema / properties / event_data / description
        Added value: +"Event data payload delivered to listeners. Omit for no payload."
      • addedInput schema / properties / event_type / description
        Added value: +"Event type to fire, e.g. 'my_custom_event'."
    • Changedservices_list_services1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"Service domain filter, e.g. 'light'. Omit to list every domain."
    • Changedservices_media_play_pause1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full media_player entity ID to control, e.g. 'media_player.living_room'."
    • Changedservices_media_seek2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full media_player entity ID to seek, e.g. 'media_player.living_room'."
      • addedInput schema / properties / position / description
        Added value: +"Target playback position in seconds from the start of the current media."
    • Changedservices_notify_persistent_create3 fields changed
      • addedInput schema / properties / message / description
        Added value: +"Notification body text to show in the HA UI."
      • addedInput schema / properties / notification_id / description
        Added value: +"Stable ID for later dismissal via services_notify_persistent_dismiss. Omit to create a new, unaddressable notification each call."
      • addedInput schema / properties / title / description
        Added value: +"Optional notification title. Omit for no title."
    • Changedservices_notify_persistent_dismiss1 field changed
      • addedInput schema / properties / notification_id / description
        Added value: +"ID of the persistent notification to dismiss, as passed to services_notify_persistent_create."
    • Changedservices_press_button1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full button entity ID to press, e.g. 'button.restart_service'."
    • Changedservices_reload_config1 field changed
      • addedInput schema / properties / domain / description
        Added value: +"Domain to reload, e.g. 'automation', 'script' or 'scene'."
    • Changedservices_render_template1 field changed
      • addedInput schema / properties / template / description
        Added value: +"Jinja2 template string to render, e.g. '{{ states(\"sensor.temp\") }}'."
    • Changedservices_send_notification3 fields changed
      • addedInput schema / properties / message / description
        Added value: +"Notification body text to deliver."
      • addedInput schema / properties / target / description
        Added value: +"Notify service to use, e.g. 'mobile_app_phone' or 'notify.mobile_app_phone'. Omit to use the default 'notify' service."
      • addedInput schema / properties / title / description
        Added value: +"Optional notification title. Omit for no title."
    • Changedservices_set_climate_mode2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full climate entity ID to change, e.g. 'climate.living_room'."
      • addedInput schema / properties / hvac_mode / description
        Added value: +"Target mode: one of heat, cool, auto, off, fan_only, dry."
    • Changedservices_set_cover_position2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full cover entity ID to move, e.g. 'cover.living_room_blind'."
      • addedInput schema / properties / position / description
        Added value: +"Target position, 0 (closed) to 100 (open)."
    • Changedservices_set_cover_tilt2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full cover entity ID to tilt, e.g. 'cover.living_room_blind'."
      • addedInput schema / properties / tilt_position / description
        Added value: +"Target tilt position, 0 (closed) to 100 (open)."
    • Changedservices_set_light_color5 fields changed
      • addedInput schema / properties / brightness / description
        Added value: +"Target brightness, 0-255. Omit to leave brightness unchanged."
      • addedInput schema / properties / color_temp / description
        Added value: +"Deprecated mired color temperature. Converted to Kelvin; prefer color_temp_kelvin."
      • addedInput schema / properties / color_temp_kelvin
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target color temperature in Kelvin. Omit to leave it unchanged."
        +}
      • addedInput schema / properties / entity_id / description
        Added value: +"Full light entity ID to change, e.g. 'light.kitchen'."
      • addedInput schema / properties / rgb_color / description
        Added value: +"Target RGB color as [r, g, b], each 0-255. Omit to leave color unchanged."
    • Changedservices_set_volume2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Full media_player entity ID to change, e.g. 'media_player.living_room'."
      • addedInput schema / properties / volume / description
        Added value: +"Target volume level, 0.0 (silent) to 1.0 (maximum)."
    • Changedsnapshot_get_area_snapshot2 fields changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID to scope the snapshot to; states, devices and entities outside this area are excluded."
      • addedInput schema / properties / summary / description
        Added value: +"If true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes."
    • Changedsnapshot_get_snapshot7 fields changed
      • addedInput schema / properties / area_id / description
        Added value: +"Area registry ID; keeps only states/devices/entities assigned to this area, directly or via their device. Omit for no area filter."
      • addedInput schema / properties / domains / description
        Added value: +"Entity domain filter applied to the states/entities sections, e.g. ['light', 'climate']. Omit to include every domain."
      • addedInput schema / properties / include / description
        Added value: +"Sections to return. Omit for the default states/areas/devices/entities/integrations set. Valid values: states, areas, floors, devices, entities, integrations, config."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of states to return after filtering, for pagination on large setups. Omit for no limit."
      • addedInput schema / properties / offset / description
        Added value: +"Number of filtered states to skip before applying limit, for pagination. 0 starts from the first matching state."
      • addedInput schema / properties / state_fields / description
        Added value: +"Explicit per-state keys to return, overriding summary. Valid: entity_id, state, friendly_name, attributes, last_changed, last_updated. Omit to use summary instead."
      • addedInput schema / properties / summary / description
        Added value: +"If true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes; ignored when state_fields is given."
    • Changedstatistics_get_energy_statistics2 fields changed
      • addedInput schema / properties / days / description
        Added value: +"Number of days back from now to include, between 1 and 365."
      • addedInput schema / properties / period / description
        Added value: +"Aggregation bucket size passed to the underlying statistics query, e.g. 'day', 'week', 'month'."
    • Changedstatistics_get_statistics5 fields changed
      • changedInput schema / properties / end / description
        Previous value: -"end date/time (defaults to now)"New value: +"End of the range, same formats as `start`. Omit to use the current time."
      • changedInput schema / properties / period / description
        Previous value: -"aggregation period — \"hour\", \"day\", \"week\", \"month\", \"5minute\""New value: +"Aggregation bucket size: one of '5minute', 'hour', 'day', 'week', 'month'."
      • changedInput schema / properties / start / description
        Previous value: -"start date/time, e.g. \"2024-01-01\" or \"2024-01-01T00:00:00\""New value: +"Start of the range: a date ('2024-01-01') or datetime ('2024-01-01T00:00:00')."
      • changedInput schema / properties / statistic_ids / description
        Previous value: -"list of entity IDs or statistic IDs, e.g. [\"sensor.energy_consumption\"]"New value: +"Entity or statistic IDs to fetch, e.g. ['sensor.energy_consumption']. Discover valid values with `statistics_list_statistic_ids`."
      • changedInput schema / properties / types / description
        Previous value: -"which aggregates to return — any of [\"sum\", \"mean\", \"min\", \"max\", \"state\", \"change\"]\n    defaults to [\"sum\", \"mean\", \"min\", \"max\"]"New value: +"Which aggregates to include per bucket, any of 'sum', 'mean', 'min', 'max', 'state', 'change'. Omit to use ['sum', 'mean', 'min', 'max']."
    • Changedstatistics_get_statistics_metadata1 field changed
      • addedInput schema / properties / statistic_ids / description
        Added value: +"Statistic IDs to fetch metadata for, e.g. ['sensor.energy_consumption']. Discover valid values with `statistics_list_statistic_ids`."
    • Changedstatistics_list_statistic_ids1 field changed
      • addedInput schema / properties / statistic_type / description
        Added value: +"Which kind of statistic to list: 'sum' for counters (energy, gas, water) or 'mean' for sensors (temperature, humidity)."
    • Changedsupervisor_create_backup4 fields changed
      • addedInput schema / properties / addons / description
        Added value: +"Add-on slugs to include for a partial backup. Omit together with `folders` for a full backup of everything."
      • addedInput schema / properties / folders / description
        Added value: +"Folder names to include for a partial backup, e.g. 'share', 'ssl', 'media', 'addons/local'. Omit together with `addons` for a full backup of everything."
      • addedInput schema / properties / name / description
        Added value: +"Human-readable name to store on the new backup."
      • addedInput schema / properties / password / description
        Added value: +"Password to encrypt the backup with. Omit for an unencrypted backup."
    • Changedsupervisor_delete_backup2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "description": "Set true to actually delete the backup. False (default) performs no action and instead returns a confirmation prompt; the backup is not looked up or touched in that case.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / slug / description
        Added value: +"Backup slug to delete, from `supervisor_list_backups`."
    • Changedsupervisor_get_addon1 field changed
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_get_addon_logs2 fields changed
      • addedInput schema / properties / lines / description
        Added value: +"Maximum number of most-recent log lines to return. 100 by default; 0 or negative returns the full fetched log text."
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug to fetch logs for, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_get_addon_stats1 field changed
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug to fetch stats for, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_install_addon1 field changed
      • addedInput schema / properties / slug / description
        Added value: +"Slug of an add-on already visible in a registered repository (e.g. from `hacs_list_hacs_repositories`-style store listings or Supervisor's own add-on store)."
    • Changedsupervisor_restart_addon1 field changed
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug to restart, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_restart_core1 field changed
      • addedInput schema / properties / confirm / description
        Added value: +"Set true to actually restart Core. False (default) performs no action."
    • Changedsupervisor_restart_host1 field changed
      • addedInput schema / properties / confirm / description
        Added value: +"Set true to actually reboot the host. False (default) performs no action."
    • Changedsupervisor_restore_backup3 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Set true to actually restore the backup. False (default) performs no action."
      • addedInput schema / properties / password / description
        Added value: +"Password for an encrypted backup. Omit for an unencrypted one."
      • addedInput schema / properties / slug / description
        Added value: +"Backup slug to restore, from `supervisor_list_backups`."
    • Changedsupervisor_set_addon_options2 fields changed
      • addedInput schema / properties / options / description
        Added value: +"Full options object to store, validated by Supervisor against the add-on's schema. Any field read via `supervisor_get_addon` and left out here is not preserved automatically — include the whole dict, not just changed keys."
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug whose options to set, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_start_addon1 field changed
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug to start, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_stop_addon1 field changed
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug to stop, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_uninstall_addon2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Set true to actually uninstall the add-on and its data. False (default) performs no action."
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug to uninstall, e.g. from `supervisor_list_addons`."
    • Changedsupervisor_update_addon1 field changed
      • addedInput schema / properties / slug / description
        Added value: +"Add-on slug to update, e.g. from `supervisor_list_addons`."
    • Changedsystem_get_updates1 field changed
      • changedInput schema / properties / pending_only / description
        Previous value: -"If True (default), return only components with updates available.\n          Set False to see all update entities including up-to-date ones."New value: +"If true (default), return only components with an update available. Set false to also include up-to-date components."
    • Changedsystem_reload_integration1 field changed
      • addedInput schema / properties / entry_id / description
        Added value: +"Config entry ID to reload, from `system_list_integrations` or `system_get_all_integrations`."
    • Changedsystem_restart_ha1 field changed
      • addedInput schema / properties / confirm / description
        Added value: +"Set true to actually restart HA. False (default) performs no restart and instead returns a confirmation prompt."
    • Changedsystem_stop_ha1 field changed
      • addedInput schema / properties / confirm / description
        Added value: +"Set true to actually stop HA. False (default) performs no action and instead returns a confirmation prompt."
    • Changedthemes_create_theme4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Theme name, becomes the filename themes/<name>.yaml without the extension."
      • addedInput schema / properties / overwrite / description
        Added value: +"If true, replaces an existing theme file instead of failing; defaults to false."
      • addedInput schema / properties / reload / description
        Added value: +"If true, calls frontend.reload_themes after writing the file; defaults to true."
      • addedInput schema / properties / variables / description
        Added value: +"Inner theme variable map to write, e.g. {'primary-color': '#03a9f4'} or a 'modes' block with 'light'/'dark' keys; not wrapped in the theme name."
    • Changedthemes_delete_theme2 fields changed
      • addedInput schema / properties / name / description
        Added value: +"Theme name to delete; obtain it from themes_list_themes or themes_list_theme_files."
      • addedInput schema / properties / reload / description
        Added value: +"If true, calls frontend.reload_themes after deleting the file; defaults to true."
    • Changedthemes_get_theme1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Theme name to look up, matching a key in themes_list_themes' `themes` map."
    • Changedthemes_set_active_theme2 fields changed
      • addedInput schema / properties / mode / description
        Added value: +"Optional 'light' or 'dark' to also pin the color mode; any other value is ignored; omit to leave the mode as-is."
      • addedInput schema / properties / name / description
        Added value: +"Registered theme name to activate, e.g. 'default' or a custom theme name; defaults to 'default'."
    • Changedthemes_update_theme4 fields changed
      • addedInput schema / properties / merge / description
        Added value: +"If true, shallow-merges variables into the existing top-level keys; if false, replaces the whole variable set; defaults to true."
      • addedInput schema / properties / name / description
        Added value: +"Theme name to update; obtain it from themes_list_themes or themes_list_theme_files."
      • addedInput schema / properties / reload / description
        Added value: +"If true, calls frontend.reload_themes after writing the file; defaults to true."
      • addedInput schema / properties / variables / description
        Added value: +"Variable map to apply; merged into or replacing the existing set depending on `merge`."
    • Changedtodo_add_item4 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Optional longer item description/notes. Omit for none."
      • addedInput schema / properties / due_date / description
        Added value: +"Optional due date ('YYYY-MM-DD') or datetime ISO string. Omit for no due date."
      • addedInput schema / properties / entity_id / description
        Added value: +"Todo list entity ID to add the item to, e.g. 'todo.shopping_list'."
      • addedInput schema / properties / item / description
        Added value: +"Item text, e.g. 'Buy milk'."
    • Changedtodo_list_items2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Todo list entity ID, e.g. 'todo.shopping_list', from `todo_list_todo_lists`."
      • addedInput schema / properties / status / description
        Added value: +"Client-side status filter: 'needs_action', 'completed', or 'all' for no filter."
    • Changedtodo_remove_item2 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Todo list entity ID the item belongs to, e.g. 'todo.shopping_list'."
      • addedInput schema / properties / uid / description
        Added value: +"Item UID to remove, as returned by `todo_list_items`."
    • Changedtodo_update_item4 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Todo list entity ID the item belongs to, e.g. 'todo.shopping_list'."
      • addedInput schema / properties / item / description
        Added value: +"New item text. Omit to keep the current text."
      • addedInput schema / properties / status / description
        Added value: +"New status: 'needs_action' or 'completed'. Omit to keep the current status."
      • addedInput schema / properties / uid / description
        Added value: +"Item UID to update, as returned by `todo_list_items`."
    • Changedvoice_create_pipeline11 fields changed
      • addedInput schema / properties / conversation_engine / description
        Added value: +"Entity ID of the conversation agent, e.g. 'homeassistant' for the built-in agent."
      • addedInput schema / properties / conversation_language / description
        Added value: +"Language code for the conversation agent, e.g. 'en' or 'pl'."
      • addedInput schema / properties / language / description
        Added value: +"Overall pipeline language code, e.g. 'en' or 'pl'."
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new pipeline, e.g. 'Kitchen Assist'."
      • addedInput schema / properties / stt_engine / description
        Added value: +"Entity ID of the speech-to-text engine, e.g. 'stt.faster_whisper'. Omit for no STT. Discover installed ones with `voice_list_stt_engines`."
      • addedInput schema / properties / stt_language / description
        Added value: +"Language code for the STT engine. Omit to use its default."
      • addedInput schema / properties / tts_engine / description
        Added value: +"Entity ID of the text-to-speech engine, e.g. 'tts.piper'. Omit for no TTS. Discover installed ones with `voice_list_tts_engines`."
      • addedInput schema / properties / tts_language / description
        Added value: +"Language code for the TTS engine. Omit to use its default."
      • addedInput schema / properties / tts_voice / description
        Added value: +"Voice ID for the TTS engine. Omit to use its default voice."
      • addedInput schema / properties / wake_word_entity / description
        Added value: +"Entity ID of the wake-word detector, e.g. 'wake_word.openwakeword'. Omit for no wake word. Discover installed ones with `voice_list_wake_word_engines`."
      • addedInput schema / properties / wake_word_id / description
        Added value: +"Specific wake word model ID within `wake_word_entity`. Omit for its default."
    • Changedvoice_delete_pipeline1 field changed
      • addedInput schema / properties / pipeline_id / description
        Added value: +"ID of the pipeline to delete, from `voice_list_pipelines`."
    • Changedvoice_get_pipeline1 field changed
      • addedInput schema / properties / pipeline_id / description
        Added value: +"Pipeline ID to fetch, from `voice_list_pipelines`. Omit to return the current preferred pipeline instead."
    • Changedvoice_set_preferred_pipeline1 field changed
      • addedInput schema / properties / pipeline_id / description
        Added value: +"ID of the pipeline to make preferred, from `voice_list_pipelines`."
    • Changedvoice_update_pipeline12 fields changed
      • addedInput schema / properties / conversation_engine / description
        Added value: +"New conversation agent entity ID. Omit to keep the current one."
      • addedInput schema / properties / conversation_language / description
        Added value: +"New conversation language code. Omit to keep the current one."
      • addedInput schema / properties / language / description
        Added value: +"New overall pipeline language code. Omit to keep the current one."
      • addedInput schema / properties / name / description
        Added value: +"New display name. Omit to keep the current name."
      • addedInput schema / properties / pipeline_id / description
        Added value: +"ID of the pipeline to update, from `voice_list_pipelines`."
      • addedInput schema / properties / stt_engine / description
        Added value: +"New STT engine entity ID. Omit to keep the current one."
      • addedInput schema / properties / stt_language / description
        Added value: +"New STT language code. Omit to keep the current one."
      • addedInput schema / properties / tts_engine / description
        Added value: +"New TTS engine entity ID. Omit to keep the current one."
      • addedInput schema / properties / tts_language / description
        Added value: +"New TTS language code. Omit to keep the current one."
      • addedInput schema / properties / tts_voice / description
        Added value: +"New TTS voice ID. Omit to keep the current one."
      • addedInput schema / properties / wake_word_entity / description
        Added value: +"New wake-word detector entity ID. Omit to keep the current one."
      • addedInput schema / properties / wake_word_id / description
        Added value: +"New wake word model ID. Omit to keep the current one."
    • Changedws_call_service4 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Service data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data."
      • addedInput schema / properties / domain / description
        Added value: +"Service domain to call, e.g. 'weather' or 'calendar'."
      • addedInput schema / properties / service / description
        Added value: +"Service name within the domain, e.g. 'get_forecasts' or 'get_events'."
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 10,
        +  "description": "Maximum seconds to wait for the WebSocket handshake and the result message before giving up; must be between 1 and 300.",
        +  "maximum": 300,
        +  "minimum": 1,
        +  "type": "number"
        +}
    • Changedws_get_config1 field changed
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 10,
        +  "description": "Maximum seconds to wait for the WebSocket handshake and the result message before raising an error; must be between 1 and 300.",
        +  "maximum": 300,
        +  "minimum": 1,
        +  "type": "number"
        +}
    • Changedws_get_states1 field changed
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 10,
        +  "description": "Maximum seconds to wait for the WebSocket handshake and the result message before raising an error; must be between 1 and 300.",
        +  "maximum": 300,
        +  "minimum": 1,
        +  "type": "number"
        +}
    • Changedws_listen_events5 fields changed
      • addedInput schema / properties / count / description
        Added value: +"Maximum number of events to collect before returning early."
      • addedInput schema / properties / event_type / description
        Added value: +"HA event type to subscribe to, e.g. 'zha_event' or 'call_service'."
      • addedInput schema / properties / timeout / description
        Added value: +"Maximum seconds to wait for `count` events before returning what arrived; must be between 1 and 300."
      • addedInput schema / properties / timeout / maximum
        Added value: +300
      • addedInput schema / properties / timeout / minimum
        Added value: +1
    • Changedws_listen_state_changes5 fields changed
      • addedInput schema / properties / count / description
        Added value: +"Maximum number of matching events to collect before returning early."
      • addedInput schema / properties / entity_id / description
        Added value: +"Full entity ID to watch for state changes, e.g. 'binary_sensor.motion'."
      • addedInput schema / properties / timeout / description
        Added value: +"Maximum seconds to wait for `count` matching events before returning what arrived; must be between 1 and 300."
      • addedInput schema / properties / timeout / maximum
        Added value: +300
      • addedInput schema / properties / timeout / minimum
        Added value: +1
    • Changedws_render_template2 fields changed
      • addedInput schema / properties / template / description
        Added value: +"Jinja2 template string to render, e.g. '{{ states(\"sensor.temp\") }}'."
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 10,
        +  "description": "Maximum seconds to wait for the rendered value before raising an error; must be between 1 and 300.",
        +  "maximum": 300,
        +  "minimum": 1,
        +  "type": "number"
        +}
    • Changedws_subscribe_trigger4 fields changed
      • addedInput schema / properties / timeout / description
        Added value: +"Maximum seconds to wait for the trigger to fire before returning None; must be between 1 and 300."
      • addedInput schema / properties / timeout / maximum
        Added value: +300
      • addedInput schema / properties / timeout / minimum
        Added value: +1
      • addedInput schema / properties / trigger / description
        Added value: +"HA trigger definition dict, e.g. {'platform': 'state', 'entity_id': 'binary_sensor.motion', 'to': 'on'}."
    • Changedzones_create_zone6 fields changed
      • addedInput schema / properties / icon / description
        Added value: +"Optional mdi icon identifier, e.g. 'mdi:office-building'; omit for none."
      • addedInput schema / properties / latitude / description
        Added value: +"Latitude in decimal degrees, e.g. 52.23."
      • addedInput schema / properties / longitude / description
        Added value: +"Longitude in decimal degrees, e.g. 21.01."
      • addedInput schema / properties / name / description
        Added value: +"Display name for the new zone, e.g. 'Office'."
      • addedInput schema / properties / passive / description
        Added value: +"If true, excludes the zone from device-tracker zone suggestions; defaults to false."
      • addedInput schema / properties / radius / description
        Added value: +"Zone radius in meters; defaults to 100."
    • Changedzones_delete_zone1 field changed
      • addedInput schema / properties / zone_id / description
        Added value: +"Zone helper id or full entity_id like 'zone.office'; obtain it from zones_list_zones."
    • Changedzones_get_user_location1 field changed
      • addedInput schema / properties / person_entity_id / description
        Added value: +"Person entity_id, e.g. 'person.alice'; a bare id like 'alice' is prefixed with 'person.' automatically."
    • Changedzones_get_zone1 field changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Zone entity_id, e.g. 'zone.office'; a bare id like 'office' is prefixed with 'zone.' automatically."
    • Changedzones_list_persons_in_zone1 field changed
      • addedInput schema / properties / zone_entity_id / description
        Added value: +"Zone entity_id, e.g. 'zone.home'; a bare id like 'home' is prefixed with 'zone.' automatically."
    • Changedzones_update_zone7 fields changed
      • addedInput schema / properties / entity_id / description
        Added value: +"Zone entity_id to update, e.g. 'zone.office'; obtain it from zones_list_zones."
      • addedInput schema / properties / icon / description
        Added value: +"New mdi icon identifier; omit to leave the current icon unchanged."
      • addedInput schema / properties / latitude / description
        Added value: +"New latitude in decimal degrees; omit to leave the current latitude unchanged."
      • addedInput schema / properties / longitude / description
        Added value: +"New longitude in decimal degrees; omit to leave the current longitude unchanged."
      • addedInput schema / properties / name / description
        Added value: +"New display name; omit to leave the current name unchanged."
      • addedInput schema / properties / passive / description
        Added value: +"New passive flag; omit to leave the current setting unchanged."
      • addedInput schema / properties / radius / description
        Added value: +"New zone radius in meters; omit to leave the current radius unchanged."
  2. 7 tool updatesv0.18.2
    • Addedesphome_lvgl_add_widget
    • Addedesphome_lvgl_delete_widget
    • Addedesphome_lvgl_get_page_widgets
    • Addedesphome_lvgl_get_pages
    • Addedesphome_lvgl_get_styles
    • Addedesphome_lvgl_list_devices
    • Addedesphome_lvgl_validate
  3. 85 tool updatesv0.18.1
    • Changedautomations_delete_automation1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Addedautomations_delete_scene
    • Changedautomations_delete_script1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Addedautomations_get_last_automation_trace
    • Addedautomations_get_last_script_trace
    • Addedautomations_get_scene_config
    • Addedautomations_list_groups
    • Addedautomations_remove_group
    • Addedautomations_set_group
    • Addedautomations_set_scene_config
    • Addedautomations_validate_automation_references
    • Addedautomations_validate_best_practices
    • Addedcard_builder_build_from_recipe
    • Addedcard_builder_build_styles
    • Addedcard_builder_check_schema_sync
    • Addedcard_builder_create_card
    • Addedcard_builder_create_css_custom_property
    • Addedcard_builder_create_style_preset
    • Addedcard_builder_delete_card
    • Addedcard_builder_delete_css_custom_property
    • Addedcard_builder_delete_media
    • Addedcard_builder_delete_style_preset
    • Addedcard_builder_design_for_intent
    • Addedcard_builder_design_principles
    • Addedcard_builder_get_block_schema
    • Addedcard_builder_get_card
    • Addedcard_builder_get_card_template
    • Addedcard_builder_get_design_pattern
    • Addedcard_builder_get_style_snippet
    • Addedcard_builder_list_block_types
    • Addedcard_builder_list_button_toggle_features
    • Addedcard_builder_list_card_templates
    • Addedcard_builder_list_cards
    • Addedcard_builder_list_css_custom_properties
    • Addedcard_builder_list_design_patterns
    • Addedcard_builder_list_media
    • Addedcard_builder_list_style_categories
    • Addedcard_builder_list_style_presets
    • Addedcard_builder_list_style_snippets
    • Addedcard_builder_list_style_targets
    • Addedcard_builder_make_template_card
    • Addedcard_builder_recipe_guide
    • Addedcard_builder_renderer_card_config
    • Addedcard_builder_update_card
    • Addedcard_builder_update_style_preset
    • Addedcard_builder_upload_image_from_url
    • Addedcard_builder_upload_media
    • Addedcard_builder_upload_media_from_path
    • Addedcard_builder_upload_svg
    • Addedcard_builder_validate_config
    • Addeddashboards_add_dashboard_resource
    • Addeddashboards_remove_dashboard_resource
    • Addeddashboards_screenshot
    • Addeddashboards_update_dashboard_resource
    • Addeddiscover_get_tool_doc
    • Addeddiscover_list_namespaces
    • Addeddiscover_refresh_index
    • Addeddiscover_tool_search
    • Addedentities_bulk_set_entity_exposure
    • Changedentities_list_entities4 fields changed
      • addedInput schema / properties / domain / description
        Added value: +"Filter by domain prefix (e.g. 'light', 'sensor')."
      • addedInput schema / properties / fields
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Keys to return per entity. Defaults to [entity_id, state, friendly_name].\n    Also accepts: attributes, area_id, device_id, labels."
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Max number of results. Omit for all."
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Skip first N results (pagination).",
        +  "type": "integer"
        +}
    • Addedesphome_clean_mqtt
    • Addedesphome_compile_device
    • Addedesphome_get_addon_info
    • Addedesphome_get_addon_logs
    • Addedesphome_get_config
    • Addedesphome_get_device_entities
    • Addedesphome_list_devices
    • Addedesphome_ping_dashboard
    • Addedesphome_upload_device
    • Addedesphome_validate_config
    • Addedesphome_write_config
    • Changedgit_git_rollback_file1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedgit_git_rollback_to_commit1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedintegrations_remove_integration1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Addedsnapshot_get_area_snapshot
    • Addedsnapshot_get_snapshot
    • Addedstatistics_get_energy_statistics
    • Addedstatistics_get_statistics
    • Addedstatistics_get_statistics_metadata
    • Addedstatistics_list_statistic_ids
    • Addedsystem_get_repairs
    • Addedsystem_get_system_health
    • Addedsystem_get_updates
    • Changedsystem_restart_ha1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedsystem_stop_ha1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
  4. 31 tool updatesv0.4.0
    • Addedintegrations_abort_config_flow
    • Addedintegrations_abort_options_flow
    • Addedintegrations_disable_integration
    • Addedintegrations_enable_integration
    • Addedintegrations_get_config_flow
    • Addedintegrations_list_flow_handlers
    • Addedintegrations_list_flows_in_progress
    • Addedintegrations_remove_integration
    • Addedintegrations_start_config_flow
    • Addedintegrations_start_options_flow
    • Addedintegrations_submit_config_flow_step
    • Addedintegrations_submit_options_flow_step
    • Addedintegrations_update_integration_entry
    • Addedthemes_create_theme
    • Addedthemes_delete_theme
    • Addedthemes_get_theme
    • Addedthemes_list_theme_files
    • Addedthemes_list_themes
    • Addedthemes_reload_themes
    • Addedthemes_set_active_theme
    • Addedthemes_update_theme
    • Addedvoice_create_pipeline
    • Addedvoice_delete_pipeline
    • Addedvoice_get_pipeline
    • Addedvoice_list_conversation_agents
    • Addedvoice_list_pipelines
    • Addedvoice_list_stt_engines
    • Addedvoice_list_tts_engines
    • Addedvoice_list_wake_word_engines
    • Addedvoice_set_preferred_pipeline
    • Addedvoice_update_pipeline
  5. 202 tool updatesv0.3.0
    • First observedareas_control_area
    • First observedareas_create_area
    • First observedareas_delete_area
    • First observedareas_get_area_entities
    • First observedareas_get_area_states
    • First observedareas_list_areas
    • First observedareas_list_devices
    • First observedareas_list_floors
    • First observedautomations_activate_scene
    • First observedautomations_delete_automation
    • First observedautomations_delete_script
    • First observedautomations_disable_automation
    • First observedautomations_enable_automation
    • First observedautomations_get_automation_config
    • First observedautomations_get_automation_trace
    • First observedautomations_get_script_config
    • First observedautomations_get_script_trace
    • First observedautomations_list_automation_traces
    • First observedautomations_list_automations
    • First observedautomations_list_scenes
    • First observedautomations_list_script_traces
    • First observedautomations_list_scripts
    • First observedautomations_reload_automations
    • First observedautomations_reload_scenes
    • First observedautomations_reload_scripts
    • First observedautomations_run_script
    • First observedautomations_set_automation_config
    • First observedautomations_set_script_config
    • First observedautomations_trigger_automation
    • First observedblueprints_delete_blueprint
    • First observedblueprints_import_blueprint
    • First observedblueprints_list_blueprints
    • First observedblueprints_substitute_blueprint
    • First observedcalendar_create_event
    • First observedcalendar_delete_event
    • First observedcalendar_list_calendars
    • First observedcalendar_list_events
    • First observeddashboards_add_card_to_view
    • First observeddashboards_add_view_to_dashboard
    • First observeddashboards_get_dashboard_config
    • First observeddashboards_get_dashboard_resources
    • First observeddashboards_list_dashboards
    • First observeddashboards_save_dashboard_config
    • First observeddevices_list_devices
    • First observeddevices_list_devices_in_area
    • First observeddevices_remove_device
    • First observeddevices_update_device
    • First observedenergy_add_battery_source
    • First observedenergy_add_grid_consumption
    • First observedenergy_add_grid_return
    • First observedenergy_add_solar_source
    • First observedenergy_get_energy_info
    • First observedenergy_get_energy_prefs
    • First observedenergy_remove_energy_source
    • First observedenergy_save_energy_prefs
    • First observedenergy_validate_energy_prefs
    • First observedentities_assign_entity_to_area
    • First observedentities_bulk_control
    • First observedentities_bulk_set_state
    • First observedentities_disable_entity
    • First observedentities_enable_entity
    • First observedentities_get_entity
    • First observedentities_get_entity_exposure
    • First observedentities_list_entities
    • First observedentities_list_entity_registry
    • First observedentities_list_exposed_entities
    • First observedentities_select_option
    • First observedentities_set_entity_exposure
    • First observedentities_set_value
    • First observedentities_toggle
    • First observedentities_turn_off
    • First observedentities_turn_on
    • First observedentities_update_entity_name
    • First observedfiles_append_to_config_file
    • First observedfiles_delete_config_file
    • First observedfiles_list_config_files
    • First observedfiles_read_config_file
    • First observedfiles_validate_yaml_content
    • First observedfiles_write_config_file
    • First observedgit_git_checkout_branch
    • First observedgit_git_commit_all
    • First observedgit_git_create_branch
    • First observedgit_git_diff
    • First observedgit_git_init_config
    • First observedgit_git_list_branches
    • First observedgit_git_log
    • First observedgit_git_rollback_file
    • First observedgit_git_rollback_to_commit
    • First observedgit_git_status
    • First observedgit_safe_write_with_checkpoint
    • First observedhacs_add_custom_repository
    • First observedhacs_get_hacs_repository
    • First observedhacs_install_hacs_repository
    • First observedhacs_list_hacs_critical_updates
    • First observedhacs_list_hacs_repositories
    • First observedhacs_uninstall_hacs_repository
    • First observedhacs_update_hacs_repository
    • First observedhelpers_cancel_timer
    • First observedhelpers_increment_counter
    • First observedhelpers_list_helpers
    • First observedhelpers_reload_helpers
    • First observedhelpers_reset_counter
    • First observedhelpers_set_input_boolean
    • First observedhelpers_set_input_datetime
    • First observedhelpers_set_input_number
    • First observedhelpers_set_input_select
    • First observedhelpers_set_input_text
    • First observedhelpers_start_timer
    • First observedhistory_get_error_log
    • First observedhistory_get_ha_config
    • First observedhistory_get_logbook
    • First observedhistory_get_state_history
    • First observedhistory_get_system_info
    • First observedlabels_assign_label_to_device
    • First observedlabels_assign_label_to_entity
    • First observedlabels_create_category
    • First observedlabels_create_label
    • First observedlabels_delete_category
    • First observedlabels_delete_label
    • First observedlabels_list_categories
    • First observedlabels_list_devices_with_label
    • First observedlabels_list_entities_with_label
    • First observedlabels_list_labels
    • First observedlabels_remove_label_from_device
    • First observedlabels_remove_label_from_entity
    • First observedlabels_update_category
    • First observedlabels_update_label
    • First observedsearch_deep_search
    • First observedsearch_find_orphan_devices
    • First observedsearch_find_related
    • First observedsearch_find_unused_entities
    • First observedsearch_search_areas
    • First observedsearch_search_devices
    • First observedsearch_search_entities
    • First observedservices_call_service
    • First observedservices_camera_record
    • First observedservices_camera_snapshot
    • First observedservices_fire_event
    • First observedservices_list_services
    • First observedservices_media_play_pause
    • First observedservices_media_seek
    • First observedservices_notify_persistent_create
    • First observedservices_notify_persistent_dismiss
    • First observedservices_notify_persistent_dismiss_all
    • First observedservices_press_button
    • First observedservices_reload_config
    • First observedservices_render_template
    • First observedservices_send_notification
    • First observedservices_set_climate_mode
    • First observedservices_set_cover_position
    • First observedservices_set_cover_tilt
    • First observedservices_set_light_color
    • First observedservices_set_volume
    • First observedsupervisor_create_backup
    • First observedsupervisor_delete_backup
    • First observedsupervisor_get_addon
    • First observedsupervisor_get_addon_logs
    • First observedsupervisor_get_addon_stats
    • First observedsupervisor_get_core_info
    • First observedsupervisor_get_host_info
    • First observedsupervisor_get_supervisor_info
    • First observedsupervisor_install_addon
    • First observedsupervisor_list_addons
    • First observedsupervisor_list_backups
    • First observedsupervisor_restart_addon
    • First observedsupervisor_restart_core
    • First observedsupervisor_restart_host
    • First observedsupervisor_restore_backup
    • First observedsupervisor_set_addon_options
    • First observedsupervisor_start_addon
    • First observedsupervisor_stop_addon
    • First observedsupervisor_uninstall_addon
    • First observedsupervisor_update_addon
    • First observedsystem_check_config
    • First observedsystem_create_backup
    • First observedsystem_get_all_integrations
    • First observedsystem_list_integrations
    • First observedsystem_ping_ha
    • First observedsystem_reload_all
    • First observedsystem_reload_integration
    • First observedsystem_restart_ha
    • First observedsystem_stop_ha
    • First observedtodo_add_item
    • First observedtodo_list_items
    • First observedtodo_list_todo_lists
    • First observedtodo_remove_item
    • First observedtodo_update_item
    • First observedws_call_service
    • First observedws_get_config
    • First observedws_get_states
    • First observedws_listen_events
    • First observedws_listen_state_changes
    • First observedws_render_template
    • First observedws_subscribe_trigger
    • First observedzones_create_zone
    • First observedzones_delete_zone
    • First observedzones_get_user_location
    • First observedzones_get_zone
    • First observedzones_list_persons_in_zone
    • First observedzones_list_zones
    • First observedzones_reload_zones
    • First observedzones_update_zone

TDQS

A3.9/5.0

Scored across 323 tools

Disambiguation4/5

Given 323 tools, overlap is surprisingly well managed: descriptions extensively use 'Use when'/'Not for' cross-references (e.g. entities_turn_on vs helpers_set_input_boolean vs services_call_service, entities_set_value vs helpers_set_input_number) to steer selection. There are still confusable clusters — areas_list_devices vs devices_list_devices vs devices_list_devices_in_area, and the HTTP vs WS transport duplicates (services_call_service vs ws_call_service, history_get_ha_config vs ws_get_config) — but they are documented rather than ambiguous.

Naming Consistency4/5

Strong, near-uniform namespace_prefix_verb_noun convention (areas_list_areas, entities_turn_on, supervisor_restart_addon, card_builder_create_card), making the surface scannable despite its size. Minor deviations exist, most notably the redundant git_git_* double prefix (git_git_status, git_git_init_config) and a few oddities like discover_refresh_index.

Tool Count1/5

323 tools is an extreme mismatch for any single server, far beyond the 50+ threshold, and forces the agent to lean on discover_tool_search just to navigate its own surface. Even with good organization, this volume guarantees a tiny per-call footprint of relevance and heavy cognitive overhead.

Completeness4/5

Coverage across the Home Assistant domain is remarkably broad — entities, devices, areas, labels, automations/scripts/scenes, dashboards, supervisor/add-ons, HACS, ESPHome, energy, voice, calendar, todo, statistics/history, git, files and zones all have lifecycle operations. A few acknowledged gaps (no area update tool, no partial Supervisor restore, no options-flow read) exist but agents can work around them.

Maintenance

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    MCP server for full Home Assistant control, enabling AI agents to manage dashboards, automations, files, apps, entities, and more via REST API, WebSocket, and SSH.
    66
    96 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A self-hosted MCP server for Home Assistant that exposes full control over entity states, service calls, history, templates, and areas via local stdio, enabling AI assistants to manage your smart home.
    9
    83 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A comprehensive MCP server that enables AI assistants to interact with Home Assistant, control smart home devices, query states, execute services, and manage automations via natural language.
    77
    44,239 PyPI
    5,046
    MIT