ha-nexus-agent
Server provides 323 MCP tools across 29 categories for full Home Assistant control, automation, and administration.
Entities: list/get states, turn on/off/toggle, set values, rename, assign areas, enable/disable, bulk control, manage voice exposure.
Services: call any HA service, fire events, render templates, reload configs, control covers/climate/lights/media, send notifications, camera snapshots/recordings.
Automations: CRUD automations/scripts/scenes, traces, YAML validation (best practices + live references), entity groups.
Areas/Devices: list/create/delete areas, floors, devices, area entities/states, control area entities.
History/Helpers/System: state history, logbook, error log, system info/config; manage input helpers, counters, timers; check config, restart/stop HA (confirm), reload all, backups, integrations, ping.
Plus many more (README): dashboards, files, git, WebSocket, Supervisor, HACS, energy, zones, labels, search, integrations, voice, themes, card builder, snapshot, ESPHome, statistics, tool discovery.
Provides AI assistants full control over a Home Assistant smart home, including entities, automations, scripts, blueprints, dashboards, helpers, areas, devices, calendar, todo lists, history, system management, YAML config files, git-based versioning, real-time WebSocket events, energy dashboard, zones, labels, supervisor add-ons, and HACS integration.
Nexus Agent — MCP for Home Assistant
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-agentinstead of building locally, and the same image works standalone/HA Container. See Docker Image.confirmgate onservices_call_service— the generic domain/service dispatcher now requiresconfirm=Truefor 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_servicenow refuses them outright. See Confirmation Gates.Originheader validation — the HTTP transport now rejects a disallowed,nullor repeatedOriginheader with403, per the MCP spec's DNS-rebinding protection. HA ingress andGET /healthare 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/servicenames are restricted to[A-Za-z0-9_]+;areas_control_areaandservices_send_notificationno longer accept an arbitrary action/target.Breaking:
armhf/armv7/i386are 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=searchadd-on option — replacestools/listwith 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_addonno longer leaks secrets — schema-declared password fields, secret-looking option keys (including plural forms likecredentials/api_keys), and URLs with inline credentials are now redacted;supervisor_set_addon_optionsstill 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_URLset explicitly; the add-on discovers it automatically via the Supervisor.The add-on now uses
host_network: trueso 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 adiagnosisblock on connectivity/auth failures instead of ad-hoc messages.esphome_upload_devicerequiresconfirm=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: underhost_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_onlyanddisabled_namespacesadd-on options — a serverside policy that hides and refuses non-read-only tools (or whole namespaces) at the MCP protocol level, not just fromtools/list. See Add-on Options / Security.confirmgate onsupervisor_delete_backupandfiles_delete_config_file— the first call withoutconfirm=Truenow does no I/O and returns a confirmation prompt instead of deleting immediately.Safer section-by-section dashboard edits —
expected_config_hash/config_hashon the dashboard section tools detect a stale read before a write can land on the wrong card.GET /healthtrimmed to{"status": "ok"}— it no longer leaksha_url, the tool count or the active policy to unauthenticated LAN callers.ESPHome fixes —
esphome_clean_mqttnow works through HA's ownmqttintegration; device online/offline status no longer depends on abinary_sensor.*_api_connection_statusentity 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 withtype: sectionsrenders onlyview.sections; cards written toview.cardsshow up exclusively in edit mode as "imported cards" (hui-sections-view.ts), sodashboards_add_card_to_viewcould 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 throughdashboards_save_dashboard_config.url_pathaccepts a view path ('lukasz2'), and non-sectionsviews 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, lightcolor_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 incard_builder_*.New
blueprints_save_blueprint— persists blueprint YAML fetched byimport_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 URLssystem_get_system_health— health check of all HA subsystems (recorder, network, cloud, etc.)system_get_repairs— list active repair issues that require attentionEntity groups CRUD —
automations_list_groups,automations_set_group,automations_remove_group— create/update/deletegroup.*entities viagroup.setLive automation reference validator —
automations_validate_automation_referencescross-checks everyentity_idandservicein your YAML against the live HA registry; template values skipped automaticallyLovelace 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_entitiesandget_snapshotnow acceptlimit,offset, andfields/state_fieldsConfirmation gates on all destructive operations —
restart_ha,stop_ha,git_rollback_*,delete_automation,delete_script,remove_integrationall requireconfirm=TrueAutomation best-practice linter —
automations_validate_best_practicesstatically checks YAML for 7 common mistakesDashboard screenshot via Puppet engine —
dashboards_screenshotrenders any Lovelace view to PNG
Installation — Home Assistant Add-on (Recommended)
Click the Open Add-on Repository on MY button above
Find Nexus Agent in the Add-on Store → Install → Start
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:
In Home Assistant go to Settings → Add-ons → Add-on Store
Click the three-dot menu (⋮) → Repositories
Add:
https://github.com/Fistacho/ha-nexus-agentFind 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.pyOpen http://localhost:7123 to get your API key and MCP client configs.
Getting a Home Assistant token
In HA: Profile → Security → Long-Lived Access Tokens
Create Token → name it
nexusPaste as
HA_TOKENin.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/mcpAuthenticate 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 addhas no--headerflag for HTTP servers, so this falls back to the query-token URL (logged in plaintext). For header-based auth instead, edit~/.codex/config.tomldirectly, 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 |
| 18 | list (paginated + field selection), turn on/off/toggle, bulk_control, voice expose, set_value |
| 19 | call_service ( |
| 31 | CRUD + full YAML, traces, scripts, scenes, scene CRUD ( |
| 5 | list, import from URL, save (persist imported YAML), delete, instantiate |
| 8 | list, create, get_states, control_area |
| 4 | list, update (rename/move/disable), remove |
| 4 | list calendars/events, create/delete event |
| 5 | list, add/update/remove items |
| 11 | input_boolean/number/text/select/datetime, timers, counters |
| 5 | state history, logbook, error log, system info |
| 12 | check_config, backup, restart/stop (confirm gate), get_updates, get_system_health, get_repairs |
| 15 | get/save config, add cards/views, section-aware editing of |
| 6 | read/write config files, YAML validation ( |
| 11 | commit, rollback (confirm gate), log, safe_write_with_checkpoint |
| 7 | listen state changes, events, subscribe_trigger, render_template |
| 20 | add-on install/start/stop/update/logs/stats, backups, core/host info |
| 7 | list/install/uninstall/update HACS repos, critical updates |
| 9 | grid, solar, battery sources, energy preferences |
| 8 | create/update/delete zones, person location |
| 14 | labels, categories, assign to entities/devices |
| 7 | fuzzy search, orphan devices, unused entities, deep_search |
| 13 | config_flow (install like in UI), options flow CRUD, enable/disable, remove (confirm gate) |
| 10 | Assist pipelines CRUD, STT/TTS/wake-word engines |
| 8 | list/create/update/delete Lovelace themes |
| 38 | Cards CRUD, style presets, CSS properties, media, renderer config, embedded block schema ( |
| 2 | Aggregated one-call context — states + areas + devices + entities + integrations, domain/area/field filters, pagination |
| 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 |
| 4 | long-term recorder statistics — list IDs, get sum/mean/min/max by hour/day/week/month, |
| 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 contextConfirmation gates — 18 destructive tools, plus 8 guarded services reachable via
services_call_service, requireconfirm=True; without it they return the exact command to re-run. See Confirmation Gates.Automation linter —
automations_validate_best_practicescatches 7 common YAML mistakes before they cause issuesLive reference validator —
automations_validate_automation_referencescross-checks every entity_id and service call against the running HA instanceUpdates monitor —
system_get_updateslists all pending updates across core, add-ons and HACSRepair issues —
system_get_repairssurfaces active issues from HA's repair centreLovelace 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_checkpointYAML validation before writing any config file (
!include,!secretaware)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 —
/mcprequires the key viaAuthorization: Bearer(recommended) or the legacy?token=query stringIngress-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 /) andPOST /regenerateonly 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.
.envdeployment) — fromlocalhost, 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
403for/regenerate).GET /healthis 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_urland activeread_only/disabled_namespacespolicy 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.
/mcpacceptsAuthorization: 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 attools/call, not merely omitted fromtools/list.read_onlydoes not restrict what an already-visible read tool can read (e.g.files_read_config_file,git_log,supervisor_get_addon_logs); combine withdisabled_namespacesto 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 |
| restarts HA Core |
| stops HA Core |
| restarts HA Core |
| reboots the host |
| restores a full backup, discarding changes since |
| permanently deletes a backup |
| deletes an add-on and its data |
| deletes an automation config |
| deletes a script config |
| removes an automation/script group |
| deletes a scene config |
| removes a Lovelace JS/CSS resource |
| reverts one file in |
| reverts all of |
| removes a config entry |
| deletes a file under |
| flashes new firmware, no automatic rollback |
| only when |
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 |
|
| TCP port for the MCP endpoint and Setup UI |
|
| Add-on's own log verbosity ( |
|
| Auto-commit |
|
| Supervisor backups nexus keeps before pruning the oldest |
| (auto-generated) | Pin the MCP API key instead of letting nexus generate one |
|
| 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. |
|
| List of tool namespaces (e.g. |
|
|
|
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 binds0.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_portstays fixed at7123regardless, 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
In HA: Settings → Add-ons → Add-on Store → ⋮ → Repositories
Add:https://github.com/balloob/home-assistant-addonsInstall Puppet, set its
access_tokenoption to a HA long-lived access token, then start itDone — 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:10000Usage
dashboards_screenshot(url_path="caly-dom", width=1280, height=800, wait_ms=3000)
dashboards_screenshot(url_path="lovelace/0", full_page=True) # full scrollable pageReturns {"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 historyAutomation Linter
automations_validate_best_practices checks YAML against 7 rules before you save:
Rule | Severity | What it catches |
| ⚠️ warning | State trigger without |
| ⚠️ warning | Missing |
| ℹ️ info | No |
| ℹ️ info | Multiple triggers without |
| ℹ️ info |
|
| ℹ️ info | No |
| ℹ️ info |
|
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 |
| Yes |
| Home Assistant URL |
| Standalone only | — | Long-lived access token |
| Add-on only | auto-injected | Set automatically by HA |
| For git/file tools |
| Path to HA config directory |
| No | auto-generated | Pin to a specific API key |
| No |
| HTTP server port |
| No | auto-discovered | Explicit URL to Puppet engine (Docker/standalone) |
| Standalone only, for | — | 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 |
| No |
| Standalone equivalent of the |
| No | (empty) | Standalone equivalent of |
| No |
| Standalone equivalent of the |
Changelog
See Releases for full history.
Available Tools
323 toolsareas_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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Service to call on the domain: 'turn_on', 'turn_off' or 'toggle'. | |
| domain | No | Entity domain to target within the area, e.g. 'light' or 'switch'; defaults to 'light'. | light |
| area_id | Yes | Area registry ID to target; obtain it from areas_list_areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the new area, e.g. 'Kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 areaADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| area_id | Yes | Area registry ID to delete; obtain it from areas_list_areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 areaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| area_id | Yes | Area registry ID whose entities to return; obtain it from areas_list_areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 areaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| area_id | Yes | Area registry ID whose entity states to return; obtain it from areas_list_areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 areasARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 unfilteredARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 floorsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 sceneAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full scene entity ID to activate, e.g. 'scene.movie_night'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True to actually delete the automation. False (default) returns a safety prompt instead of deleting anything. | |
| automation_id | Yes | Automation config id to delete — the entity's `id` attribute, not its entity_id. A leading 'automation.' is stripped if present. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True to actually delete the scene. False (default) returns a safety prompt instead of deleting anything. | |
| scene_id | Yes | Scene id to delete, bare (e.g. 'movie_night') or prefixed ('scene.movie_night'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True to actually delete the script. False (default) returns a safety prompt instead of deleting anything. | |
| script_id | Yes | Script id to delete, bare (e.g. 'goodnight') or prefixed ('script.goodnight'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 automationAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full automation entity ID to disable, e.g. 'automation.morning_routine'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 automationAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full automation entity ID to enable, e.g. 'automation.morning_routine'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| automation_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 traceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | Run id from `automations_list_automation_traces`, identifying one specific run. | |
| automation_id | Yes | Automation config id the trace belongs to, bare or prefixed ('automation.<id>'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 traceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| failed_only | No | If True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False. | |
| automation_id | Yes | Automation config id to fetch the latest trace for, bare or prefixed ('automation.<id>'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 traceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | Script id to fetch the latest trace for, bare or prefixed ('script.<id>'). | |
| failed_only | No | If True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| scene_id | Yes | Scene id to look up, bare (e.g. 'movie_night') or prefixed ('scene.movie_night'); the 'scene.' prefix is stripped if present. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | Script id to look up, bare (e.g. 'goodnight') or prefixed ('script.goodnight'); the 'script.' prefix is stripped if present. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 traceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | Run id from `automations_list_script_traces`, identifying one specific run. | |
| script_id | Yes | Script id the trace belongs to, bare or prefixed ('script.<id>'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 automationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 summariesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| automation_id | Yes | Automation config id to list traces for, bare or prefixed ('automation.<id>'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 groupsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 scenesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 scriptsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 summariesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | Script id to list traces for, bare or prefixed ('script.<id>'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 YAMLAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 YAMLAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 YAMLAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 groupADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be True to actually remove the group. False (default) returns a safety prompt instead of removing anything. | |
| group_id | Yes | Bare group id or 'group.<id>' to remove. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full script entity ID to start, e.g. 'script.goodnight'. | |
| variables | No | Values passed as the script's input fields. Omit to run with no variables. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Full automation config replacing whatever is stored at `automation_id` (alias, triggers, conditions, actions, mode). Must contain 'alias' or 'trigger'/'triggers'. | |
| automation_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | MDI icon string, e.g. 'mdi:lightbulb-group'. Omit to leave it unset/unchanged. | |
| name | No | Friendly name for the group. Omit to leave it unset/unchanged. | |
| entities | No | 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). | |
| group_id | Yes | Bare group id (e.g. 'living_room_lights') — no 'group.' prefix. | |
| add_entities | No | Entity_ids to add to the existing member list. Do not combine with `entities`. | |
| all_entities | No | If True, the group's state is 'on' only when every member is on. False (default) does not clear an existing all:true. | |
| remove_entities | No | Entity_ids to remove from the existing member list. Do not combine with `entities`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Friendly name shown for the scene in the UI. | |
| entities | Yes | 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). | |
| scene_id | Yes | Scene id to create or overwrite, bare (e.g. 'movie_night') or prefixed ('scene.movie_night'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Full script config replacing whatever is stored at `script_id` (sequence, fields, alias, mode). Must contain at least 'alias' or 'sequence'. | |
| script_id | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full automation entity ID to run now, e.g. 'automation.morning_routine'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 HAARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| yaml_content | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 rulesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| yaml_content | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 blueprintADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Blueprint path relative to /config/blueprints/<domain>/ to delete, e.g. 'author/blueprint_name.yaml'. | |
| domain | No | Blueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'. | automation |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 URLARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | HTTP(S) URL to fetch the blueprint YAML from, e.g. a GitHub raw file link or a community forum export link. | |
| domain | No | Blueprint domain the fetched blueprint belongs to, 'automation' or 'script'. Defaults to 'automation'. | automation |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 blueprintsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Blueprint domain folder under /config/blueprints/ to list, 'automation' or 'script'. Defaults to 'automation'. | automation |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 fileADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Blueprint path relative to /config/blueprints/<domain>/, e.g. 'author/blueprint_name.yaml'. Typically the `suggested_filename` from `blueprints_import_blueprint`. | |
| domain | No | Blueprint domain folder to save under, 'automation' or 'script'. Defaults to 'automation'. | automation |
| overwrite | No | If True, replace an existing file at `path`. If False (default), Home Assistant refuses the save when a file already exists there. | |
| source_url | No | Origin URL to record as the blueprint's source_url metadata. Omit to save without one. | |
| yaml_content | Yes | Raw blueprint YAML text to persist, e.g. the `raw_data` field returned by `blueprints_import_blueprint`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 inputsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Blueprint path relative to /config/blueprints/<domain>/ to render, e.g. 'author/blueprint_name.yaml'. | |
| input | Yes | Input values keyed by the input name declared in the blueprint's own `input:` section. | |
| domain | No | Blueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'. | automation |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Event end as an ISO 8601 datetime, e.g. '2026-04-28T11:00:00'. | |
| start | Yes | Event start as an ISO 8601 datetime, e.g. '2026-04-28T10:00:00'. | |
| summary | Yes | Event title, e.g. 'Dentist appointment'. | |
| location | No | Optional event location text. Omit for none. | |
| entity_id | Yes | Calendar entity ID to add the event to, e.g. 'calendar.family'. | |
| description | No | Optional longer event description/notes. Omit for none. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 eventADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Event UID to delete, as returned by `calendar_list_events`. | |
| entity_id | Yes | Calendar entity ID the event belongs to, e.g. 'calendar.family'. | |
| recurrence_id | No | Narrows deletion to one instance of a recurring event. Omit to target the whole event/series. | |
| recurrence_range | No | Extends `recurrence_id` deletion to a range, e.g. 'THISANDFUTURE'. Omit for a single-instance deletion. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 calendarARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Range end as an ISO 8601 datetime, e.g. '2026-05-05T00:00:00'. | |
| start | Yes | Range start as an ISO 8601 datetime, e.g. '2026-04-28T00:00:00'. | |
| entity_id | Yes | Calendar entity ID, e.g. 'calendar.family', from `calendar_list_calendars`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 recipeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| recipe | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 snippetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| extra | No | Extra ContainerStyleData ({category: {prop: {value, unit}}}) merged in last, overriding the snippets. Omit for none. | |
| target | No | Style target key to wrap the result under, e.g. 'block' or 'state'. Defaults to 'block'. | block |
| container | No | Responsive container to wrap the result under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'. | desktop |
| snippet_names | Yes | Ordered list of snippet names from card_builder_list_style_snippets to merge, e.g. ['card_padded', 'vertical_stack']. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 upstreamARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the new card, e.g. 'AC Salon'. | |
| tags | No | Freeform tags for filtering in the Card Builder UI. Omit for no tags. | |
| author | No | Author name to store on the card. Empty string if omitted. | |
| config | Yes | Full DocumentData v3 block tree (version/rootId/slots/blocks). Build it with `card_builder_build_from_recipe` rather than hand-writing it. | |
| categories | No | Category labels (e.g. domain names) for the Card Builder UI. Omit for none. | |
| description | No | Free-text card description. Empty string if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | CSS custom property name, e.g. '--card-accent-color' (with the leading '--'). | |
| syntax | Yes | CSS @property syntax descriptor, e.g. '<color>' or '<length>'. | |
| inherits | No | Whether the property inherits from parent elements, per the CSS @property spec. Defaults to false. | |
| initial_value | Yes | Initial value matching `syntax`, e.g. '#2196f3' for a <color>. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | CSS-style configuration blob, shaped like a style category map (see card_builder_list_style_categories). | |
| name | Yes | Display name for the new preset, e.g. 'Dark Hero'. | |
| description | No | Free-text preset description. Empty string if omitted. | |
| extends_preset_id | No | Id of another style preset this one extends/inherits from. Omit for no inheritance. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 cardADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| card_id | Yes | Id of the card to delete, from card_builder_list_cards. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 propertyADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| custom_property_id | Yes | Id of the property to delete, from card_builder_list_css_custom_properties. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 fileADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path of the file to delete, relative to www/card_builder/ (see card_builder_list_media). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 presetADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| style_preset_id | Yes | Id of the preset to delete, from card_builder_list_style_presets. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 intentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | HA entity domain to weight the match toward, e.g. 'sensor'. Omit to infer from entity_id or match on keywords alone. | |
| intent | Yes | Free-text description of what the card should do, e.g. 'show battery level'. | |
| entity_id | No | Full entity id, e.g. 'sensor.battery'; used to infer domain when domain is omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 principlesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 schemaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| block_type | Yes | Block type id, e.g. 'block-slider', from card_builder_list_block_types. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 IDARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| card_id | Yes | Card id or card_id from card_builder_list_cards, e.g. a UUID string. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Template name, e.g. 'sensor_hero', from card_builder_list_card_templates. | |
| slot | No | Override the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 patternARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Pattern name, e.g. 'sensor_hero', from card_builder_list_design_patterns. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 snippetARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Snippet name, e.g. 'card_padded', from card_builder_list_style_snippets. | |
| target | No | Style target key to wrap the snippet under, e.g. 'block' or 'state'. Defaults to 'block'. | block |
| container | No | Responsive container to wrap the snippet under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'. | desktop |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 typesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Block category to filter to: basic, layout, entities, controls, advanced, or weather. Omit for every category. | |
| include_internal | No | If true, also list internal-only block types (e.g. block-drop-zone) that a recipe must not use directly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 IDsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | HA entity domain to filter to, e.g. 'climate' or 'cover'. Omit to list every domain's features. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 cardsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 templatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | HA entity domain to filter to, e.g. 'climate' or 'light'. Omit to list every template. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 propertiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 patternsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | HA entity domain to filter to, e.g. 'climate' or 'sensor'. Omit to list every pattern. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 filesARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Sub-folder relative to www/card_builder/ to list. Empty string lists the root. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 categoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 presetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 snippetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 typeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| block_type | Yes | Block type id, e.g. 'block-entity-field-state', from card_builder_list_block_types. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the new card, e.g. 'Battery Salon'. | |
| slot | No | Override the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default. | |
| tags | No | Replacement tag list. Omit to default to ['nexus-template', template]. | |
| template | Yes | Template name, e.g. 'sensor_hero', from card_builder_list_card_templates. | |
| categories | No | Replacement category list. Omit to default to the template's first domain, or 'tile' if it has none. | |
| description | No | Card description. Empty string uses the template's own description instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 guideARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| card_id | Yes | Id of the Card Builder card to render, from card_builder_list_cards. | |
| slot_actions | No | Per-instance overrides for the card's action slots. Omit to use the card's own defaults. | |
| slot_entities | No | Maps each slot id defined in the card to a HA entity_id, e.g. {'climate': 'climate.salon'}. Omit for no slot bindings. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 cardADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name. Omit to leave the current name unchanged. | |
| tags | No | Replacement tag list. Omit to leave tags unchanged. | |
| config | No | New DocumentData v3 block tree, replacing the whole config. Omit to keep the current config. | |
| card_id | Yes | Id of the card to update, from card_builder_list_cards. | |
| categories | No | Replacement category list. Omit to leave categories unchanged. | |
| description | No | New description text. Omit to leave it unchanged. | |
| skip_version_bump | No | If true, do not bump the card's stored version counter for this change. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 presetADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Replacement CSS-style configuration blob. Omit to leave the current data unchanged. | |
| name | No | New display name. Omit to leave the current name unchanged. | |
| description | No | New description text. Omit to leave it unchanged. | |
| style_preset_id | Yes | Id of the preset to update, from card_builder_list_style_presets. | |
| extends_preset_id | No | Replacement parent preset id to inherit from. Omit to leave inheritance unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 URLADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | http(s) URL of the image to download, e.g. 'https://example.com/bg.png'. | |
| path | No | Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root. | |
| filename | No | Target filename to store as. Omit to derive one from the URL's last path segment. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 libraryADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root. | |
| filename | Yes | Bare target filename with an allowed image/SVG extension, e.g. 'bg-1.png'. No path separators. | |
| content_base64 | Yes | Raw file bytes, base64-encoded. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 mediaADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root. | |
| filename | No | Target filename to store as. Omit to reuse local_path's own filename. | |
| local_path | Yes | Absolute or relative path to the source file; must resolve under <config>/www or <config>/media. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 mediaADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root. | |
| filename | Yes | Bare target filename, e.g. 'gradient-bg'. '.svg' is appended if missing. | |
| svg_content | Yes | Raw SVG markup, starting with '<svg' or '<?xml ...'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | DocumentData config to check, as produced by card_builder_build_from_recipe or returned by card_builder_get_card. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| position | No | Zero-based index within the section to insert at. Omit to append at the end. | |
| url_path | Yes | Dashboard url_path, or a view path in the default dashboard (e.g. 'living-room'). | |
| view_index | No | Zero-based view index; needed only when url_path names a dashboard rather than a view path. | |
| card_config | Yes | Lovelace card config with a 'type' key, e.g. {'type': 'tile', 'entity': 'sensor.power'}. | |
| section_index | Yes | Zero-based target section index, from dashboards_get_view_sections. | |
| expected_config_hash | No | Optional 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url_path | Yes | Dashboard url_path (not a view path), from dashboards_list_dashboards. | |
| view_index | Yes | Zero-based index of the target view within the dashboard's 'views' list. | |
| card_config | Yes | Lovelace card config, e.g. {'type': 'entities', 'entities': ['light.living_room']}. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Resource URL, e.g. '/local/my-card.js' or '/hacsfiles/mini-graph-card/mini-graph-card-bundle.js'. | |
| resource_type | No | Resource kind: 'module' (ES module JS), 'js' (legacy script), or 'css'. Defaults to 'module'. | module |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| position | No | Zero-based index within the view to insert the section at. Omit to append at the end. | |
| url_path | Yes | Dashboard url_path, or a view path in the default dashboard (e.g. 'living-room'). | |
| view_index | No | Zero-based view index; needed only when url_path names a dashboard rather than a view path. | |
| section_config | No | Section body, e.g. {'cards': [{'type': 'heading', 'heading': 'Living Room'}]}. Omit for an empty grid section. | |
| expected_config_hash | No | Optional 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url_path | Yes | Dashboard url_path to add the view to, from dashboards_list_dashboards. | |
| view_config | Yes | Lovelace view config, e.g. {'title': 'Bedroom', 'icon': 'mdi:bed', 'cards': []}. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url_path | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 resourcesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 viewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url_path | No | Dashboard 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_index | No | Zero-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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 dashboardsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 sectionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url_path | Yes | Dashboard url_path, or a view path in the default dashboard (e.g. 'living-room'). | |
| card_index | Yes | Zero-based card index within the section, from dashboards_get_view_sections/inspection. | |
| view_index | No | Zero-based view index; needed only when url_path names a dashboard rather than a view path. | |
| section_index | Yes | Zero-based section index, from dashboards_get_view_sections. | |
| expected_config_hash | No | Optional 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 resourceADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to actually remove the resource; false (the default) returns a confirmation prompt instead. | |
| resource_id | Yes | Numeric resource id, from dashboards_get_dashboard_resources. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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": ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | 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. | |
| url_path | No | Dashboard url_path to save, from dashboards_list_dashboards. Omit for the default dashboard. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 viewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | Browser zoom factor applied by the engine. Defaults to 1.0 (no zoom). | |
| width | No | Viewport width in pixels. Defaults to 1280. | |
| height | No | Viewport height in pixels. Ignored when full_page=True. Defaults to 800. | |
| wait_ms | No | Settle time in milliseconds after page load before capturing — increase for heavy chart cards. Defaults to 2500. | |
| url_path | No | 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. | |
| full_page | No | If true, use a fixed 4096px-tall viewport instead of height, approximating a full-scroll capture. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 sectionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| merge | No | If true (default), merge card_config's keys into the existing card. If false, replace the card wholesale. | |
| url_path | Yes | Dashboard url_path, or a view path in the default dashboard (e.g. 'living-room'). | |
| card_index | Yes | Zero-based card index within the section, from dashboards_get_view_sections/inspection. | |
| view_index | No | Zero-based view index; needed only when url_path names a dashboard rather than a view path. | |
| card_config | Yes | Card 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_index | Yes | Zero-based section index, from dashboards_get_view_sections. | |
| expected_config_hash | No | Optional 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 resourceADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | New resource URL, replacing the current one. | |
| resource_id | Yes | Numeric resource id to update, from dashboards_get_dashboard_resources. | |
| resource_type | No | Resource kind: 'module' (ES module JS), 'js' (legacy script), or 'css'. Defaults to 'module'. | module |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 areaARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| area_id | Yes | Area registry ID to filter by; obtain it from areas_list_areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entryADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes | Device registry ID to remove; obtain it from devices_list_devices. | |
| config_entry_id | Yes | Config entry ID the device is attached to; the device is detached only from this entry. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entryADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| area_id | No | Area registry ID to assign the device to, from areas_list_areas; omit to leave the current area unchanged. | |
| device_id | Yes | Device registry ID to update; obtain it from devices_list_devices. | |
| disabled_by | No | 'user' disables the device and its entities, '' (empty string) re-enables it; omit to leave the disabled state unchanged. | |
| name_by_user | No | New user-facing name override for the device; omit to leave the current name unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 toolARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full tool name including namespace, e.g. 'entities_get_entity', from `discover_tool_search`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 namespacesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 indexARead-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>}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
discover_tool_searchSearch the tool catalogueARead-onlyIdempotent
Fuzzy search the Nexus tool catalogue by name and description.
Scores every mounted tool's name + description against query with a
BM25-lite ranking (term frequency/inverse document frequency plus a
small boost when a query word appears in the tool name itself) and
returns the top top_k matches.
Use when: finding the right tool name before calling it, instead of
keeping the whole tool surface in working memory.
Not for: a single tool's full documentation once you have its name —
use discover_get_tool_doc.
Returns: list of {"name", "namespace", "summary", "score", "access"}
dicts, highest score first; empty list if nothing scores above zero.
access is "read", "write" or "destructive" (ADR-0002/0003
annotation class).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Free-text search query, e.g. 'turn on light' or 'backup'. | |
| top_k | No | Maximum number of ranked hits to return, e.g. 10. | |
| namespace | No | Restrict results to one namespace, e.g. 'card_builder'. Omit to search every namespace. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly/idempotent safety profile (lowering the bar), but the description goes beyond by disclosing the ranking algorithm (BM25-lite with name boost), the return shape including `access` class based on ADR annotations, and empty-list behavior when no match scores above zero. This is rich behavioral context an agent needs to interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with core purpose, then algorithm detail, then usage routing, then return format. Each sentence adds distinct value; no filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, a complete input schema, and an output schema present, the description still discloses the ranking method, the exact return fields, and the empty-list case, fully equipping the agent to call and interpret the tool. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all three params, so the schema already documents query, top_k, and namespace. The description references `query` and `top_k` in prose but does not add syntax or format meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Fuzzy search the Nexus tool catalogue by name and description') and distinguishes from sibling discover_get_tool_doc by naming it. An agent can determine exactly which discover_* tool to use 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use when: finding the right tool name before calling it' and 'Not for: a single tool's full documentation once you have its name — use `discover_get_tool_doc`.' Both positive selection and exclusion with 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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stat_energy_to | Yes | Statistic/entity ID of the battery charge (energy in) sensor to add, e.g. 'sensor.battery_charge'. | |
| stat_energy_from | Yes | Statistic/entity ID of the battery discharge (energy out) sensor to add, e.g. 'sensor.battery_discharge'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stat_cost | No | 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. | |
| stat_energy_from | Yes | Statistic/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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stat_energy_to | Yes | Statistic/entity ID of the grid-export energy sensor to add, e.g. 'sensor.solar_export'. Discover candidates with `statistics_list_statistic_ids`. | |
| stat_compensation | No | Optional statistic/entity ID of the matching compensation/cost sensor for this export flow. Omit if no compensation sensor should be linked. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stat_energy_from | Yes | Statistic/entity ID of the solar production sensor to add, e.g. 'sensor.solar_production'. Discover candidates with `statistics_list_statistic_ids`. | |
| config_entry_solar_forecast | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 infoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 preferencesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 sourceADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stat_energy_from | Yes | Statistic/entity ID identifying the source to remove, as originally passed to one of the `energy_add_*` tools, e.g. 'sensor.solar_production'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 listsADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | 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. | |
| energy_sources | No | 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. | |
| energy_per_unit | No | 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. | |
| device_consumption | No | Full 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configurationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 areaADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| area_id | Yes | Area registry ID to assign the entity to, replacing any current area. | |
| entity_id | Yes | Full entity ID to reassign, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Service to call per domain group: 'turn_on', 'turn_off' or 'toggle'. | |
| entity_ids | Yes | Full entity IDs to act on, e.g. ['light.a', 'light.b']. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 exposureAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| assistants | No | Subset of voice assistants to target. Omit to apply to conversation, cloud.alexa and cloud.google_assistant. | |
| entity_ids | Yes | Full entity IDs to expose or hide, e.g. ['light.a', 'light.b']. | |
| should_expose | Yes | True to expose the entities to the target assistants, false to hide them. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 statesAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes | List of {entity_id, state, attributes?} dicts describing the virtual state to write per entity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 registryAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full entity ID to disable, e.g. 'sensor.old_device'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 registryAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full entity ID to re-enable, e.g. 'sensor.old_device'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 stateARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full entity ID to read, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 exposureARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full entity ID to query exposure for, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 filtersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of entities to return after filtering, for pagination. Omit for no limit. | |
| domain | No | Entity domain prefix filter, e.g. 'light' or 'sensor'. Omit to include every domain. | |
| fields | No | Per-entity keys to return. Defaults to entity_id, state, friendly_name. Also accepts attributes, area_id, device_id, labels. | |
| offset | No | Number of filtered entities to skip before applying limit. 0 starts from the first match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Entity domain prefix filter, e.g. 'light' or 'sensor'. Omit to include every domain. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 assistantARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| assistant | Yes | Voice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 optionAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| option | Yes | Option string to select; must match one of the entity's configured options. | |
| entity_id | Yes | Full entity ID to set, e.g. 'input_select.house_mode'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 exposureAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| assistant | Yes | Voice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'. | |
| entity_id | Yes | Full entity ID to expose or hide, e.g. 'light.kitchen'. | |
| should_expose | Yes | True to expose the entity to the assistant, false to hide it. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 valueAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Numeric value to write; interpreted per domain, see Behaviour. | |
| entity_id | Yes | Full entity ID to set, e.g. 'input_number.target_temp'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full entity ID to toggle, e.g. 'switch.fan'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entityAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full entity ID to turn off, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entityAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full entity ID to turn on, e.g. 'light.kitchen'. | |
| rgb_color | No | Light RGB color as [r, g, b], each 0-255, light-only option. | |
| brightness | No | Light brightness, 0-255. Light-only; passing it for a non-light entity returns an error. | |
| color_temp | No | Deprecated mired color temperature, light-only. Converted to Kelvin before the call; prefer color_temp_kelvin. | |
| color_temp_kelvin | No | Light color temperature in Kelvin, light-only option. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 registryADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New display name to store in the entity registry, replacing the current one. | |
| entity_id | Yes | Full entity ID whose registry entry is renamed, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entriesADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. | |
| timeout | No | 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. | |
| log_lines | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 firmwareAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. | |
| timeout | No | Maximum seconds to wait for the compile process to finish, e.g. 180. | |
| log_lines | No | Number of trailing build-log lines to return, e.g. 200. | |
| only_generate | No | If true, only generate the C++ source and skip the platform build. Set false for a full firmware build. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 outputARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Number of trailing log lines to return, e.g. 150. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. Discover names with `esphome_list_devices`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| device_name | Yes | Device name as used in HA, e.g. 'Kitchen Sensor' or 'kitchen_sensor' (matched case-insensitively against a slugified form). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 devicesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pageADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | LVGL page ID to add the widget to, from `esphome_lvgl_get_pages`. | |
| properties | Yes | Widget properties, e.g. {'id': ..., 'x': ..., 'y': ..., 'width': ..., 'height': ..., 'text': ..., 'value': ..., 'styles': ...}. | |
| device_name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'. | |
| widget_type | Yes | LVGL widget type, e.g. 'label', 'button', 'slider', 'arc', 'switch', 'spinbox', 'img', 'line', 'meter'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pageADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | LVGL page ID the widget belongs to, from `esphome_lvgl_get_pages`. | |
| widget_id | Yes | Widget `id` to delete, from `esphome_lvgl_get_page_widgets`. | |
| device_name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pagesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| device_name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | LVGL page ID to inspect, from `esphome_lvgl_get_pages`. | |
| device_name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 stylesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| device_name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 supportARead-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": [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 structureARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| device_name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 reachabilityARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 deviceADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. | |
| port | No | 'OTA' for wireless flash (default) or a serial device path, e.g. '/dev/ttyUSB0', for a wired flash. | OTA |
| confirm | No | 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. | |
| timeout | No | Maximum seconds to wait for the upload to finish, e.g. 240. | |
| log_lines | No | Number of trailing upload-log lines to return, e.g. 200. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. | |
| timeout | No | Maximum seconds to wait for the validation result, e.g. 60. | |
| log_lines | No | Number of trailing log lines to return, e.g. 200. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. If the file already exists, its entire content is replaced. | |
| content | Yes | Full YAML document to write, replacing the file's current content. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Text appended after a newline to the file's existing content. | |
| relative_path | Yes | 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/. | |
| validate_yaml | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 fileADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | 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. | |
| relative_path | Yes | 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/. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 filesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| subdirectory | No | Subdirectory relative to the HA config root to list, e.g. 'packages'. Omit (default '') to list from the config root. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| relative_path | Yes | 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/. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 syntaxARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | YAML text to check for syntax errors; nothing is written or read from disk. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 fileADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Full text to write as the file's new content, replacing whatever was there before. | |
| relative_path | Yes | 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/. | |
| validate_yaml | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 branchADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| branch_name | Yes | Name of an existing git branch to switch the config repository to. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Commit message describing this checkpoint or change. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| branch_name | Yes | Name of the new git branch to create, e.g. 'automation-refactor'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 diffARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sha | No | Commit SHA or ref to show a stat summary for, e.g. 'a1b2c3d'. Omit to show the unstaged diff instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 repositoryAIdempotent
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": ...}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 branchesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 commitsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of commits to return, most recent first. Defaults to 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 historyADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sha | No | Commit SHA or ref to restore the file from. Defaults to 'HEAD', which discards uncommitted changes to this file. | HEAD |
| confirm | No | Must be True to actually restore the file. False (default) returns a safety prompt describing what would happen instead of touching anything. | |
| relative_path | Yes | Path to the file relative to the HA config directory to restore, e.g. 'automations.yaml'. Must resolve inside /config after following symlinks. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 commitADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sha | Yes | Commit SHA or ref to hard-reset the entire config directory to. | |
| confirm | No | Must be True to actually perform the reset. False (default) returns a safety prompt naming the current HEAD instead of touching anything. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 checkpointAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Full text to write as the file's new content, replacing whatever was there before. | |
| relative_path | Yes | 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`. | |
| commit_message | No | Commit message for the new-content commit. Omit to use a default 'chore: update <relative_path>' message. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 repositoryAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full URL of the repository to register with HACS, e.g. a GitHub repo URL. | |
| category | Yes | HACS category for the repository: integration, plugin, theme, template, appdaemon or python_script. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo_id | Yes | HACS repository id, e.g. from `hacs_list_hacs_repositories`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 repositoryAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo_id | Yes | HACS repository id to install, e.g. from `hacs_list_hacs_repositories`. | |
| version | No | Specific version/tag to pin. Omit to install the latest available version. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 upgradesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 repositoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter to one HACS category: integration, plugin, theme, template, appdaemon or python_script. Omit to list every category. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 repositoryADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo_id | Yes | HACS repository id to uninstall, e.g. from `hacs_list_hacs_repositories`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 repositoryADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo_id | Yes | HACS repository id to update, e.g. from `hacs_list_hacs_repositories`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 helperAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full timer entity ID to cancel, e.g. 'timer.laundry'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full counter entity ID to increment, e.g. 'counter.visits'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 helperAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full counter entity ID to reset, e.g. 'counter.visits'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 valueAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Target boolean value; true calls turn_on, false calls turn_off. | |
| entity_id | Yes | Full input_boolean entity ID to set, e.g. 'input_boolean.guest_mode'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 valueAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date to set, formatted YYYY-MM-DD. Omit to leave the date unchanged. | |
| time | No | Time to set, formatted HH:MM:SS. Omit to leave the time unchanged. | |
| datetime | No | Combined date and time, formatted 'YYYY-MM-DD HH:MM:SS'. Takes precedence over date/time when given. | |
| entity_id | Yes | Full input_datetime entity ID to set, e.g. 'input_datetime.reminder'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 valueAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Target numeric value to write to the input_number. | |
| entity_id | Yes | Full input_number entity ID to set, e.g. 'input_number.target_temp'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 optionAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| option | Yes | Option string to select; must match one of the input_select's configured options. | |
| entity_id | Yes | Full input_select entity ID to set, e.g. 'input_select.house_mode'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 valueAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Target text value to write to the input_text. | |
| entity_id | Yes | Full input_text entity ID to set, e.g. 'input_text.last_visitor'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 helperAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Duration to run for, formatted HH:MM:SS or a plain number of seconds. Omit to reuse the timer's configured duration. | |
| entity_id | Yes | Full timer entity ID to start, e.g. 'timer.laundry'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 logARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configurationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | How many hours back from now to fetch, e.g. 24 for one day. Default 24. | |
| entity_id | No | Full entity ID to filter to, e.g. 'light.kitchen'. Omit to return logbook entries for every entity. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 historyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | How many hours back from now to fetch, e.g. 24 for one day. Default 24. | |
| entity_id | Yes | Full entity ID to fetch history for, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 livenessARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 flowAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | Yes | Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 flowAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | Yes | Flow id from `integrations_start_options_flow`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entryAIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | Config entry ID to disable, from `system_list_integrations` or `system_get_all_integrations`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entryAIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | Config entry ID to re-enable, from `system_list_integrations` or `system_get_all_integrations`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 stateARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | Yes | Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 domainsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 flowsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entryADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set true to actually remove the integration. False (default) performs no action and instead returns a confirmation prompt. | |
| entry_id | Yes | Config entry ID to remove, from `system_list_integrations` or `system_get_all_integrations`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| handler | Yes | Integration domain to configure, e.g. 'shelly'; from `integrations_list_flow_handlers`. | |
| show_advanced_options | No | Whether to include the integration's advanced-options fields in the returned form. False (default) hides them. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | Config entry ID to edit, from `system_list_integrations` or `system_get_all_integrations`. | |
| show_advanced_options | No | Whether to include the integration's advanced-options fields in the returned form. False (default) hides them. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 stepADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | Yes | Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`. | |
| user_input | Yes | Answers for the current step, matching the fields in the flow's `data_schema` (e.g. host, API key, chosen device). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 stepADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | Yes | Flow id from `integrations_start_options_flow`. | |
| user_input | Yes | Answers for the current step, matching the fields in the flow's `data_schema`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 propertiesADestructiveIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New display title for the entry. Omit to leave the current title unchanged. | |
| entry_id | Yes | Config entry ID to update, from `system_list_integrations` or `system_get_all_integrations`. | |
| pref_disable_polling | No | Whether HA should skip polling for this integration's entities. Omit to leave the current preference unchanged. | |
| pref_disable_new_entities | No | Whether newly discovered entities from this integration should start disabled. Omit to leave the current preference unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 deviceAIdempotent
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>"}.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | Label registry ID to assign; obtain it from labels_list_labels. | |
| device_id | Yes | Device registry ID to tag; obtain it from devices_list_devices. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entityAIdempotent
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>"}.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | Label registry ID to assign; obtain it from labels_list_labels. | |
| entity_id | Yes | Entity ID to tag, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional mdi icon identifier, e.g. 'mdi:tag'; omit for no icon. | |
| name | Yes | Display name for the new category. | |
| scope | Yes | Registry scope the new category belongs to, e.g. 'automation'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional mdi icon identifier, e.g. 'mdi:alert'; omit for no icon. | |
| name | Yes | Display name for the new label, e.g. 'Battery Low'. | |
| color | No | Optional label color name recognised by the frontend, e.g. 'red'; omit for no color. | |
| description | No | Optional free-text description of the label's purpose; omit for none. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 categoryADestructiveIdempotent
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>"}.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | Yes | Registry scope the category belongs to, e.g. 'automation'. | |
| category_id | Yes | Category registry ID to delete; obtain it from labels_list_categories. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 labelADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | Label registry ID to delete; obtain it from labels_list_labels. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 categoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Registry scope the categories belong to, e.g. 'automation'; defaults to 'automation'. | automation |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 labelARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | Label registry ID to filter by; obtain it from labels_list_labels. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 labelARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | Label registry ID to filter by; obtain it from labels_list_labels. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 labelsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 deviceAIdempotent
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>"}.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | Label registry ID to remove; obtain it from labels_list_labels. | |
| device_id | Yes | Device registry ID to untag; obtain it from devices_list_devices. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entityAIdempotent
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>"}.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | Label registry ID to remove; obtain it from labels_list_labels. | |
| entity_id | Yes | Entity ID to untag, e.g. 'light.kitchen'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 categoryADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | New mdi icon identifier; omit to leave the current icon unchanged. | |
| name | No | New display name; omit to leave the current name unchanged. | |
| scope | Yes | Registry scope the category belongs to, e.g. 'automation'. | |
| category_id | Yes | Category registry ID to update; obtain it from labels_list_categories. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 labelADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | New mdi icon identifier, e.g. 'mdi:alert'; omit to leave the current icon unchanged. | |
| name | No | New display name; omit to leave the current name unchanged. | |
| color | No | New label color name; omit to leave the current color unchanged. | |
| label_id | Yes | Label registry ID to update; obtain it from labels_list_labels. | |
| description | No | New free-text description; omit to leave the current description unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_deep_searchSearch entities, devices and areasARead-onlyIdempotent
Fuzzy-search entities, devices and areas together in one ranked list.
Scores states (tagging automation.* entities as kind 'automation',
others as 'entity'), devices and areas against query the same way as
the single-kind search tools, merges all matches, and returns the top
limit sorted descending.
Use when: you don't know whether what you're looking for is an entity,
device or area.
Not for: results scoped to one kind — use search_search_entities,
search_search_devices or search_search_areas.
Returns: list of dicts tagged with kind ('entity'/'automation'/
'device'/'area'), each with kind-specific fields plus score, up to
limit entries.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of ranked results to return; defaults to 20. | |
| query | Yes | Search text to fuzzy-match across entities, devices and areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description adds real behavioral detail beyond them: it explains the scoring/merging algorithm, the 'automation' vs 'entity' kind classification, and the descending sort — useful context an agent couldn't derive from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then algorithm, then Use/Not-for routing, then return shape. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param search tool with annotations and an output schema, this is complete: selection guidance, algorithmic behavior, kind tagging and return shape are all present, so an agent can call it correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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: `query` is fuzzy-matched across all three resource kinds, and `limit` caps the ranked list after merge/sort rather than per-kind. That is more than the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fuzzy-search) plus the exact resources (entities, devices, areas) and the distinguishing behavior (single ranked merged list). This clearly separates it from the single-kind search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use when' clause gives the selecting condition (unknown whether the target is an entity, device or area), and 'Not for' names the three alternatives (search_search_entities/devices/areas) for the single-kind case. 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_find_orphan_devicesFind orphan devicesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 areasARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of ranked results to return; defaults to 20. | |
| query | Yes | Search text to fuzzy-match against area names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 devicesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of ranked results to return; defaults to 20. | |
| query | Yes | Search text to fuzzy-match against a device's name, name_by_user, manufacturer and model. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of ranked results to return; defaults to 20. | |
| query | Yes | Search text to fuzzy-match against entity_id, friendly_name and device_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 actionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Service data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data. | |
| domain | Yes | Service domain to call, e.g. 'light' or 'climate'. | |
| confirm | No | 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. | |
| service | Yes | Service name within the domain, e.g. 'turn_on' or 'set_temperature'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 clipADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Recording length in seconds. | |
| filename | Yes | Destination path inside the HA config directory, e.g. '/config/www/snapshots/clip.mp4'. Overwrites any existing file there. | |
| entity_id | Yes | Full camera entity ID to record, e.g. 'camera.front_door'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 snapshotADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Destination path inside the HA config directory, e.g. '/config/www/snapshots/front.jpg'. Overwrites any existing file there. | |
| entity_id | Yes | Full camera entity ID to capture, e.g. 'camera.front_door'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 eventADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_data | No | Event data payload delivered to listeners. Omit for no payload. | |
| event_type | Yes | Event type to fire, e.g. 'my_custom_event'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 servicesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Service domain filter, e.g. 'light'. Omit to list every domain. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full media_player entity ID to control, e.g. 'media_player.living_room'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 positionAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| position | Yes | Target playback position in seconds from the start of the current media. | |
| entity_id | Yes | Full media_player entity ID to seek, e.g. 'media_player.living_room'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional notification title. Omit for no title. | |
| message | Yes | Notification body text to show in the HA UI. | |
| notification_id | No | Stable ID for later dismissal via services_notify_persistent_dismiss. Omit to create a new, unaddressable notification each call. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 notificationAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| notification_id | Yes | ID of the persistent notification to dismiss, as passed to services_notify_persistent_create. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 notificationsAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full button entity ID to press, e.g. 'button.restart_service'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 configurationAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to reload, e.g. 'automation', 'script' or 'scene'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 templateARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| template | Yes | Jinja2 template string to render, e.g. '{{ states("sensor.temp") }}'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Optional notification title. Omit for no title. | |
| target | No | Notify service to use, e.g. 'mobile_app_phone' or 'notify.mobile_app_phone'. Omit to use the default 'notify' service. | |
| message | Yes | Notification body text to deliver. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 modeAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full climate entity ID to change, e.g. 'climate.living_room'. | |
| hvac_mode | Yes | Target mode: one of heat, cool, auto, off, fan_only, dry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 positionAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| position | Yes | Target position, 0 (closed) to 100 (open). | |
| entity_id | Yes | Full cover entity ID to move, e.g. 'cover.living_room_blind'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 positionAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full cover entity ID to tilt, e.g. 'cover.living_room_blind'. | |
| tilt_position | Yes | Target tilt position, 0 (closed) to 100 (open). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 brightnessAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Full light entity ID to change, e.g. 'light.kitchen'. | |
| rgb_color | No | Target RGB color as [r, g, b], each 0-255. Omit to leave color unchanged. | |
| brightness | No | Target brightness, 0-255. Omit to leave brightness unchanged. | |
| color_temp | No | Deprecated mired color temperature. Converted to Kelvin; prefer color_temp_kelvin. | |
| color_temp_kelvin | No | Target color temperature in Kelvin. Omit to leave it unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 volumeAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| volume | Yes | Target volume level, 0.0 (silent) to 1.0 (maximum). | |
| entity_id | Yes | Full media_player entity ID to change, e.g. 'media_player.living_room'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 snapshotARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| area_id | Yes | Area registry ID to scope the snapshot to; states, devices and entities outside this area are excluded. | |
| summary | No | If true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 snapshotARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of states to return after filtering, for pagination on large setups. Omit for no limit. | |
| offset | No | Number of filtered states to skip before applying limit, for pagination. 0 starts from the first matching state. | |
| area_id | No | Area registry ID; keeps only states/devices/entities assigned to this area, directly or via their device. Omit for no area filter. | |
| domains | No | Entity domain filter applied to the states/entities sections, e.g. ['light', 'climate']. Omit to include every domain. | |
| include | No | Sections to return. Omit for the default states/areas/devices/entities/integrations set. Valid values: states, areas, floors, devices, entities, integrations, config. | |
| summary | No | If true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes; ignored when state_fields is given. | |
| state_fields | No | Explicit 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 daysARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days back from now to include, between 1 and 365. | |
| period | No | Aggregation bucket size passed to the underlying statistics query, e.g. 'day', 'week', 'month'. | day |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 rangeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End of the range, same formats as `start`. Omit to use the current time. | |
| start | Yes | Start of the range: a date ('2024-01-01') or datetime ('2024-01-01T00:00:00'). | |
| types | No | Which aggregates to include per bucket, any of 'sum', 'mean', 'min', 'max', 'state', 'change'. Omit to use ['sum', 'mean', 'min', 'max']. | |
| period | No | Aggregation bucket size: one of '5minute', 'hour', 'day', 'week', 'month'. | day |
| statistic_ids | Yes | Entity or statistic IDs to fetch, e.g. ['sensor.energy_consumption']. Discover valid values with `statistics_list_statistic_ids`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 metadataARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| statistic_ids | Yes | Statistic IDs to fetch metadata for, e.g. ['sensor.energy_consumption']. Discover valid values with `statistics_list_statistic_ids`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 IDsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| statistic_type | No | Which kind of statistic to list: 'sum' for counters (energy, gas, water) or 'mean' for sensors (temperature, humidity). | sum |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable name to store on the new backup. | |
| addons | No | Add-on slugs to include for a partial backup. Omit together with `folders` for a full backup of everything. | |
| folders | No | 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. | |
| password | No | Password to encrypt the backup with. Omit for an unencrypted backup. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 backupADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Backup slug to delete, from `supervisor_list_backups`. | |
| confirm | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug, e.g. from `supervisor_list_addons`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 linesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug to fetch logs for, e.g. from `supervisor_list_addons`. | |
| lines | No | Maximum number of most-recent log lines to return. 100 by default; 0 or negative returns the full fetched log text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 statsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug to fetch stats for, e.g. from `supervisor_list_addons`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 infoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 infoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 infoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-onAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-onsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 backupsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-onADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug to restart, e.g. from `supervisor_list_addons`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 CoreADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set true to actually restart Core. False (default) performs no action. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 hostADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set true to actually reboot the host. False (default) performs no action. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 backupADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Backup slug to restore, from `supervisor_list_backups`. | |
| confirm | No | Set true to actually restore the backup. False (default) performs no action. | |
| password | No | Password for an encrypted backup. Omit for an unencrypted one. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 optionsADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug whose options to set, e.g. from `supervisor_list_addons`. | |
| options | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-onAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug to start, e.g. from `supervisor_list_addons`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-onADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug to stop, e.g. from `supervisor_list_addons`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-onADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug to uninstall, e.g. from `supervisor_list_addons`. | |
| confirm | No | Set true to actually uninstall the add-on and its data. False (default) performs no action. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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-onADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Add-on slug to update, e.g. from `supervisor_list_addons`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configurationARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 backupADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 compactlyARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 issuesARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 checksARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 updatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| pending_only | No | If true (default), return only components with an update available. Set false to also include up-to-date components. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 reachabilityARead-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>}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 configurationAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 entryAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | Config entry ID to reload, from `system_list_integrations` or `system_get_all_integrations`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 AssistantADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set true to actually restart HA. False (default) performs no restart and instead returns a confirmation prompt. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AssistantADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Set true to actually stop HA. False (default) performs no action and instead returns a confirmation prompt. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 fileADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Theme name, becomes the filename themes/<name>.yaml without the extension. | |
| reload | No | If true, calls frontend.reload_themes after writing the file; defaults to true. | |
| overwrite | No | If true, replaces an existing theme file instead of failing; defaults to false. | |
| variables | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 fileADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Theme name to delete; obtain it from themes_list_themes or themes_list_theme_files. | |
| reload | No | If true, calls frontend.reload_themes after deleting the file; defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 variablesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Theme name to look up, matching a key in themes_list_themes' `themes` map. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 diskARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 themesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 diskAIdempotent
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'.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 themeAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Optional 'light' or 'dark' to also pin the color mode; any other value is ignored; omit to leave the mode as-is. | |
| name | No | Registered theme name to activate, e.g. 'default' or a custom theme name; defaults to 'default'. | default |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 fileADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Theme name to update; obtain it from themes_list_themes or themes_list_theme_files. | |
| merge | No | If true, shallow-merges variables into the existing top-level keys; if false, replaces the whole variable set; defaults to true. | |
| reload | No | If true, calls frontend.reload_themes after writing the file; defaults to true. | |
| variables | Yes | Variable map to apply; merged into or replacing the existing set depending on `merge`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | Item text, e.g. 'Buy milk'. | |
| due_date | No | Optional due date ('YYYY-MM-DD') or datetime ISO string. Omit for no due date. | |
| entity_id | Yes | Todo list entity ID to add the item to, e.g. 'todo.shopping_list'. | |
| description | No | Optional longer item description/notes. Omit for none. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 listARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Client-side status filter: 'needs_action', 'completed', or 'all' for no filter. | needs_action |
| entity_id | Yes | Todo list entity ID, e.g. 'todo.shopping_list', from `todo_list_todo_lists`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 entitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 itemADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Item UID to remove, as returned by `todo_list_items`. | |
| entity_id | Yes | Todo list entity ID the item belongs to, e.g. 'todo.shopping_list'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 itemADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Item UID to update, as returned by `todo_list_items`. | |
| item | No | New item text. Omit to keep the current text. | |
| status | No | New status: 'needs_action' or 'completed'. Omit to keep the current status. | |
| entity_id | Yes | Todo list entity ID the item belongs to, e.g. 'todo.shopping_list'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the new pipeline, e.g. 'Kitchen Assist'. | |
| language | No | Overall pipeline language code, e.g. 'en' or 'pl'. | en |
| tts_voice | No | Voice ID for the TTS engine. Omit to use its default voice. | |
| stt_engine | No | 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`. | |
| tts_engine | No | Entity ID of the text-to-speech engine, e.g. 'tts.piper'. Omit for no TTS. Discover installed ones with `voice_list_tts_engines`. | |
| stt_language | No | Language code for the STT engine. Omit to use its default. | |
| tts_language | No | Language code for the TTS engine. Omit to use its default. | |
| wake_word_id | No | Specific wake word model ID within `wake_word_entity`. Omit for its default. | |
| wake_word_entity | No | 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`. | |
| conversation_engine | No | Entity ID of the conversation agent, e.g. 'homeassistant' for the built-in agent. | homeassistant |
| conversation_language | No | Language code for the conversation agent, e.g. 'en' or 'pl'. | en |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pipelineADestructiveIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline_id | Yes | ID of the pipeline to delete, from `voice_list_pipelines`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pipelineARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline_id | No | Pipeline ID to fetch, from `voice_list_pipelines`. Omit to return the current preferred pipeline instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 agentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pipelinesARead-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>"}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 enginesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 enginesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 enginesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 pipelineAIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline_id | Yes | ID of the pipeline to make preferred, from `voice_list_pipelines`. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 pipelineADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name. Omit to keep the current name. | |
| language | No | New overall pipeline language code. Omit to keep the current one. | |
| tts_voice | No | New TTS voice ID. Omit to keep the current one. | |
| stt_engine | No | New STT engine entity ID. Omit to keep the current one. | |
| tts_engine | No | New TTS engine entity ID. Omit to keep the current one. | |
| pipeline_id | Yes | ID of the pipeline to update, from `voice_list_pipelines`. | |
| stt_language | No | New STT language code. Omit to keep the current one. | |
| tts_language | No | New TTS language code. Omit to keep the current one. | |
| wake_word_id | No | New wake word model ID. Omit to keep the current one. | |
| wake_word_entity | No | New wake-word detector entity ID. Omit to keep the current one. | |
| conversation_engine | No | New conversation agent entity ID. Omit to keep the current one. | |
| conversation_language | No | New conversation language code. Omit to keep the current one. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 responseADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Service data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data. | |
| domain | Yes | Service domain to call, e.g. 'weather' or 'calendar'. | |
| service | Yes | Service name within the domain, e.g. 'get_forecasts' or 'get_events'. | |
| timeout | No | Maximum seconds to wait for the WebSocket handshake and the result message before giving up; must be between 1 and 300. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 WebSocketARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Maximum seconds to wait for the WebSocket handshake and the result message before raising an error; must be between 1 and 300. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 WebSocketARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Maximum seconds to wait for the WebSocket handshake and the result message before raising an error; must be between 1 and 300. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 typeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Maximum number of events to collect before returning early. | |
| timeout | No | Maximum seconds to wait for `count` events before returning what arrived; must be between 1 and 300. | |
| event_type | Yes | HA event type to subscribe to, e.g. 'zha_event' or 'call_service'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 changesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Maximum number of matching events to collect before returning early. | |
| timeout | No | Maximum seconds to wait for `count` matching events before returning what arrived; must be between 1 and 300. | |
| entity_id | Yes | Full entity ID to watch for state changes, e.g. 'binary_sensor.motion'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 subscriptionARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Maximum seconds to wait for the rendered value before raising an error; must be between 1 and 300. | |
| template | Yes | Jinja2 template string to render, e.g. '{{ states("sensor.temp") }}'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 fireARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Maximum seconds to wait for the trigger to fire before returning None; must be between 1 and 300. | |
| trigger | Yes | HA trigger definition dict, e.g. {'platform': 'state', 'entity_id': 'binary_sensor.motion', 'to': 'on'}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional mdi icon identifier, e.g. 'mdi:office-building'; omit for none. | |
| name | Yes | Display name for the new zone, e.g. 'Office'. | |
| radius | No | Zone radius in meters; defaults to 100. | |
| passive | No | If true, excludes the zone from device-tracker zone suggestions; defaults to false. | |
| latitude | Yes | Latitude in decimal degrees, e.g. 52.23. | |
| longitude | Yes | Longitude in decimal degrees, e.g. 21.01. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 helperADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| zone_id | Yes | Zone helper id or full entity_id like 'zone.office'; obtain it from zones_list_zones. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 locationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| person_entity_id | Yes | Person entity_id, e.g. 'person.alice'; a bare id like 'alice' is prefixed with 'person.' automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 zoneARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | Zone entity_id, e.g. 'zone.office'; a bare id like 'office' is prefixed with 'zone.' automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 zoneARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| zone_entity_id | Yes | Zone entity_id, e.g. 'zone.home'; a bare id like 'home' is prefixed with 'zone.' automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 zonesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 YAMLAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 helperADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | New mdi icon identifier; omit to leave the current icon unchanged. | |
| name | No | New display name; omit to leave the current name unchanged. | |
| radius | No | New zone radius in meters; omit to leave the current radius unchanged. | |
| passive | No | New passive flag; omit to leave the current setting unchanged. | |
| latitude | No | New latitude in decimal degrees; omit to leave the current latitude unchanged. | |
| entity_id | Yes | Zone entity_id to update, e.g. 'zone.office'; obtain it from zones_list_zones. | |
| longitude | No | New longitude in decimal degrees; omit to leave the current longitude unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
254 tool updates
v0.25.1- Changed
areas_control_area3 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Service to call on the domain: 'turn_on', 'turn_off' or 'toggle'." - added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID to target; obtain it from areas_list_areas." - added
Input schema / properties / domain / descriptionAdded value: +"Entity domain to target within the area, e.g. 'light' or 'switch'; defaults to 'light'."
- Changed
areas_create_area1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Display name for the new area, e.g. 'Kitchen'."
- Changed
areas_delete_area1 field changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID to delete; obtain it from areas_list_areas."
- Changed
areas_get_area_entities1 field changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID whose entities to return; obtain it from areas_list_areas."
- Changed
areas_get_area_states1 field changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID whose entity states to return; obtain it from areas_list_areas."
- Changed
automations_activate_scene1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full scene entity ID to activate, e.g. 'scene.movie_night'."
- Changed
automations_delete_automation2 fields changed- added
Input schema / properties / automation_id / descriptionAdded value: +"Automation config id to delete — the entity's `id` attribute, not its entity_id. A leading 'automation.' is stripped if present." - added
Input schema / properties / confirm / descriptionAdded value: +"Must be True to actually delete the automation. False (default) returns a safety prompt instead of deleting anything."
- Changed
automations_delete_scene2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True to actually delete the scene. False (default) returns a safety prompt instead of deleting anything." - added
Input schema / properties / scene_id / descriptionAdded value: +"Scene id to delete, bare (e.g. 'movie_night') or prefixed ('scene.movie_night')."
- Changed
automations_delete_script2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True to actually delete the script. False (default) returns a safety prompt instead of deleting anything." - added
Input schema / properties / script_id / descriptionAdded value: +"Script id to delete, bare (e.g. 'goodnight') or prefixed ('script.goodnight')."
- Changed
automations_disable_automation1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full automation entity ID to disable, e.g. 'automation.morning_routine'."
- Changed
automations_enable_automation1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full automation entity ID to enable, e.g. 'automation.morning_routine'."
- Changed
automations_get_automation_config1 field changed- added
Input schema / properties / automation_id / descriptionAdded 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."
- Changed
automations_get_automation_trace2 fields changed- added
Input schema / properties / automation_id / descriptionAdded value: +"Automation config id the trace belongs to, bare or prefixed ('automation.<id>')." - added
Input schema / properties / run_id / descriptionAdded value: +"Run id from `automations_list_automation_traces`, identifying one specific run."
- Changed
automations_get_last_automation_trace2 fields changed- added
Input schema / properties / automation_id / descriptionAdded value: +"Automation config id to fetch the latest trace for, bare or prefixed ('automation.<id>')." - added
Input schema / properties / failed_only / descriptionAdded value: +"If True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False."
- Changed
automations_get_last_script_trace2 fields changed- added
Input schema / properties / failed_only / descriptionAdded value: +"If True, pick the most recent run that did not finish cleanly instead of the most recent run overall. Defaults to False." - added
Input schema / properties / script_id / descriptionAdded value: +"Script id to fetch the latest trace for, bare or prefixed ('script.<id>')."
- Changed
automations_get_scene_config1 field changed- added
Input schema / properties / scene_id / descriptionAdded value: +"Scene id to look up, bare (e.g. 'movie_night') or prefixed ('scene.movie_night'); the 'scene.' prefix is stripped if present."
- Changed
automations_get_script_config1 field changed- added
Input schema / properties / script_id / descriptionAdded value: +"Script id to look up, bare (e.g. 'goodnight') or prefixed ('script.goodnight'); the 'script.' prefix is stripped if present."
- Changed
automations_get_script_trace2 fields changed- added
Input schema / properties / run_id / descriptionAdded value: +"Run id from `automations_list_script_traces`, identifying one specific run." - added
Input schema / properties / script_id / descriptionAdded value: +"Script id the trace belongs to, bare or prefixed ('script.<id>')."
- Changed
automations_list_automation_traces1 field changed- added
Input schema / properties / automation_id / descriptionAdded value: +"Automation config id to list traces for, bare or prefixed ('automation.<id>')."
- Changed
automations_list_script_traces1 field changed- added
Input schema / properties / script_id / descriptionAdded value: +"Script id to list traces for, bare or prefixed ('script.<id>')."
- Changed
automations_remove_group2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True to actually remove the group. False (default) returns a safety prompt instead of removing anything." - changed
Input schema / properties / group_id / descriptionPrevious value: -"Bare group id or 'group.<id>'."New value: +"Bare group id or 'group.<id>' to remove."
- Changed
automations_run_script2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full script entity ID to start, e.g. 'script.goodnight'." - added
Input schema / properties / variables / descriptionAdded value: +"Values passed as the script's input fields. Omit to run with no variables."
- Changed
automations_set_automation_config2 fields changed- added
Input schema / properties / automation_id / descriptionAdded 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." - added
Input schema / properties / config / descriptionAdded value: +"Full automation config replacing whatever is stored at `automation_id` (alias, triggers, conditions, actions, mode). Must contain 'alias' or 'trigger'/'triggers'."
- Changed
automations_set_group6 fields changed- changed
Input schema / properties / add_entities / descriptionPrevious value: -"Add these entity_ids to existing members."New value: +"Entity_ids to add to the existing member list. Do not combine with `entities`." - changed
Input schema / properties / all_entities / descriptionPrevious 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." - changed
Input schema / properties / entities / descriptionPrevious 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)." - changed
Input schema / properties / icon / descriptionPrevious 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." - changed
Input schema / properties / name / descriptionPrevious value: -"Friendly name (optional)."New value: +"Friendly name for the group. Omit to leave it unset/unchanged." - changed
Input schema / properties / remove_entities / descriptionPrevious value: -"Remove these entity_ids from existing members."New value: +"Entity_ids to remove from the existing member list. Do not combine with `entities`."
- Changed
automations_set_scene_config3 fields changed- added
Input schema / properties / entities / descriptionAdded 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)." - added
Input schema / properties / name / descriptionAdded value: +"Friendly name shown for the scene in the UI." - added
Input schema / properties / scene_id / descriptionAdded value: +"Scene id to create or overwrite, bare (e.g. 'movie_night') or prefixed ('scene.movie_night')."
- Changed
automations_set_script_config2 fields changed- added
Input schema / properties / config / descriptionAdded value: +"Full script config replacing whatever is stored at `script_id` (sequence, fields, alias, mode). Must contain at least 'alias' or 'sequence'." - added
Input schema / properties / script_id / descriptionAdded 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."
- Changed
automations_trigger_automation1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full automation entity ID to run now, e.g. 'automation.morning_routine'."
- Changed
automations_validate_automation_references1 field changed- added
Input schema / properties / yaml_content / descriptionAdded 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."
- Changed
automations_validate_best_practices1 field changed- added
Input schema / properties / yaml_content / descriptionAdded 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."
- Changed
blueprints_delete_blueprint2 fields changed- added
Input schema / properties / domain / descriptionAdded value: +"Blueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'." - added
Input schema / properties / path / descriptionAdded value: +"Blueprint path relative to /config/blueprints/<domain>/ to delete, e.g. 'author/blueprint_name.yaml'."
- Changed
blueprints_import_blueprint2 fields changed- added
Input schema / properties / domain / descriptionAdded value: +"Blueprint domain the fetched blueprint belongs to, 'automation' or 'script'. Defaults to 'automation'." - added
Input schema / properties / url / descriptionAdded value: +"HTTP(S) URL to fetch the blueprint YAML from, e.g. a GitHub raw file link or a community forum export link."
- Changed
blueprints_list_blueprints1 field changed- added
Input schema / properties / domain / descriptionAdded value: +"Blueprint domain folder under /config/blueprints/ to list, 'automation' or 'script'. Defaults to 'automation'."
- Added
blueprints_save_blueprint - Changed
blueprints_substitute_blueprint3 fields changed- added
Input schema / properties / domain / descriptionAdded value: +"Blueprint domain folder `path` lives under, 'automation' or 'script'. Defaults to 'automation'." - added
Input schema / properties / input / descriptionAdded value: +"Input values keyed by the input name declared in the blueprint's own `input:` section." - added
Input schema / properties / path / descriptionAdded value: +"Blueprint path relative to /config/blueprints/<domain>/ to render, e.g. 'author/blueprint_name.yaml'."
- Changed
calendar_create_event6 fields changed- added
Input schema / properties / description / descriptionAdded value: +"Optional longer event description/notes. Omit for none." - added
Input schema / properties / end / descriptionAdded value: +"Event end as an ISO 8601 datetime, e.g. '2026-04-28T11:00:00'." - added
Input schema / properties / entity_id / descriptionAdded value: +"Calendar entity ID to add the event to, e.g. 'calendar.family'." - added
Input schema / properties / location / descriptionAdded value: +"Optional event location text. Omit for none." - added
Input schema / properties / start / descriptionAdded value: +"Event start as an ISO 8601 datetime, e.g. '2026-04-28T10:00:00'." - added
Input schema / properties / summary / descriptionAdded value: +"Event title, e.g. 'Dentist appointment'."
- Changed
calendar_delete_event4 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Calendar entity ID the event belongs to, e.g. 'calendar.family'." - added
Input schema / properties / recurrence_idAdded 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." +} - added
Input schema / properties / recurrence_rangeAdded 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." +} - added
Input schema / properties / uid / descriptionAdded value: +"Event UID to delete, as returned by `calendar_list_events`."
- Changed
calendar_list_events3 fields changed- added
Input schema / properties / end / descriptionAdded value: +"Range end as an ISO 8601 datetime, e.g. '2026-05-05T00:00:00'." - added
Input schema / properties / entity_id / descriptionAdded value: +"Calendar entity ID, e.g. 'calendar.family', from `calendar_list_calendars`." - added
Input schema / properties / start / descriptionAdded value: +"Range start as an ISO 8601 datetime, e.g. '2026-04-28T00:00:00'."
- Changed
card_builder_build_from_recipe1 field changed- added
Input schema / properties / recipe / descriptionAdded 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."
- Changed
card_builder_build_styles4 fields changed- added
Input schema / properties / container / descriptionAdded value: +"Responsive container to wrap the result under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'." - added
Input schema / properties / extra / descriptionAdded value: +"Extra ContainerStyleData ({category: {prop: {value, unit}}}) merged in last, overriding the snippets. Omit for none." - added
Input schema / properties / snippet_names / descriptionAdded value: +"Ordered list of snippet names from card_builder_list_style_snippets to merge, e.g. ['card_padded', 'vertical_stack']." - added
Input schema / properties / target / descriptionAdded value: +"Style target key to wrap the result under, e.g. 'block' or 'state'. Defaults to 'block'."
- Changed
card_builder_create_card6 fields changed- added
Input schema / properties / author / descriptionAdded value: +"Author name to store on the card. Empty string if omitted." - added
Input schema / properties / categories / descriptionAdded value: +"Category labels (e.g. domain names) for the Card Builder UI. Omit for none." - added
Input schema / properties / config / descriptionAdded value: +"Full DocumentData v3 block tree (version/rootId/slots/blocks). Build it with `card_builder_build_from_recipe` rather than hand-writing it." - added
Input schema / properties / description / descriptionAdded value: +"Free-text card description. Empty string if omitted." - added
Input schema / properties / name / descriptionAdded value: +"Display name for the new card, e.g. 'AC Salon'." - added
Input schema / properties / tags / descriptionAdded value: +"Freeform tags for filtering in the Card Builder UI. Omit for no tags."
- Changed
card_builder_create_css_custom_property4 fields changed- added
Input schema / properties / inherits / descriptionAdded value: +"Whether the property inherits from parent elements, per the CSS @property spec. Defaults to false." - added
Input schema / properties / initial_value / descriptionAdded value: +"Initial value matching `syntax`, e.g. '#2196f3' for a <color>." - added
Input schema / properties / name / descriptionAdded value: +"CSS custom property name, e.g. '--card-accent-color' (with the leading '--')." - added
Input schema / properties / syntax / descriptionAdded value: +"CSS @property syntax descriptor, e.g. '<color>' or '<length>'."
- Changed
card_builder_create_style_preset4 fields changed- added
Input schema / properties / data / descriptionAdded value: +"CSS-style configuration blob, shaped like a style category map (see card_builder_list_style_categories)." - added
Input schema / properties / description / descriptionAdded value: +"Free-text preset description. Empty string if omitted." - added
Input schema / properties / extends_preset_id / descriptionAdded value: +"Id of another style preset this one extends/inherits from. Omit for no inheritance." - added
Input schema / properties / name / descriptionAdded value: +"Display name for the new preset, e.g. 'Dark Hero'."
- Changed
card_builder_delete_card1 field changed- added
Input schema / properties / card_id / descriptionAdded value: +"Id of the card to delete, from card_builder_list_cards."
- Changed
card_builder_delete_css_custom_property1 field changed- added
Input schema / properties / custom_property_id / descriptionAdded value: +"Id of the property to delete, from card_builder_list_css_custom_properties."
- Changed
card_builder_delete_media1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path of the file to delete, relative to www/card_builder/ (see card_builder_list_media)."
- Changed
card_builder_delete_style_preset1 field changed- added
Input schema / properties / style_preset_id / descriptionAdded value: +"Id of the preset to delete, from card_builder_list_style_presets."
- Changed
card_builder_design_for_intent3 fields changed- added
Input schema / properties / domain / descriptionAdded value: +"HA entity domain to weight the match toward, e.g. 'sensor'. Omit to infer from entity_id or match on keywords alone." - added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity id, e.g. 'sensor.battery'; used to infer domain when domain is omitted." - added
Input schema / properties / intent / descriptionAdded value: +"Free-text description of what the card should do, e.g. 'show battery level'."
- Changed
card_builder_get_block_schema1 field changed- added
Input schema / properties / block_type / descriptionAdded value: +"Block type id, e.g. 'block-slider', from card_builder_list_block_types."
- Changed
card_builder_get_card1 field changed- added
Input schema / properties / card_id / descriptionAdded value: +"Card id or card_id from card_builder_list_cards, e.g. a UUID string."
- Changed
card_builder_get_card_template2 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Template name, e.g. 'sensor_hero', from card_builder_list_card_templates." - added
Input schema / properties / slot / descriptionAdded value: +"Override the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default."
- Changed
card_builder_get_design_pattern1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Pattern name, e.g. 'sensor_hero', from card_builder_list_design_patterns."
- Changed
card_builder_get_style_snippet3 fields changed- added
Input schema / properties / container / descriptionAdded value: +"Responsive container to wrap the snippet under: 'desktop', 'tablet', or 'mobile'. Defaults to 'desktop'." - added
Input schema / properties / name / descriptionAdded value: +"Snippet name, e.g. 'card_padded', from card_builder_list_style_snippets." - added
Input schema / properties / target / descriptionAdded value: +"Style target key to wrap the snippet under, e.g. 'block' or 'state'. Defaults to 'block'."
- Changed
card_builder_list_block_types2 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Block category to filter to: basic, layout, entities, controls, advanced, or weather. Omit for every category." - added
Input schema / properties / include_internal / descriptionAdded value: +"If true, also list internal-only block types (e.g. block-drop-zone) that a recipe must not use directly."
- Changed
card_builder_list_button_toggle_features1 field changed- added
Input schema / properties / domain / descriptionAdded value: +"HA entity domain to filter to, e.g. 'climate' or 'cover'. Omit to list every domain's features."
- Changed
card_builder_list_card_templates1 field changed- added
Input schema / properties / domain / descriptionAdded value: +"HA entity domain to filter to, e.g. 'climate' or 'light'. Omit to list every template."
- Changed
card_builder_list_design_patterns1 field changed- added
Input schema / properties / domain / descriptionAdded value: +"HA entity domain to filter to, e.g. 'climate' or 'sensor'. Omit to list every pattern."
- Changed
card_builder_list_media1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Sub-folder relative to www/card_builder/ to list. Empty string lists the root."
- Changed
card_builder_list_style_targets1 field changed- added
Input schema / properties / block_type / descriptionAdded value: +"Block type id, e.g. 'block-entity-field-state', from card_builder_list_block_types."
- Changed
card_builder_make_template_card6 fields changed- added
Input schema / properties / categories / descriptionAdded value: +"Replacement category list. Omit to default to the template's first domain, or 'tile' if it has none." - added
Input schema / properties / description / descriptionAdded value: +"Card description. Empty string uses the template's own description instead." - added
Input schema / properties / name / descriptionAdded value: +"Display name for the new card, e.g. 'Battery Salon'." - added
Input schema / properties / slot / descriptionAdded value: +"Override the template's default entity-slot name, e.g. 'main' instead of 'entity'. Omit to use the template's default." - added
Input schema / properties / tags / descriptionAdded value: +"Replacement tag list. Omit to default to ['nexus-template', template]." - added
Input schema / properties / template / descriptionAdded value: +"Template name, e.g. 'sensor_hero', from card_builder_list_card_templates."
- Changed
card_builder_renderer_card_config3 fields changed- added
Input schema / properties / card_id / descriptionAdded value: +"Id of the Card Builder card to render, from card_builder_list_cards." - added
Input schema / properties / slot_actions / descriptionAdded value: +"Per-instance overrides for the card's action slots. Omit to use the card's own defaults." - added
Input schema / properties / slot_entities / descriptionAdded value: +"Maps each slot id defined in the card to a HA entity_id, e.g. {'climate': 'climate.salon'}. Omit for no slot bindings."
- Changed
card_builder_update_card7 fields changed- added
Input schema / properties / card_id / descriptionAdded value: +"Id of the card to update, from card_builder_list_cards." - added
Input schema / properties / categories / descriptionAdded value: +"Replacement category list. Omit to leave categories unchanged." - added
Input schema / properties / config / descriptionAdded value: +"New DocumentData v3 block tree, replacing the whole config. Omit to keep the current config." - added
Input schema / properties / description / descriptionAdded value: +"New description text. Omit to leave it unchanged." - added
Input schema / properties / name / descriptionAdded value: +"New display name. Omit to leave the current name unchanged." - added
Input schema / properties / skip_version_bump / descriptionAdded value: +"If true, do not bump the card's stored version counter for this change." - added
Input schema / properties / tags / descriptionAdded value: +"Replacement tag list. Omit to leave tags unchanged."
- Changed
card_builder_update_style_preset5 fields changed- added
Input schema / properties / data / descriptionAdded value: +"Replacement CSS-style configuration blob. Omit to leave the current data unchanged." - added
Input schema / properties / description / descriptionAdded value: +"New description text. Omit to leave it unchanged." - added
Input schema / properties / extends_preset_id / descriptionAdded value: +"Replacement parent preset id to inherit from. Omit to leave inheritance unchanged." - added
Input schema / properties / name / descriptionAdded value: +"New display name. Omit to leave the current name unchanged." - added
Input schema / properties / style_preset_id / descriptionAdded value: +"Id of the preset to update, from card_builder_list_style_presets."
- Changed
card_builder_upload_image_from_url3 fields changed- added
Input schema / properties / filename / descriptionAdded value: +"Target filename to store as. Omit to derive one from the URL's last path segment." - added
Input schema / properties / path / descriptionAdded value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root." - added
Input schema / properties / url / descriptionAdded value: +"http(s) URL of the image to download, e.g. 'https://example.com/bg.png'."
- Changed
card_builder_upload_media3 fields changed- added
Input schema / properties / content_base64 / descriptionAdded value: +"Raw file bytes, base64-encoded." - added
Input schema / properties / filename / descriptionAdded value: +"Bare target filename with an allowed image/SVG extension, e.g. 'bg-1.png'. No path separators." - added
Input schema / properties / path / descriptionAdded value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root."
- Changed
card_builder_upload_media_from_path3 fields changed- added
Input schema / properties / filename / descriptionAdded value: +"Target filename to store as. Omit to reuse local_path's own filename." - added
Input schema / properties / local_path / descriptionAdded value: +"Absolute or relative path to the source file; must resolve under <config>/www or <config>/media." - added
Input schema / properties / path / descriptionAdded value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root."
- Changed
card_builder_upload_svg3 fields changed- added
Input schema / properties / filename / descriptionAdded value: +"Bare target filename, e.g. 'gradient-bg'. '.svg' is appended if missing." - added
Input schema / properties / path / descriptionAdded value: +"Sub-folder under www/card_builder/ to upload into. Empty string uploads to the root." - added
Input schema / properties / svg_content / descriptionAdded value: +"Raw SVG markup, starting with '<svg' or '<?xml ...'."
- Changed
card_builder_validate_config1 field changed- added
Input schema / properties / config / descriptionAdded value: +"DocumentData config to check, as produced by card_builder_build_from_recipe or returned by card_builder_get_card."
- Added
dashboards_add_card_to_section - Changed
dashboards_add_card_to_view3 fields changed- added
Input schema / properties / card_config / descriptionAdded value: +"Lovelace card config, e.g. {'type': 'entities', 'entities': ['light.living_room']}." - added
Input schema / properties / url_path / descriptionAdded value: +"Dashboard url_path (not a view path), from dashboards_list_dashboards." - added
Input schema / properties / view_index / descriptionAdded value: +"Zero-based index of the target view within the dashboard's 'views' list."
- Changed
dashboards_add_dashboard_resource1 field changed- changed
Input schema / properties / resource_type / descriptionPrevious 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'."
- Added
dashboards_add_section_to_view - Changed
dashboards_add_view_to_dashboard2 fields changed- added
Input schema / properties / url_path / descriptionAdded value: +"Dashboard url_path to add the view to, from dashboards_list_dashboards." - added
Input schema / properties / view_config / descriptionAdded value: +"Lovelace view config, e.g. {'title': 'Bedroom', 'icon': 'mdi:bed', 'cards': []}."
- Changed
dashboards_get_dashboard_config1 field changed- added
Input schema / properties / url_path / descriptionAdded 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."
- Added
dashboards_get_view_sections - Added
dashboards_remove_card_from_section - Changed
dashboards_remove_dashboard_resource2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be true to actually remove the resource; false (the default) returns a confirmation prompt instead." - added
Input schema / properties / resource_id / descriptionAdded value: +"Numeric resource id, from dashboards_get_dashboard_resources."
- Changed
dashboards_save_dashboard_config2 fields changed- added
Input schema / properties / config / descriptionAdded 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." - added
Input schema / properties / url_path / descriptionAdded value: +"Dashboard url_path to save, from dashboards_list_dashboards. Omit for the default dashboard."
- Changed
dashboards_screenshot6 fields changed- changed
Input schema / properties / full_page / descriptionPrevious 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." - changed
Input schema / properties / height / descriptionPrevious value: -"Viewport height in pixels (default 800)."New value: +"Viewport height in pixels. Ignored when full_page=True. Defaults to 800." - changed
Input schema / properties / url_path / descriptionPrevious 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." - changed
Input schema / properties / wait_ms / descriptionPrevious 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." - changed
Input schema / properties / width / descriptionPrevious value: -"Viewport width in pixels (default 1280)."New value: +"Viewport width in pixels. Defaults to 1280." - changed
Input schema / properties / zoom / descriptionPrevious value: -"Zoom factor (default 1.0)."New value: +"Browser zoom factor applied by the engine. Defaults to 1.0 (no zoom)."
- Added
dashboards_update_card_in_section - Changed
dashboards_update_dashboard_resource3 fields changed- changed
Input schema / properties / resource_id / descriptionPrevious value: -"Numeric ID of the resource to update."New value: +"Numeric resource id to update, from dashboards_get_dashboard_resources." - changed
Input schema / properties / resource_type / descriptionPrevious value: -"'module', 'js', or 'css'."New value: +"Resource kind: 'module' (ES module JS), 'js' (legacy script), or 'css'. Defaults to 'module'." - changed
Input schema / properties / url / descriptionPrevious value: -"New resource URL."New value: +"New resource URL, replacing the current one."
- Changed
devices_list_devices_in_area1 field changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID to filter by; obtain it from areas_list_areas."
- Changed
devices_remove_device2 fields changed- added
Input schema / properties / config_entry_id / descriptionAdded value: +"Config entry ID the device is attached to; the device is detached only from this entry." - added
Input schema / properties / device_id / descriptionAdded value: +"Device registry ID to remove; obtain it from devices_list_devices."
- Changed
devices_update_device4 fields changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID to assign the device to, from areas_list_areas; omit to leave the current area unchanged." - added
Input schema / properties / device_id / descriptionAdded value: +"Device registry ID to update; obtain it from devices_list_devices." - added
Input schema / properties / disabled_by / descriptionAdded value: +"'user' disables the device and its entities, '' (empty string) re-enables it; omit to leave the disabled state unchanged." - added
Input schema / properties / name_by_user / descriptionAdded value: +"New user-facing name override for the device; omit to leave the current name unchanged."
- Changed
discover_get_tool_doc1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Full tool name including namespace, e.g. 'entities_get_entity', from `discover_tool_search`."
- Changed
discover_tool_search3 fields changed- added
Input schema / properties / namespace / descriptionAdded value: +"Restrict results to one namespace, e.g. 'card_builder'. Omit to search every namespace." - added
Input schema / properties / query / descriptionAdded value: +"Free-text search query, e.g. 'turn on light' or 'backup'." - added
Input schema / properties / top_k / descriptionAdded value: +"Maximum number of ranked hits to return, e.g. 10."
- Changed
energy_add_battery_source2 fields changed- added
Input schema / properties / stat_energy_from / descriptionAdded value: +"Statistic/entity ID of the battery discharge (energy out) sensor to add, e.g. 'sensor.battery_discharge'." - added
Input schema / properties / stat_energy_to / descriptionAdded value: +"Statistic/entity ID of the battery charge (energy in) sensor to add, e.g. 'sensor.battery_charge'."
- Changed
energy_add_grid_consumption2 fields changed- added
Input schema / properties / stat_cost / descriptionAdded 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." - added
Input schema / properties / stat_energy_from / descriptionAdded 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`."
- Changed
energy_add_grid_return2 fields changed- added
Input schema / properties / stat_compensation / descriptionAdded value: +"Optional statistic/entity ID of the matching compensation/cost sensor for this export flow. Omit if no compensation sensor should be linked." - added
Input schema / properties / stat_energy_to / descriptionAdded value: +"Statistic/entity ID of the grid-export energy sensor to add, e.g. 'sensor.solar_export'. Discover candidates with `statistics_list_statistic_ids`."
- Changed
energy_add_solar_source2 fields changed- added
Input schema / properties / config_entry_solar_forecast / descriptionAdded 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." - added
Input schema / properties / stat_energy_from / descriptionAdded value: +"Statistic/entity ID of the solar production sensor to add, e.g. 'sensor.solar_production'. Discover candidates with `statistics_list_statistic_ids`."
- Changed
energy_remove_energy_source1 field changed- added
Input schema / properties / stat_energy_from / descriptionAdded value: +"Statistic/entity ID identifying the source to remove, as originally passed to one of the `energy_add_*` tools, e.g. 'sensor.solar_production'."
- Changed
energy_save_energy_prefs4 fields changed- added
Input schema / properties / currency / descriptionAdded 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." - added
Input schema / properties / device_consumption / descriptionAdded 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." - added
Input schema / properties / energy_per_unit / descriptionAdded 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." - added
Input schema / properties / energy_sources / descriptionAdded 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."
- Changed
entities_assign_entity_to_area2 fields changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID to assign the entity to, replacing any current area." - added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to reassign, e.g. 'light.kitchen'."
- Changed
entities_bulk_control2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"Service to call per domain group: 'turn_on', 'turn_off' or 'toggle'." - added
Input schema / properties / entity_ids / descriptionAdded value: +"Full entity IDs to act on, e.g. ['light.a', 'light.b']."
- Changed
entities_bulk_set_entity_exposure3 fields changed- added
Input schema / properties / assistants / descriptionAdded value: +"Subset of voice assistants to target. Omit to apply to conversation, cloud.alexa and cloud.google_assistant." - added
Input schema / properties / entity_ids / descriptionAdded value: +"Full entity IDs to expose or hide, e.g. ['light.a', 'light.b']." - added
Input schema / properties / should_expose / descriptionAdded value: +"True to expose the entities to the target assistants, false to hide them."
- Changed
entities_bulk_set_state1 field changed- added
Input schema / properties / updates / descriptionAdded value: +"List of {entity_id, state, attributes?} dicts describing the virtual state to write per entity."
- Changed
entities_disable_entity1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to disable, e.g. 'sensor.old_device'."
- Changed
entities_enable_entity1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to re-enable, e.g. 'sensor.old_device'."
- Changed
entities_get_entity1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to read, e.g. 'light.kitchen'."
- Changed
entities_get_entity_exposure1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to query exposure for, e.g. 'light.kitchen'."
- Changed
entities_list_entities4 fields changed- changed
Input schema / properties / domain / descriptionPrevious 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." - changed
Input schema / properties / fields / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max number of results. Omit for all."New value: +"Maximum number of entities to return after filtering, for pagination. Omit for no limit." - changed
Input schema / properties / offset / descriptionPrevious value: -"Skip first N results (pagination)."New value: +"Number of filtered entities to skip before applying limit. 0 starts from the first match."
- Changed
entities_list_entity_registry1 field changed- added
Input schema / properties / domain / descriptionAdded value: +"Entity domain prefix filter, e.g. 'light' or 'sensor'. Omit to include every domain."
- Changed
entities_list_exposed_entities1 field changed- added
Input schema / properties / assistant / descriptionAdded value: +"Voice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'."
- Changed
entities_select_option2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to set, e.g. 'input_select.house_mode'." - added
Input schema / properties / option / descriptionAdded value: +"Option string to select; must match one of the entity's configured options."
- Changed
entities_set_entity_exposure3 fields changed- added
Input schema / properties / assistant / descriptionAdded value: +"Voice assistant identifier: 'conversation', 'cloud.alexa' or 'cloud.google_assistant'." - added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to expose or hide, e.g. 'light.kitchen'." - added
Input schema / properties / should_expose / descriptionAdded value: +"True to expose the entity to the assistant, false to hide it."
- Changed
entities_set_value2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to set, e.g. 'input_number.target_temp'." - added
Input schema / properties / value / descriptionAdded value: +"Numeric value to write; interpreted per domain, see Behaviour."
- Changed
entities_toggle1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to toggle, e.g. 'switch.fan'."
- Changed
entities_turn_off1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to turn off, e.g. 'light.kitchen'."
- Changed
entities_turn_on8 fields changed- added
Input schema / properties / brightness / descriptionAdded value: +"Light brightness, 0-255. Light-only; passing it for a non-light entity returns an error." - added
Input schema / properties / color_temp / descriptionAdded value: +"Deprecated mired color temperature, light-only. Converted to Kelvin before the call; prefer color_temp_kelvin." - added
Input schema / properties / color_temp_kelvinAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Light color temperature in Kelvin, light-only option." +} - added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to turn on, e.g. 'light.kitchen'." - added
Input schema / properties / rgb_color / descriptionAdded value: +"Light RGB color as [r, g, b], each 0-255, light-only option." - added
Output schema / properties / result / anyOfAdded value: +[ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / result / itemsRemoved value: -{ - "additionalProperties": true, - "type": "object" -} - removed
Output schema / properties / result / typeRemoved value: -"array"
- Changed
entities_update_entity_name2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID whose registry entry is renamed, e.g. 'light.kitchen'." - added
Input schema / properties / name / descriptionAdded value: +"New display name to store in the entity registry, replacing the current one."
- Changed
esphome_clean_mqtt3 fields changed- added
Input schema / properties / log_linesAdded 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" +} - added
Input schema / properties / name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'." - added
Input schema / properties / timeoutAdded 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" +}
- Changed
esphome_compile_device4 fields changed- added
Input schema / properties / log_linesAdded value: +{ + "default": 200, + "description": "Number of trailing build-log lines to return, e.g. 200.", + "type": "integer" +} - added
Input schema / properties / name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'." - added
Input schema / properties / only_generateAdded 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" +} - added
Input schema / properties / timeoutAdded value: +{ + "default": 180, + "description": "Maximum seconds to wait for the compile process to finish, e.g. 180.", + "type": "number" +}
- Changed
esphome_get_addon_logs1 field changed- added
Input schema / properties / lines / descriptionAdded value: +"Number of trailing log lines to return, e.g. 150."
- Changed
esphome_get_config1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. Discover names with `esphome_list_devices`."
- Changed
esphome_get_device_entities1 field changed- added
Input schema / properties / device_name / descriptionAdded value: +"Device name as used in HA, e.g. 'Kitchen Sensor' or 'kitchen_sensor' (matched case-insensitively against a slugified form)."
- Changed
esphome_lvgl_add_widget4 fields changed- added
Input schema / properties / device_name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'." - added
Input schema / properties / page_id / descriptionAdded value: +"LVGL page ID to add the widget to, from `esphome_lvgl_get_pages`." - added
Input schema / properties / properties / descriptionAdded value: +"Widget properties, e.g. {'id': ..., 'x': ..., 'y': ..., 'width': ..., 'height': ..., 'text': ..., 'value': ..., 'styles': ...}." - added
Input schema / properties / widget_type / descriptionAdded value: +"LVGL widget type, e.g. 'label', 'button', 'slider', 'arc', 'switch', 'spinbox', 'img', 'line', 'meter'."
- Changed
esphome_lvgl_delete_widget3 fields changed- added
Input schema / properties / device_name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'." - added
Input schema / properties / page_id / descriptionAdded value: +"LVGL page ID the widget belongs to, from `esphome_lvgl_get_pages`." - added
Input schema / properties / widget_id / descriptionAdded value: +"Widget `id` to delete, from `esphome_lvgl_get_page_widgets`."
- Changed
esphome_lvgl_get_page_widgets2 fields changed- added
Input schema / properties / device_name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'." - added
Input schema / properties / page_id / descriptionAdded value: +"LVGL page ID to inspect, from `esphome_lvgl_get_pages`."
- Changed
esphome_lvgl_get_pages1 field changed- added
Input schema / properties / device_name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
- Changed
esphome_lvgl_get_styles1 field changed- added
Input schema / properties / device_name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
- Changed
esphome_lvgl_validate1 field changed- added
Input schema / properties / device_name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_display'."
- Changed
esphome_upload_device5 fields changed- added
Input schema / properties / confirmAdded 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" +} - added
Input schema / properties / log_linesAdded value: +{ + "default": 200, + "description": "Number of trailing upload-log lines to return, e.g. 200.", + "type": "integer" +} - added
Input schema / properties / name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'." - added
Input schema / properties / portAdded value: +{ + "default": "OTA", + "description": "'OTA' for wireless flash (default) or a serial device path, e.g. '/dev/ttyUSB0', for a wired flash.", + "type": "string" +} - added
Input schema / properties / timeoutAdded value: +{ + "default": 240, + "description": "Maximum seconds to wait for the upload to finish, e.g. 240.", + "type": "number" +}
- Changed
esphome_validate_config3 fields changed- added
Input schema / properties / log_linesAdded value: +{ + "default": 200, + "description": "Number of trailing log lines to return, e.g. 200.", + "type": "integer" +} - added
Input schema / properties / name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'." - added
Input schema / properties / timeoutAdded value: +{ + "default": 60, + "description": "Maximum seconds to wait for the validation result, e.g. 60.", + "type": "number" +}
- Changed
esphome_write_config2 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Full YAML document to write, replacing the file's current content." - added
Input schema / properties / name / descriptionAdded value: +"Device name, with or without the '.yaml' suffix, e.g. 'kitchen_sensor'. If the file already exists, its entire content is replaced."
- Changed
files_append_to_config_file3 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Text appended after a newline to the file's existing content." - added
Input schema / properties / relative_path / descriptionAdded 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/." - added
Input schema / properties / validate_yaml / descriptionAdded 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."
- Changed
files_delete_config_file2 fields changed- added
Input schema / properties / confirmAdded 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" +} - added
Input schema / properties / relative_path / descriptionAdded 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/."
- Changed
files_list_config_files1 field changed- added
Input schema / properties / subdirectory / descriptionAdded value: +"Subdirectory relative to the HA config root to list, e.g. 'packages'. Omit (default '') to list from the config root."
- Changed
files_read_config_file1 field changed- added
Input schema / properties / relative_path / descriptionAdded 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/."
- Changed
files_validate_yaml_content1 field changed- added
Input schema / properties / content / descriptionAdded value: +"YAML text to check for syntax errors; nothing is written or read from disk."
- Changed
files_write_config_file3 fields changed- added
Input schema / properties / content / descriptionAdded value: +"Full text to write as the file's new content, replacing whatever was there before." - added
Input schema / properties / relative_path / descriptionAdded 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/." - added
Input schema / properties / validate_yaml / descriptionAdded 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."
- Changed
git_git_checkout_branch1 field changed- added
Input schema / properties / branch_name / descriptionAdded value: +"Name of an existing git branch to switch the config repository to."
- Changed
git_git_commit_all1 field changed- added
Input schema / properties / message / descriptionAdded value: +"Commit message describing this checkpoint or change."
- Changed
git_git_create_branch1 field changed- added
Input schema / properties / branch_name / descriptionAdded value: +"Name of the new git branch to create, e.g. 'automation-refactor'."
- Changed
git_git_diff1 field changed- added
Input schema / properties / sha / descriptionAdded value: +"Commit SHA or ref to show a stat summary for, e.g. 'a1b2c3d'. Omit to show the unstaged diff instead."
- Changed
git_git_log1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of commits to return, most recent first. Defaults to 20."
- Changed
git_git_rollback_file3 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True to actually restore the file. False (default) returns a safety prompt describing what would happen instead of touching anything." - added
Input schema / properties / relative_path / descriptionAdded value: +"Path to the file relative to the HA config directory to restore, e.g. 'automations.yaml'. Must resolve inside /config after following symlinks." - added
Input schema / properties / sha / descriptionAdded value: +"Commit SHA or ref to restore the file from. Defaults to 'HEAD', which discards uncommitted changes to this file."
- Changed
git_git_rollback_to_commit2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Must be True to actually perform the reset. False (default) returns a safety prompt naming the current HEAD instead of touching anything." - added
Input schema / properties / sha / descriptionAdded value: +"Commit SHA or ref to hard-reset the entire config directory to."
- Changed
git_safe_write_with_checkpoint3 fields changed- added
Input schema / properties / commit_message / descriptionAdded value: +"Commit message for the new-content commit. Omit to use a default 'chore: update <relative_path>' message." - added
Input schema / properties / content / descriptionAdded value: +"Full text to write as the file's new content, replacing whatever was there before." - added
Input schema / properties / relative_path / descriptionAdded 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`."
- Changed
hacs_add_custom_repository2 fields changed- added
Input schema / properties / category / descriptionAdded value: +"HACS category for the repository: integration, plugin, theme, template, appdaemon or python_script." - added
Input schema / properties / url / descriptionAdded value: +"Full URL of the repository to register with HACS, e.g. a GitHub repo URL."
- Changed
hacs_get_hacs_repository1 field changed- added
Input schema / properties / repo_id / descriptionAdded value: +"HACS repository id, e.g. from `hacs_list_hacs_repositories`."
- Changed
hacs_install_hacs_repository2 fields changed- added
Input schema / properties / repo_id / descriptionAdded value: +"HACS repository id to install, e.g. from `hacs_list_hacs_repositories`." - added
Input schema / properties / version / descriptionAdded value: +"Specific version/tag to pin. Omit to install the latest available version."
- Changed
hacs_list_hacs_repositories1 field changed- added
Input schema / properties / category / descriptionAdded value: +"Filter to one HACS category: integration, plugin, theme, template, appdaemon or python_script. Omit to list every category."
- Changed
hacs_uninstall_hacs_repository1 field changed- added
Input schema / properties / repo_id / descriptionAdded value: +"HACS repository id to uninstall, e.g. from `hacs_list_hacs_repositories`."
- Changed
hacs_update_hacs_repository1 field changed- added
Input schema / properties / repo_id / descriptionAdded value: +"HACS repository id to update, e.g. from `hacs_list_hacs_repositories`."
- Changed
helpers_cancel_timer1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full timer entity ID to cancel, e.g. 'timer.laundry'."
- Changed
helpers_increment_counter1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full counter entity ID to increment, e.g. 'counter.visits'."
- Changed
helpers_reload_helpers4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - removed
Output schema / x-fastmcp-wrap-resultRemoved value: -true
- Changed
helpers_reset_counter1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full counter entity ID to reset, e.g. 'counter.visits'."
- Changed
helpers_set_input_boolean2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full input_boolean entity ID to set, e.g. 'input_boolean.guest_mode'." - added
Input schema / properties / value / descriptionAdded value: +"Target boolean value; true calls turn_on, false calls turn_off."
- Changed
helpers_set_input_datetime4 fields changed- added
Input schema / properties / date / descriptionAdded value: +"Date to set, formatted YYYY-MM-DD. Omit to leave the date unchanged." - added
Input schema / properties / datetime / descriptionAdded value: +"Combined date and time, formatted 'YYYY-MM-DD HH:MM:SS'. Takes precedence over date/time when given." - added
Input schema / properties / entity_id / descriptionAdded value: +"Full input_datetime entity ID to set, e.g. 'input_datetime.reminder'." - added
Input schema / properties / time / descriptionAdded value: +"Time to set, formatted HH:MM:SS. Omit to leave the time unchanged."
- Changed
helpers_set_input_number2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full input_number entity ID to set, e.g. 'input_number.target_temp'." - added
Input schema / properties / value / descriptionAdded value: +"Target numeric value to write to the input_number."
- Changed
helpers_set_input_select2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full input_select entity ID to set, e.g. 'input_select.house_mode'." - added
Input schema / properties / option / descriptionAdded value: +"Option string to select; must match one of the input_select's configured options."
- Changed
helpers_set_input_text2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full input_text entity ID to set, e.g. 'input_text.last_visitor'." - added
Input schema / properties / value / descriptionAdded value: +"Target text value to write to the input_text."
- Changed
helpers_start_timer2 fields changed- added
Input schema / properties / duration / descriptionAdded value: +"Duration to run for, formatted HH:MM:SS or a plain number of seconds. Omit to reuse the timer's configured duration." - added
Input schema / properties / entity_id / descriptionAdded value: +"Full timer entity ID to start, e.g. 'timer.laundry'."
- Changed
history_get_logbook2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to filter to, e.g. 'light.kitchen'. Omit to return logbook entries for every entity." - added
Input schema / properties / hours / descriptionAdded value: +"How many hours back from now to fetch, e.g. 24 for one day. Default 24."
- Changed
history_get_state_history2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to fetch history for, e.g. 'light.kitchen'." - added
Input schema / properties / hours / descriptionAdded value: +"How many hours back from now to fetch, e.g. 24 for one day. Default 24."
- Changed
integrations_abort_config_flow1 field changed- added
Input schema / properties / flow_id / descriptionAdded value: +"Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`."
- Changed
integrations_abort_options_flow1 field changed- added
Input schema / properties / flow_id / descriptionAdded value: +"Flow id from `integrations_start_options_flow`."
- Changed
integrations_disable_integration1 field changed- added
Input schema / properties / entry_id / descriptionAdded value: +"Config entry ID to disable, from `system_list_integrations` or `system_get_all_integrations`."
- Changed
integrations_enable_integration1 field changed- added
Input schema / properties / entry_id / descriptionAdded value: +"Config entry ID to re-enable, from `system_list_integrations` or `system_get_all_integrations`."
- Changed
integrations_get_config_flow1 field changed- added
Input schema / properties / flow_id / descriptionAdded value: +"Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`."
- Changed
integrations_remove_integration2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Set true to actually remove the integration. False (default) performs no action and instead returns a confirmation prompt." - added
Input schema / properties / entry_id / descriptionAdded value: +"Config entry ID to remove, from `system_list_integrations` or `system_get_all_integrations`."
- Changed
integrations_start_config_flow2 fields changed- added
Input schema / properties / handler / descriptionAdded value: +"Integration domain to configure, e.g. 'shelly'; from `integrations_list_flow_handlers`." - added
Input schema / properties / show_advanced_options / descriptionAdded value: +"Whether to include the integration's advanced-options fields in the returned form. False (default) hides them."
- Changed
integrations_start_options_flow2 fields changed- added
Input schema / properties / entry_id / descriptionAdded value: +"Config entry ID to edit, from `system_list_integrations` or `system_get_all_integrations`." - added
Input schema / properties / show_advanced_options / descriptionAdded value: +"Whether to include the integration's advanced-options fields in the returned form. False (default) hides them."
- Changed
integrations_submit_config_flow_step2 fields changed- added
Input schema / properties / flow_id / descriptionAdded value: +"Flow id from `integrations_start_config_flow` or `integrations_list_flows_in_progress`." - added
Input schema / properties / user_input / descriptionAdded value: +"Answers for the current step, matching the fields in the flow's `data_schema` (e.g. host, API key, chosen device)."
- Changed
integrations_submit_options_flow_step2 fields changed- added
Input schema / properties / flow_id / descriptionAdded value: +"Flow id from `integrations_start_options_flow`." - added
Input schema / properties / user_input / descriptionAdded value: +"Answers for the current step, matching the fields in the flow's `data_schema`."
- Changed
integrations_update_integration_entry4 fields changed- added
Input schema / properties / entry_id / descriptionAdded value: +"Config entry ID to update, from `system_list_integrations` or `system_get_all_integrations`." - added
Input schema / properties / pref_disable_new_entities / descriptionAdded value: +"Whether newly discovered entities from this integration should start disabled. Omit to leave the current preference unchanged." - added
Input schema / properties / pref_disable_polling / descriptionAdded value: +"Whether HA should skip polling for this integration's entities. Omit to leave the current preference unchanged." - added
Input schema / properties / title / descriptionAdded value: +"New display title for the entry. Omit to leave the current title unchanged."
- Changed
labels_assign_label_to_device2 fields changed- added
Input schema / properties / device_id / descriptionAdded value: +"Device registry ID to tag; obtain it from devices_list_devices." - added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to assign; obtain it from labels_list_labels."
- Changed
labels_assign_label_to_entity2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Entity ID to tag, e.g. 'light.kitchen'." - added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to assign; obtain it from labels_list_labels."
- Changed
labels_create_category3 fields changed- added
Input schema / properties / icon / descriptionAdded value: +"Optional mdi icon identifier, e.g. 'mdi:tag'; omit for no icon." - added
Input schema / properties / name / descriptionAdded value: +"Display name for the new category." - added
Input schema / properties / scope / descriptionAdded value: +"Registry scope the new category belongs to, e.g. 'automation'."
- Changed
labels_create_label4 fields changed- added
Input schema / properties / color / descriptionAdded value: +"Optional label color name recognised by the frontend, e.g. 'red'; omit for no color." - added
Input schema / properties / description / descriptionAdded value: +"Optional free-text description of the label's purpose; omit for none." - added
Input schema / properties / icon / descriptionAdded value: +"Optional mdi icon identifier, e.g. 'mdi:alert'; omit for no icon." - added
Input schema / properties / name / descriptionAdded value: +"Display name for the new label, e.g. 'Battery Low'."
- Changed
labels_delete_category2 fields changed- added
Input schema / properties / category_id / descriptionAdded value: +"Category registry ID to delete; obtain it from labels_list_categories." - added
Input schema / properties / scope / descriptionAdded value: +"Registry scope the category belongs to, e.g. 'automation'."
- Changed
labels_delete_label1 field changed- added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to delete; obtain it from labels_list_labels."
- Changed
labels_list_categories1 field changed- added
Input schema / properties / scope / descriptionAdded value: +"Registry scope the categories belong to, e.g. 'automation'; defaults to 'automation'."
- Changed
labels_list_devices_with_label1 field changed- added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to filter by; obtain it from labels_list_labels."
- Changed
labels_list_entities_with_label1 field changed- added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to filter by; obtain it from labels_list_labels."
- Changed
labels_remove_label_from_device2 fields changed- added
Input schema / properties / device_id / descriptionAdded value: +"Device registry ID to untag; obtain it from devices_list_devices." - added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to remove; obtain it from labels_list_labels."
- Changed
labels_remove_label_from_entity2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Entity ID to untag, e.g. 'light.kitchen'." - added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to remove; obtain it from labels_list_labels."
- Changed
labels_update_category4 fields changed- added
Input schema / properties / category_id / descriptionAdded value: +"Category registry ID to update; obtain it from labels_list_categories." - added
Input schema / properties / icon / descriptionAdded value: +"New mdi icon identifier; omit to leave the current icon unchanged." - added
Input schema / properties / name / descriptionAdded value: +"New display name; omit to leave the current name unchanged." - added
Input schema / properties / scope / descriptionAdded value: +"Registry scope the category belongs to, e.g. 'automation'."
- Changed
labels_update_label5 fields changed- added
Input schema / properties / color / descriptionAdded value: +"New label color name; omit to leave the current color unchanged." - added
Input schema / properties / description / descriptionAdded value: +"New free-text description; omit to leave the current description unchanged." - added
Input schema / properties / icon / descriptionAdded value: +"New mdi icon identifier, e.g. 'mdi:alert'; omit to leave the current icon unchanged." - added
Input schema / properties / label_id / descriptionAdded value: +"Label registry ID to update; obtain it from labels_list_labels." - added
Input schema / properties / name / descriptionAdded value: +"New display name; omit to leave the current name unchanged."
- Changed
search_deep_search2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ranked results to return; defaults to 20." - added
Input schema / properties / query / descriptionAdded value: +"Search text to fuzzy-match across entities, devices and areas."
- Changed
search_find_related1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Entity ID to look up, e.g. 'light.kitchen'; must exist in the entity registry."
- Changed
search_search_areas2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ranked results to return; defaults to 20." - added
Input schema / properties / query / descriptionAdded value: +"Search text to fuzzy-match against area names."
- Changed
search_search_devices2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ranked results to return; defaults to 20." - added
Input schema / properties / query / descriptionAdded value: +"Search text to fuzzy-match against a device's name, name_by_user, manufacturer and model."
- Changed
search_search_entities2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ranked results to return; defaults to 20." - added
Input schema / properties / query / descriptionAdded value: +"Search text to fuzzy-match against entity_id, friendly_name and device_id."
- Changed
services_call_service4 fields changed- added
Input schema / properties / confirmAdded 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" +} - added
Input schema / properties / data / descriptionAdded value: +"Service data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data." - added
Input schema / properties / domain / descriptionAdded value: +"Service domain to call, e.g. 'light' or 'climate'." - added
Input schema / properties / service / descriptionAdded value: +"Service name within the domain, e.g. 'turn_on' or 'set_temperature'."
- Changed
services_camera_record3 fields changed- added
Input schema / properties / duration / descriptionAdded value: +"Recording length in seconds." - added
Input schema / properties / entity_id / descriptionAdded value: +"Full camera entity ID to record, e.g. 'camera.front_door'." - added
Input schema / properties / filename / descriptionAdded value: +"Destination path inside the HA config directory, e.g. '/config/www/snapshots/clip.mp4'. Overwrites any existing file there."
- Changed
services_camera_snapshot2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full camera entity ID to capture, e.g. 'camera.front_door'." - added
Input schema / properties / filename / descriptionAdded value: +"Destination path inside the HA config directory, e.g. '/config/www/snapshots/front.jpg'. Overwrites any existing file there."
- Changed
services_fire_event2 fields changed- added
Input schema / properties / event_data / descriptionAdded value: +"Event data payload delivered to listeners. Omit for no payload." - added
Input schema / properties / event_type / descriptionAdded value: +"Event type to fire, e.g. 'my_custom_event'."
- Changed
services_list_services1 field changed- added
Input schema / properties / domain / descriptionAdded value: +"Service domain filter, e.g. 'light'. Omit to list every domain."
- Changed
services_media_play_pause1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full media_player entity ID to control, e.g. 'media_player.living_room'."
- Changed
services_media_seek2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full media_player entity ID to seek, e.g. 'media_player.living_room'." - added
Input schema / properties / position / descriptionAdded value: +"Target playback position in seconds from the start of the current media."
- Changed
services_notify_persistent_create3 fields changed- added
Input schema / properties / message / descriptionAdded value: +"Notification body text to show in the HA UI." - added
Input schema / properties / notification_id / descriptionAdded value: +"Stable ID for later dismissal via services_notify_persistent_dismiss. Omit to create a new, unaddressable notification each call." - added
Input schema / properties / title / descriptionAdded value: +"Optional notification title. Omit for no title."
- Changed
services_notify_persistent_dismiss1 field changed- added
Input schema / properties / notification_id / descriptionAdded value: +"ID of the persistent notification to dismiss, as passed to services_notify_persistent_create."
- Changed
services_press_button1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full button entity ID to press, e.g. 'button.restart_service'."
- Changed
services_reload_config1 field changed- added
Input schema / properties / domain / descriptionAdded value: +"Domain to reload, e.g. 'automation', 'script' or 'scene'."
- Changed
services_render_template1 field changed- added
Input schema / properties / template / descriptionAdded value: +"Jinja2 template string to render, e.g. '{{ states(\"sensor.temp\") }}'."
- Changed
services_send_notification3 fields changed- added
Input schema / properties / message / descriptionAdded value: +"Notification body text to deliver." - added
Input schema / properties / target / descriptionAdded value: +"Notify service to use, e.g. 'mobile_app_phone' or 'notify.mobile_app_phone'. Omit to use the default 'notify' service." - added
Input schema / properties / title / descriptionAdded value: +"Optional notification title. Omit for no title."
- Changed
services_set_climate_mode2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full climate entity ID to change, e.g. 'climate.living_room'." - added
Input schema / properties / hvac_mode / descriptionAdded value: +"Target mode: one of heat, cool, auto, off, fan_only, dry."
- Changed
services_set_cover_position2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full cover entity ID to move, e.g. 'cover.living_room_blind'." - added
Input schema / properties / position / descriptionAdded value: +"Target position, 0 (closed) to 100 (open)."
- Changed
services_set_cover_tilt2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full cover entity ID to tilt, e.g. 'cover.living_room_blind'." - added
Input schema / properties / tilt_position / descriptionAdded value: +"Target tilt position, 0 (closed) to 100 (open)."
- Changed
services_set_light_color5 fields changed- added
Input schema / properties / brightness / descriptionAdded value: +"Target brightness, 0-255. Omit to leave brightness unchanged." - added
Input schema / properties / color_temp / descriptionAdded value: +"Deprecated mired color temperature. Converted to Kelvin; prefer color_temp_kelvin." - added
Input schema / properties / color_temp_kelvinAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Target color temperature in Kelvin. Omit to leave it unchanged." +} - added
Input schema / properties / entity_id / descriptionAdded value: +"Full light entity ID to change, e.g. 'light.kitchen'." - added
Input schema / properties / rgb_color / descriptionAdded value: +"Target RGB color as [r, g, b], each 0-255. Omit to leave color unchanged."
- Changed
services_set_volume2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Full media_player entity ID to change, e.g. 'media_player.living_room'." - added
Input schema / properties / volume / descriptionAdded value: +"Target volume level, 0.0 (silent) to 1.0 (maximum)."
- Changed
snapshot_get_area_snapshot2 fields changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID to scope the snapshot to; states, devices and entities outside this area are excluded." - added
Input schema / properties / summary / descriptionAdded value: +"If true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes."
- Changed
snapshot_get_snapshot7 fields changed- added
Input schema / properties / area_id / descriptionAdded value: +"Area registry ID; keeps only states/devices/entities assigned to this area, directly or via their device. Omit for no area filter." - added
Input schema / properties / domains / descriptionAdded value: +"Entity domain filter applied to the states/entities sections, e.g. ['light', 'climate']. Omit to include every domain." - added
Input schema / properties / include / descriptionAdded value: +"Sections to return. Omit for the default states/areas/devices/entities/integrations set. Valid values: states, areas, floors, devices, entities, integrations, config." - added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of states to return after filtering, for pagination on large setups. Omit for no limit." - added
Input schema / properties / offset / descriptionAdded value: +"Number of filtered states to skip before applying limit, for pagination. 0 starts from the first matching state." - added
Input schema / properties / state_fields / descriptionAdded 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." - added
Input schema / properties / summary / descriptionAdded value: +"If true, each state is reduced to entity_id/state/friendly_name. Set false for full attributes; ignored when state_fields is given."
- Changed
statistics_get_energy_statistics2 fields changed- added
Input schema / properties / days / descriptionAdded value: +"Number of days back from now to include, between 1 and 365." - added
Input schema / properties / period / descriptionAdded value: +"Aggregation bucket size passed to the underlying statistics query, e.g. 'day', 'week', 'month'."
- Changed
statistics_get_statistics5 fields changed- changed
Input schema / properties / end / descriptionPrevious value: -"end date/time (defaults to now)"New value: +"End of the range, same formats as `start`. Omit to use the current time." - changed
Input schema / properties / period / descriptionPrevious value: -"aggregation period — \"hour\", \"day\", \"week\", \"month\", \"5minute\""New value: +"Aggregation bucket size: one of '5minute', 'hour', 'day', 'week', 'month'." - changed
Input schema / properties / start / descriptionPrevious 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')." - changed
Input schema / properties / statistic_ids / descriptionPrevious 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`." - changed
Input schema / properties / types / descriptionPrevious 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']."
- Changed
statistics_get_statistics_metadata1 field changed- added
Input schema / properties / statistic_ids / descriptionAdded value: +"Statistic IDs to fetch metadata for, e.g. ['sensor.energy_consumption']. Discover valid values with `statistics_list_statistic_ids`."
- Changed
statistics_list_statistic_ids1 field changed- added
Input schema / properties / statistic_type / descriptionAdded value: +"Which kind of statistic to list: 'sum' for counters (energy, gas, water) or 'mean' for sensors (temperature, humidity)."
- Changed
supervisor_create_backup4 fields changed- added
Input schema / properties / addons / descriptionAdded value: +"Add-on slugs to include for a partial backup. Omit together with `folders` for a full backup of everything." - added
Input schema / properties / folders / descriptionAdded 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." - added
Input schema / properties / name / descriptionAdded value: +"Human-readable name to store on the new backup." - added
Input schema / properties / password / descriptionAdded value: +"Password to encrypt the backup with. Omit for an unencrypted backup."
- Changed
supervisor_delete_backup2 fields changed- added
Input schema / properties / confirmAdded 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" +} - added
Input schema / properties / slug / descriptionAdded value: +"Backup slug to delete, from `supervisor_list_backups`."
- Changed
supervisor_get_addon1 field changed- added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug, e.g. from `supervisor_list_addons`."
- Changed
supervisor_get_addon_logs2 fields changed- added
Input schema / properties / lines / descriptionAdded value: +"Maximum number of most-recent log lines to return. 100 by default; 0 or negative returns the full fetched log text." - added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug to fetch logs for, e.g. from `supervisor_list_addons`."
- Changed
supervisor_get_addon_stats1 field changed- added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug to fetch stats for, e.g. from `supervisor_list_addons`."
- Changed
supervisor_install_addon1 field changed- added
Input schema / properties / slug / descriptionAdded 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)."
- Changed
supervisor_restart_addon1 field changed- added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug to restart, e.g. from `supervisor_list_addons`."
- Changed
supervisor_restart_core1 field changed- added
Input schema / properties / confirm / descriptionAdded value: +"Set true to actually restart Core. False (default) performs no action."
- Changed
supervisor_restart_host1 field changed- added
Input schema / properties / confirm / descriptionAdded value: +"Set true to actually reboot the host. False (default) performs no action."
- Changed
supervisor_restore_backup3 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Set true to actually restore the backup. False (default) performs no action." - added
Input schema / properties / password / descriptionAdded value: +"Password for an encrypted backup. Omit for an unencrypted one." - added
Input schema / properties / slug / descriptionAdded value: +"Backup slug to restore, from `supervisor_list_backups`."
- Changed
supervisor_set_addon_options2 fields changed- added
Input schema / properties / options / descriptionAdded 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." - added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug whose options to set, e.g. from `supervisor_list_addons`."
- Changed
supervisor_start_addon1 field changed- added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug to start, e.g. from `supervisor_list_addons`."
- Changed
supervisor_stop_addon1 field changed- added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug to stop, e.g. from `supervisor_list_addons`."
- Changed
supervisor_uninstall_addon2 fields changed- added
Input schema / properties / confirm / descriptionAdded value: +"Set true to actually uninstall the add-on and its data. False (default) performs no action." - added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug to uninstall, e.g. from `supervisor_list_addons`."
- Changed
supervisor_update_addon1 field changed- added
Input schema / properties / slug / descriptionAdded value: +"Add-on slug to update, e.g. from `supervisor_list_addons`."
- Changed
system_get_updates1 field changed- changed
Input schema / properties / pending_only / descriptionPrevious 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."
- Changed
system_reload_integration1 field changed- added
Input schema / properties / entry_id / descriptionAdded value: +"Config entry ID to reload, from `system_list_integrations` or `system_get_all_integrations`."
- Changed
system_restart_ha1 field changed- added
Input schema / properties / confirm / descriptionAdded value: +"Set true to actually restart HA. False (default) performs no restart and instead returns a confirmation prompt."
- Changed
system_stop_ha1 field changed- added
Input schema / properties / confirm / descriptionAdded value: +"Set true to actually stop HA. False (default) performs no action and instead returns a confirmation prompt."
- Changed
themes_create_theme4 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Theme name, becomes the filename themes/<name>.yaml without the extension." - added
Input schema / properties / overwrite / descriptionAdded value: +"If true, replaces an existing theme file instead of failing; defaults to false." - added
Input schema / properties / reload / descriptionAdded value: +"If true, calls frontend.reload_themes after writing the file; defaults to true." - added
Input schema / properties / variables / descriptionAdded 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."
- Changed
themes_delete_theme2 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Theme name to delete; obtain it from themes_list_themes or themes_list_theme_files." - added
Input schema / properties / reload / descriptionAdded value: +"If true, calls frontend.reload_themes after deleting the file; defaults to true."
- Changed
themes_get_theme1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Theme name to look up, matching a key in themes_list_themes' `themes` map."
- Changed
themes_set_active_theme2 fields changed- added
Input schema / properties / mode / descriptionAdded value: +"Optional 'light' or 'dark' to also pin the color mode; any other value is ignored; omit to leave the mode as-is." - added
Input schema / properties / name / descriptionAdded value: +"Registered theme name to activate, e.g. 'default' or a custom theme name; defaults to 'default'."
- Changed
themes_update_theme4 fields changed- added
Input schema / properties / merge / descriptionAdded value: +"If true, shallow-merges variables into the existing top-level keys; if false, replaces the whole variable set; defaults to true." - added
Input schema / properties / name / descriptionAdded value: +"Theme name to update; obtain it from themes_list_themes or themes_list_theme_files." - added
Input schema / properties / reload / descriptionAdded value: +"If true, calls frontend.reload_themes after writing the file; defaults to true." - added
Input schema / properties / variables / descriptionAdded value: +"Variable map to apply; merged into or replacing the existing set depending on `merge`."
- Changed
todo_add_item4 fields changed- added
Input schema / properties / description / descriptionAdded value: +"Optional longer item description/notes. Omit for none." - added
Input schema / properties / due_date / descriptionAdded value: +"Optional due date ('YYYY-MM-DD') or datetime ISO string. Omit for no due date." - added
Input schema / properties / entity_id / descriptionAdded value: +"Todo list entity ID to add the item to, e.g. 'todo.shopping_list'." - added
Input schema / properties / item / descriptionAdded value: +"Item text, e.g. 'Buy milk'."
- Changed
todo_list_items2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Todo list entity ID, e.g. 'todo.shopping_list', from `todo_list_todo_lists`." - added
Input schema / properties / status / descriptionAdded value: +"Client-side status filter: 'needs_action', 'completed', or 'all' for no filter."
- Changed
todo_remove_item2 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Todo list entity ID the item belongs to, e.g. 'todo.shopping_list'." - added
Input schema / properties / uid / descriptionAdded value: +"Item UID to remove, as returned by `todo_list_items`."
- Changed
todo_update_item4 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Todo list entity ID the item belongs to, e.g. 'todo.shopping_list'." - added
Input schema / properties / item / descriptionAdded value: +"New item text. Omit to keep the current text." - added
Input schema / properties / status / descriptionAdded value: +"New status: 'needs_action' or 'completed'. Omit to keep the current status." - added
Input schema / properties / uid / descriptionAdded value: +"Item UID to update, as returned by `todo_list_items`."
- Changed
voice_create_pipeline11 fields changed- added
Input schema / properties / conversation_engine / descriptionAdded value: +"Entity ID of the conversation agent, e.g. 'homeassistant' for the built-in agent." - added
Input schema / properties / conversation_language / descriptionAdded value: +"Language code for the conversation agent, e.g. 'en' or 'pl'." - added
Input schema / properties / language / descriptionAdded value: +"Overall pipeline language code, e.g. 'en' or 'pl'." - added
Input schema / properties / name / descriptionAdded value: +"Display name for the new pipeline, e.g. 'Kitchen Assist'." - added
Input schema / properties / stt_engine / descriptionAdded 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`." - added
Input schema / properties / stt_language / descriptionAdded value: +"Language code for the STT engine. Omit to use its default." - added
Input schema / properties / tts_engine / descriptionAdded 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`." - added
Input schema / properties / tts_language / descriptionAdded value: +"Language code for the TTS engine. Omit to use its default." - added
Input schema / properties / tts_voice / descriptionAdded value: +"Voice ID for the TTS engine. Omit to use its default voice." - added
Input schema / properties / wake_word_entity / descriptionAdded 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`." - added
Input schema / properties / wake_word_id / descriptionAdded value: +"Specific wake word model ID within `wake_word_entity`. Omit for its default."
- Changed
voice_delete_pipeline1 field changed- added
Input schema / properties / pipeline_id / descriptionAdded value: +"ID of the pipeline to delete, from `voice_list_pipelines`."
- Changed
voice_get_pipeline1 field changed- added
Input schema / properties / pipeline_id / descriptionAdded value: +"Pipeline ID to fetch, from `voice_list_pipelines`. Omit to return the current preferred pipeline instead."
- Changed
voice_set_preferred_pipeline1 field changed- added
Input schema / properties / pipeline_id / descriptionAdded value: +"ID of the pipeline to make preferred, from `voice_list_pipelines`."
- Changed
voice_update_pipeline12 fields changed- added
Input schema / properties / conversation_engine / descriptionAdded value: +"New conversation agent entity ID. Omit to keep the current one." - added
Input schema / properties / conversation_language / descriptionAdded value: +"New conversation language code. Omit to keep the current one." - added
Input schema / properties / language / descriptionAdded value: +"New overall pipeline language code. Omit to keep the current one." - added
Input schema / properties / name / descriptionAdded value: +"New display name. Omit to keep the current name." - added
Input schema / properties / pipeline_id / descriptionAdded value: +"ID of the pipeline to update, from `voice_list_pipelines`." - added
Input schema / properties / stt_engine / descriptionAdded value: +"New STT engine entity ID. Omit to keep the current one." - added
Input schema / properties / stt_language / descriptionAdded value: +"New STT language code. Omit to keep the current one." - added
Input schema / properties / tts_engine / descriptionAdded value: +"New TTS engine entity ID. Omit to keep the current one." - added
Input schema / properties / tts_language / descriptionAdded value: +"New TTS language code. Omit to keep the current one." - added
Input schema / properties / tts_voice / descriptionAdded value: +"New TTS voice ID. Omit to keep the current one." - added
Input schema / properties / wake_word_entity / descriptionAdded value: +"New wake-word detector entity ID. Omit to keep the current one." - added
Input schema / properties / wake_word_id / descriptionAdded value: +"New wake word model ID. Omit to keep the current one."
- Changed
ws_call_service4 fields changed- added
Input schema / properties / data / descriptionAdded value: +"Service data: fields plus targets (entity_id/area_id/device_id). Omit for a call that needs no data." - added
Input schema / properties / domain / descriptionAdded value: +"Service domain to call, e.g. 'weather' or 'calendar'." - added
Input schema / properties / service / descriptionAdded value: +"Service name within the domain, e.g. 'get_forecasts' or 'get_events'." - added
Input schema / properties / timeoutAdded 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" +}
- Changed
ws_get_config1 field changed- added
Input schema / properties / timeoutAdded 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" +}
- Changed
ws_get_states1 field changed- added
Input schema / properties / timeoutAdded 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" +}
- Changed
ws_listen_events5 fields changed- added
Input schema / properties / count / descriptionAdded value: +"Maximum number of events to collect before returning early." - added
Input schema / properties / event_type / descriptionAdded value: +"HA event type to subscribe to, e.g. 'zha_event' or 'call_service'." - added
Input schema / properties / timeout / descriptionAdded value: +"Maximum seconds to wait for `count` events before returning what arrived; must be between 1 and 300." - added
Input schema / properties / timeout / maximumAdded value: +300 - added
Input schema / properties / timeout / minimumAdded value: +1
- Changed
ws_listen_state_changes5 fields changed- added
Input schema / properties / count / descriptionAdded value: +"Maximum number of matching events to collect before returning early." - added
Input schema / properties / entity_id / descriptionAdded value: +"Full entity ID to watch for state changes, e.g. 'binary_sensor.motion'." - added
Input schema / properties / timeout / descriptionAdded value: +"Maximum seconds to wait for `count` matching events before returning what arrived; must be between 1 and 300." - added
Input schema / properties / timeout / maximumAdded value: +300 - added
Input schema / properties / timeout / minimumAdded value: +1
- Changed
ws_render_template2 fields changed- added
Input schema / properties / template / descriptionAdded value: +"Jinja2 template string to render, e.g. '{{ states(\"sensor.temp\") }}'." - added
Input schema / properties / timeoutAdded 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" +}
- Changed
ws_subscribe_trigger4 fields changed- added
Input schema / properties / timeout / descriptionAdded value: +"Maximum seconds to wait for the trigger to fire before returning None; must be between 1 and 300." - added
Input schema / properties / timeout / maximumAdded value: +300 - added
Input schema / properties / timeout / minimumAdded value: +1 - added
Input schema / properties / trigger / descriptionAdded value: +"HA trigger definition dict, e.g. {'platform': 'state', 'entity_id': 'binary_sensor.motion', 'to': 'on'}."
- Changed
zones_create_zone6 fields changed- added
Input schema / properties / icon / descriptionAdded value: +"Optional mdi icon identifier, e.g. 'mdi:office-building'; omit for none." - added
Input schema / properties / latitude / descriptionAdded value: +"Latitude in decimal degrees, e.g. 52.23." - added
Input schema / properties / longitude / descriptionAdded value: +"Longitude in decimal degrees, e.g. 21.01." - added
Input schema / properties / name / descriptionAdded value: +"Display name for the new zone, e.g. 'Office'." - added
Input schema / properties / passive / descriptionAdded value: +"If true, excludes the zone from device-tracker zone suggestions; defaults to false." - added
Input schema / properties / radius / descriptionAdded value: +"Zone radius in meters; defaults to 100."
- Changed
zones_delete_zone1 field changed- added
Input schema / properties / zone_id / descriptionAdded value: +"Zone helper id or full entity_id like 'zone.office'; obtain it from zones_list_zones."
- Changed
zones_get_user_location1 field changed- added
Input schema / properties / person_entity_id / descriptionAdded value: +"Person entity_id, e.g. 'person.alice'; a bare id like 'alice' is prefixed with 'person.' automatically."
- Changed
zones_get_zone1 field changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Zone entity_id, e.g. 'zone.office'; a bare id like 'office' is prefixed with 'zone.' automatically."
- Changed
zones_list_persons_in_zone1 field changed- added
Input schema / properties / zone_entity_id / descriptionAdded value: +"Zone entity_id, e.g. 'zone.home'; a bare id like 'home' is prefixed with 'zone.' automatically."
- Changed
zones_update_zone7 fields changed- added
Input schema / properties / entity_id / descriptionAdded value: +"Zone entity_id to update, e.g. 'zone.office'; obtain it from zones_list_zones." - added
Input schema / properties / icon / descriptionAdded value: +"New mdi icon identifier; omit to leave the current icon unchanged." - added
Input schema / properties / latitude / descriptionAdded value: +"New latitude in decimal degrees; omit to leave the current latitude unchanged." - added
Input schema / properties / longitude / descriptionAdded value: +"New longitude in decimal degrees; omit to leave the current longitude unchanged." - added
Input schema / properties / name / descriptionAdded value: +"New display name; omit to leave the current name unchanged." - added
Input schema / properties / passive / descriptionAdded value: +"New passive flag; omit to leave the current setting unchanged." - added
Input schema / properties / radius / descriptionAdded value: +"New zone radius in meters; omit to leave the current radius unchanged."
7 tool updates
v0.18.2- Added
esphome_lvgl_add_widget - Added
esphome_lvgl_delete_widget - Added
esphome_lvgl_get_page_widgets - Added
esphome_lvgl_get_pages - Added
esphome_lvgl_get_styles - Added
esphome_lvgl_list_devices - Added
esphome_lvgl_validate
85 tool updates
v0.18.1- Changed
automations_delete_automation1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "type": "boolean" +}
- Added
automations_delete_scene - Changed
automations_delete_script1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "type": "boolean" +}
- Added
automations_get_last_automation_trace - Added
automations_get_last_script_trace - Added
automations_get_scene_config - Added
automations_list_groups - Added
automations_remove_group - Added
automations_set_group - Added
automations_set_scene_config - Added
automations_validate_automation_references - Added
automations_validate_best_practices - Added
card_builder_build_from_recipe - Added
card_builder_build_styles - Added
card_builder_check_schema_sync - Added
card_builder_create_card - Added
card_builder_create_css_custom_property - Added
card_builder_create_style_preset - Added
card_builder_delete_card - Added
card_builder_delete_css_custom_property - Added
card_builder_delete_media - Added
card_builder_delete_style_preset - Added
card_builder_design_for_intent - Added
card_builder_design_principles - Added
card_builder_get_block_schema - Added
card_builder_get_card - Added
card_builder_get_card_template - Added
card_builder_get_design_pattern - Added
card_builder_get_style_snippet - Added
card_builder_list_block_types - Added
card_builder_list_button_toggle_features - Added
card_builder_list_card_templates - Added
card_builder_list_cards - Added
card_builder_list_css_custom_properties - Added
card_builder_list_design_patterns - Added
card_builder_list_media - Added
card_builder_list_style_categories - Added
card_builder_list_style_presets - Added
card_builder_list_style_snippets - Added
card_builder_list_style_targets - Added
card_builder_make_template_card - Added
card_builder_recipe_guide - Added
card_builder_renderer_card_config - Added
card_builder_update_card - Added
card_builder_update_style_preset - Added
card_builder_upload_image_from_url - Added
card_builder_upload_media - Added
card_builder_upload_media_from_path - Added
card_builder_upload_svg - Added
card_builder_validate_config - Added
dashboards_add_dashboard_resource - Added
dashboards_remove_dashboard_resource - Added
dashboards_screenshot - Added
dashboards_update_dashboard_resource - Added
discover_get_tool_doc - Added
discover_list_namespaces - Added
discover_refresh_index - Added
discover_tool_search - Added
entities_bulk_set_entity_exposure - Changed
entities_list_entities4 fields changed- added
Input schema / properties / domain / descriptionAdded value: +"Filter by domain prefix (e.g. 'light', 'sensor')." - added
Input schema / properties / fieldsAdded 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." +} - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Max number of results. Omit for all." +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Skip first N results (pagination).", + "type": "integer" +}
- Added
esphome_clean_mqtt - Added
esphome_compile_device - Added
esphome_get_addon_info - Added
esphome_get_addon_logs - Added
esphome_get_config - Added
esphome_get_device_entities - Added
esphome_list_devices - Added
esphome_ping_dashboard - Added
esphome_upload_device - Added
esphome_validate_config - Added
esphome_write_config - Changed
git_git_rollback_file1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "type": "boolean" +}
- Changed
git_git_rollback_to_commit1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "type": "boolean" +}
- Changed
integrations_remove_integration1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "type": "boolean" +}
- Added
snapshot_get_area_snapshot - Added
snapshot_get_snapshot - Added
statistics_get_energy_statistics - Added
statistics_get_statistics - Added
statistics_get_statistics_metadata - Added
statistics_list_statistic_ids - Added
system_get_repairs - Added
system_get_system_health - Added
system_get_updates - Changed
system_restart_ha1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "type": "boolean" +}
- Changed
system_stop_ha1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "type": "boolean" +}
31 tool updates
v0.4.0- Added
integrations_abort_config_flow - Added
integrations_abort_options_flow - Added
integrations_disable_integration - Added
integrations_enable_integration - Added
integrations_get_config_flow - Added
integrations_list_flow_handlers - Added
integrations_list_flows_in_progress - Added
integrations_remove_integration - Added
integrations_start_config_flow - Added
integrations_start_options_flow - Added
integrations_submit_config_flow_step - Added
integrations_submit_options_flow_step - Added
integrations_update_integration_entry - Added
themes_create_theme - Added
themes_delete_theme - Added
themes_get_theme - Added
themes_list_theme_files - Added
themes_list_themes - Added
themes_reload_themes - Added
themes_set_active_theme - Added
themes_update_theme - Added
voice_create_pipeline - Added
voice_delete_pipeline - Added
voice_get_pipeline - Added
voice_list_conversation_agents - Added
voice_list_pipelines - Added
voice_list_stt_engines - Added
voice_list_tts_engines - Added
voice_list_wake_word_engines - Added
voice_set_preferred_pipeline - Added
voice_update_pipeline
202 tool updates
v0.3.0- First observed
areas_control_area - First observed
areas_create_area - First observed
areas_delete_area - First observed
areas_get_area_entities - First observed
areas_get_area_states - First observed
areas_list_areas - First observed
areas_list_devices - First observed
areas_list_floors - First observed
automations_activate_scene - First observed
automations_delete_automation - First observed
automations_delete_script - First observed
automations_disable_automation - First observed
automations_enable_automation - First observed
automations_get_automation_config - First observed
automations_get_automation_trace - First observed
automations_get_script_config - First observed
automations_get_script_trace - First observed
automations_list_automation_traces - First observed
automations_list_automations - First observed
automations_list_scenes - First observed
automations_list_script_traces - First observed
automations_list_scripts - First observed
automations_reload_automations - First observed
automations_reload_scenes - First observed
automations_reload_scripts - First observed
automations_run_script - First observed
automations_set_automation_config - First observed
automations_set_script_config - First observed
automations_trigger_automation - First observed
blueprints_delete_blueprint - First observed
blueprints_import_blueprint - First observed
blueprints_list_blueprints - First observed
blueprints_substitute_blueprint - First observed
calendar_create_event - First observed
calendar_delete_event - First observed
calendar_list_calendars - First observed
calendar_list_events - First observed
dashboards_add_card_to_view - First observed
dashboards_add_view_to_dashboard - First observed
dashboards_get_dashboard_config - First observed
dashboards_get_dashboard_resources - First observed
dashboards_list_dashboards - First observed
dashboards_save_dashboard_config - First observed
devices_list_devices - First observed
devices_list_devices_in_area - First observed
devices_remove_device - First observed
devices_update_device - First observed
energy_add_battery_source - First observed
energy_add_grid_consumption - First observed
energy_add_grid_return - First observed
energy_add_solar_source - First observed
energy_get_energy_info - First observed
energy_get_energy_prefs - First observed
energy_remove_energy_source - First observed
energy_save_energy_prefs - First observed
energy_validate_energy_prefs - First observed
entities_assign_entity_to_area - First observed
entities_bulk_control - First observed
entities_bulk_set_state - First observed
entities_disable_entity - First observed
entities_enable_entity - First observed
entities_get_entity - First observed
entities_get_entity_exposure - First observed
entities_list_entities - First observed
entities_list_entity_registry - First observed
entities_list_exposed_entities - First observed
entities_select_option - First observed
entities_set_entity_exposure - First observed
entities_set_value - First observed
entities_toggle - First observed
entities_turn_off - First observed
entities_turn_on - First observed
entities_update_entity_name - First observed
files_append_to_config_file - First observed
files_delete_config_file - First observed
files_list_config_files - First observed
files_read_config_file - First observed
files_validate_yaml_content - First observed
files_write_config_file - First observed
git_git_checkout_branch - First observed
git_git_commit_all - First observed
git_git_create_branch - First observed
git_git_diff - First observed
git_git_init_config - First observed
git_git_list_branches - First observed
git_git_log - First observed
git_git_rollback_file - First observed
git_git_rollback_to_commit - First observed
git_git_status - First observed
git_safe_write_with_checkpoint - First observed
hacs_add_custom_repository - First observed
hacs_get_hacs_repository - First observed
hacs_install_hacs_repository - First observed
hacs_list_hacs_critical_updates - First observed
hacs_list_hacs_repositories - First observed
hacs_uninstall_hacs_repository - First observed
hacs_update_hacs_repository - First observed
helpers_cancel_timer - First observed
helpers_increment_counter - First observed
helpers_list_helpers - First observed
helpers_reload_helpers - First observed
helpers_reset_counter - First observed
helpers_set_input_boolean - First observed
helpers_set_input_datetime - First observed
helpers_set_input_number - First observed
helpers_set_input_select - First observed
helpers_set_input_text - First observed
helpers_start_timer - First observed
history_get_error_log - First observed
history_get_ha_config - First observed
history_get_logbook - First observed
history_get_state_history - First observed
history_get_system_info - First observed
labels_assign_label_to_device - First observed
labels_assign_label_to_entity - First observed
labels_create_category - First observed
labels_create_label - First observed
labels_delete_category - First observed
labels_delete_label - First observed
labels_list_categories - First observed
labels_list_devices_with_label - First observed
labels_list_entities_with_label - First observed
labels_list_labels - First observed
labels_remove_label_from_device - First observed
labels_remove_label_from_entity - First observed
labels_update_category - First observed
labels_update_label - First observed
search_deep_search - First observed
search_find_orphan_devices - First observed
search_find_related - First observed
search_find_unused_entities - First observed
search_search_areas - First observed
search_search_devices - First observed
search_search_entities - First observed
services_call_service - First observed
services_camera_record - First observed
services_camera_snapshot - First observed
services_fire_event - First observed
services_list_services - First observed
services_media_play_pause - First observed
services_media_seek - First observed
services_notify_persistent_create - First observed
services_notify_persistent_dismiss - First observed
services_notify_persistent_dismiss_all - First observed
services_press_button - First observed
services_reload_config - First observed
services_render_template - First observed
services_send_notification - First observed
services_set_climate_mode - First observed
services_set_cover_position - First observed
services_set_cover_tilt - First observed
services_set_light_color - First observed
services_set_volume - First observed
supervisor_create_backup - First observed
supervisor_delete_backup - First observed
supervisor_get_addon - First observed
supervisor_get_addon_logs - First observed
supervisor_get_addon_stats - First observed
supervisor_get_core_info - First observed
supervisor_get_host_info - First observed
supervisor_get_supervisor_info - First observed
supervisor_install_addon - First observed
supervisor_list_addons - First observed
supervisor_list_backups - First observed
supervisor_restart_addon - First observed
supervisor_restart_core - First observed
supervisor_restart_host - First observed
supervisor_restore_backup - First observed
supervisor_set_addon_options - First observed
supervisor_start_addon - First observed
supervisor_stop_addon - First observed
supervisor_uninstall_addon - First observed
supervisor_update_addon - First observed
system_check_config - First observed
system_create_backup - First observed
system_get_all_integrations - First observed
system_list_integrations - First observed
system_ping_ha - First observed
system_reload_all - First observed
system_reload_integration - First observed
system_restart_ha - First observed
system_stop_ha - First observed
todo_add_item - First observed
todo_list_items - First observed
todo_list_todo_lists - First observed
todo_remove_item - First observed
todo_update_item - First observed
ws_call_service - First observed
ws_get_config - First observed
ws_get_states - First observed
ws_listen_events - First observed
ws_listen_state_changes - First observed
ws_render_template - First observed
ws_subscribe_trigger - First observed
zones_create_zone - First observed
zones_delete_zone - First observed
zones_get_user_location - First observed
zones_get_zone - First observed
zones_list_persons_in_zone - First observed
zones_list_zones - First observed
zones_reload_zones - First observed
zones_update_zone
TDQS
Scored across 323 tools
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.
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.
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.
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
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
One MCP endpoint for Claude, GPT & Gemini: 100+ tools + no-code connectors + agent workers.
The OpenRouter MCP server plugs OpenRouter into the AI tools you already use. Once connected, your assistant can pull live OpenRouter data (models, prices, your credits, rankings, and docs) and send quick test messages, all without leaving your editor.
Related MCP Servers
- AlicenseBqualityCmaintenanceMCP server for full Home Assistant control, enabling AI agents to manage dashboards, automations, files, apps, entities, and more via REST API, WebSocket, and SSH.6696 npmMIT
- AlicenseAqualityCmaintenanceA 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.983 npmMIT
- AlicenseAqualityBmaintenanceAn MCP server exposing 72 tools across 26 homelab services, enabling LLMs to monitor and manage infrastructure, media, storage, and networking with a single endpoint.16MIT
- AlicenseAqualityAmaintenanceA 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.7744,239 PyPI5,046MIT