Skip to main content
Glama
Vortitron

home-assistant-mcp

by Vortitron

home-assistant-mcp

A Model Context Protocol (MCP) server that lets coding agents — Cursor, VS Code (Copilot), Claude Desktop and anything else that speaks MCP — talk directly to Home Assistant and (optionally) the ESPHome dashboard.

Instead of copy-pasting entity ids, YAML and current values into your agent, the agent can discover entities, read live state, render templates, call services and edit automations itself — and iterate until the code actually works.

License: MIT

Claude Code asked to set two lights to 40% and switch a socket on; the dashboard pane beside it lights them up as the home reports the change.

In Claude Code, four side panes show what Claude is doing to your home as it happens: the automation it is working on, the ESPHome device it is building, the home's health score and a dashboard that works. One command installs all four (below).

Part of the Vome family and an open-source companion to VomeHome (managed Home Assistant). It is useful stand-alone for any Home Assistant user.


Why

A typical "change an automation" loop today looks like: you tell the agent which entities exist, paste their current values, paste the YAML, apply the change, then manually check whether it worked. With this server the agent does all of that:

  • See — list entities/areas/devices, read exact states and attributes, pull history and the logbook.

  • Experiment — render Jinja templates against live state, check configuration, read the error log.

  • Change — call services, create/update/delete/trigger automations, and (for ESPHome) edit, validate, compile and flash device firmware.

All write operations are off by default and gated behind an explicit safety policy (see Safety).


Related MCP server: Home Assistant MCP Server

Tools

Home Assistant — read

Tool

Description

ha_get_config

Core config: version, location, time zone, loaded components.

ha_list_entities

List entities (filter by domain, free-text search, area).

ha_get_state

Full state + attributes for one or more entities.

ha_get_history

Historical state changes over a time window. Given only a start time, it runs up to now (Home Assistant alone stops 24 hours after the start); ha_get_logbook does the same.

ha_list_services

Available services (and their fields for a given domain).

ha_list_areas

Areas (rooms/zones).

ha_list_devices

Device registry (filter by area / search).

ha_get_entity_registry

Registry metadata: platform, area, device, disabled/hidden.

ha_render_template

Render a Jinja2 template against live state.

ha_list_helpers

List stored helpers (input_boolean, input_number, counter, timer, …).

ha_list_automations

Automations with entity_id, unique id, state, last-triggered.

ha_get_automation

Full automation config (triggers/conditions/actions).

ha_check_config

Validate the configuration (Check configuration).

ha_get_system_log

Deduplicated, structured errors — level, logger, source, count, first/last seen. Start here.

ha_get_error_log

Tail of the raw Home Assistant error log.

ha_get_supervisor_log

Add-on / Core / Supervisor / host logs (HAOS or Supervised).

ha_camera_image

A camera's current still, as an image the agent can see. Via VomeHome the key needs Cameras ticked.

ha_camera_frame

A camera still decoded and shrunk to a small grid of RGB pixels, for clients that draw pictures in text.

ha_view_snapshot

Everything a dashboard view shows in one call: states, rendered templates, history in few points, camera frames. For dashboard clients.

ha_watch_states

Wait for state changes instead of polling: the home's Vome component sends them as they happen (through VomeHome).

ha_get_logbook

Human-readable logbook entries.

ha_list_traces

Recent automation/script runs and how each one stopped.

ha_get_trace

Step-by-step detail for one run, with failed_at naming the blocking step.

Home Assistant — write (write-gated)

Write-gating depends on the mode. In direct mode the MCP is the only guard, so these refuse until HA_ALLOW_WRITE=true. In brokered mode your VomeHome API key carries the per-instance ha:write / ha:config scopes and the server enforces them, so the client flags are optional local-only restrictions.

Tool

Description

ha_call_service

Call any service (turn_on, set_temperature, …).

ha_clear_system_log

Empty the structured error store (only needs HA_ALLOW_WRITE).

ha_set_log_level

Change logging for one integration at runtime (only needs HA_ALLOW_WRITE).

ha_set_automation

Create or update an automation (also needs HA_ALLOW_CONFIG_WRITE).

ha_set_helper

Create or update a helper — no configuration.yaml, no restart.

ha_read_config_file

Read a file under the config directory — text by default, or encoding: 'base64' for a binary asset (needs ha:files).

ha_write_config_file

Replace a file under the config directory — text by default, or encoding: 'base64' for a binary asset; checks the config and restores the file if it fails (needs ha:files).

ha_delete_config_file

Delete one file under the config directory. Never a directory, and never configuration.yaml, secrets.yaml or Home Assistant's database. Names its target home like a write (needs ha:files, and Vome add-on 0.3.55 / integration 0.9.39 on the home).

ha_edit_config_file

Change part of a text file in place: exact find-and-replace edits that must each match once, then the same check-and-restore as a write. For a three-line change to a large file (needs ha:files).

ha_list_config_files

List a directory under the config directory (needs ha:files).

ha_delete_helper

Delete a stored helper. Refuses when the id looks shared with a configuration.yaml helper, because Home Assistant would take that entity down with it.

ha_delete_automation

Delete an automation (also needs HA_ALLOW_CONFIG_WRITE).

ha_get_script / ha_set_script / ha_delete_script

Scripts by id, the same way as automations: put a step several automations share in one script. Writes need HA_ALLOW_CONFIG_WRITE.

ha_update_entity

Rename, re-id, move, re-icon, disable or hide an entity in the registry (needs HA_ALLOW_CONFIG_WRITE).

ha_remove_entity

Remove an orphaned registry entry (needs HA_ALLOW_CONFIG_WRITE).

ha_matter_reinterview

The Matter device page's Re-interview, for a device whose endpoints changed after a firmware update (needs HA_ALLOW_CONFIG_WRITE).

ha_trigger_automation

Manually run an automation now.

ha_reload_automations

Reload automations without restarting.

Lovelace dashboards (direct HA or VomeHome brokered)

Tool

What it does

ha_list_dashboards

List dashboards (url_path, title, mode, sidebar).

ha_get_dashboard

Read one dashboard's full config (views, cards, …).

ha_save_dashboard

Save/replace a dashboard config (needs HA_ALLOW_CONFIG_WRITE).

ha_create_dashboard

Register a new storage-mode dashboard (needs HA_ALLOW_CONFIG_WRITE).

ha_delete_dashboard

Delete a dashboard by id (needs HA_ALLOW_CONFIG_WRITE).

Dashboards use Home Assistant's WebSocket API. In brokered mode VomeHome proxies an allowlisted subset via POST /api/v1/instances/<id>/ha/ws/command. | ha_fire_event | Fire a custom event on the event bus. |

ESPHome (brokered to a relay-connected HA)

Tool

Description

esphome_dashboard_info

How ESPHome is reached, and whether flashing/logs are available right now.

esphome_list_devices

List dashboard configurations/devices; flags configs needing renames.

esphome_list_migrations

ESPHome spellings a config still uses that have been renamed.

esphome_get_config

Read a configuration's YAML.

esphome_save_config

Write a configuration's YAML, whole: for a new file (write-gated).

esphome_edit_config

Change part of a configuration in place with exact find-and-replace edits, so a long file is not resent (write-gated).

vome_health_report

Vome's health score for the home and every finding, with severity, evidence, a recommendation and the entities involved.

vome_health_check

Run a fresh health check, to re-score after fixes (write-gated).

esphome_validate

Validate a configuration.

esphome_compile

Compile firmware.

esphome_upload

Compile + flash a device over the air; validates first (write-gated).

esphome_logs

Read a device's live logs — boot, wifi, sensors, crashes.

esphome_clean

Delete cached build files after a stale-build compile failure (write-gated).

There is nothing to configure. Every command — builds and logs included — goes through the VomeHome relay, so ESPHome works wherever brokered Home Assistant does, with no port to open.

There is also no second way in. The ESPHome add-on is host-networked with its web port disabled, behind an ingress that admits only the Supervisor and localhost, so the Vome component on the home is the only thing that can reach the dashboard at all. A direct-dashboard mode existed once (ESPHOME_DASHBOARD_URL) and was removed in 0.6.0: it spoke a protocol ESPHome has since deleted, and on a default install it could not connect anyway.

Node-RED (NODERED_URL)

Node-RED is the flow-based editor that ships as a Home Assistant add-on. It is powerful but fiddly to edit by hand — so let the agent read and write the flow JSON for you. Flows are stored as a JSON array of nodes grouped into tabs; these tools work a tab at a time (safe) or on the whole config (deliberate). Writes are gated behind the same switches as editing HA automations (HA_ALLOW_WRITE + HA_ALLOW_CONFIG_WRITE).

Tool

Description

nodered_get_flows

Get the full flow config (all tabs) plus the current revision.

nodered_get_flow

Get one flow (tab) and its nodes by id.

nodered_list_nodes

List installed node modules/types (the palette).

nodered_create_flow

Add a new tab without disturbing existing flows (write-gated).

nodered_update_flow

Replace one tab by id, leaving others untouched (write-gated).

nodered_delete_flow

Delete a tab and its nodes (write-gated).

nodered_set_flows

Replace the entire flow config and deploy (write-gated).

VomeHome (require VOMEHOME_TOKEN)

VomeHome is managed Home Assistant hosting. Log in to the portal with GitHub, mint a personal access token under Account → API tokens, and the agent can manage your instances from the editor. Advanced management stays behind a full browser login on the portal.

Tool

Description

vomehome_list_instances

List your HA instances with status, tier, URL, live health, the active instance and per-instance client write/config access.

vomehome_get_instance

Details + live status for one instance.

vomehome_use_instance

Switch which instance the ha_* tools target (multi-instance — see Several instances from one token).

vomehome_reboot_instance

Reboot an instance's VM (write-gated).

vomehome_create_instance

Create a throwaway test/sandbox instance (needs the create scope on your API key; the creating key is granted full HA access on the new instance, which becomes the active target).

vomehome_get_login_url

Mint a one-click HA login URL to open in a new tab.

vomehome_create_guest_link

Create a non-admin HA user + one-click login URL for sharing (needs HA_ALLOW_CONFIG_WRITE). Vome-hosted instances only.

vomehome_list_guest_links

List guest links for an instance, revoked ones included.

vomehome_revoke_guest_link

Revoke a guest link immediately.

Guest links are self-serve, revocable sharing: a non-admin (unless you pass admin: true) Home Assistant account plus a one-click login URL, minted and torn down on demand, without handing out the owner's own credentials. They only work for Vome-hosted instances — minting a token for someone other than the owner needs direct network access to the VM, which a self-hosted/relay-linked instance doesn't offer the portal.

Home Assistant's permission model is coarse. A non-admin guest is locked out of Settings and Developer Tools, but can still call services on any entity the dashboard shows them — there is no per-entity guest scoping in Home Assistant itself. A guest link is safe on a dedicated demo/sandbox instance built to be poked at. It is not a substitute for real access control on somebody's actual house — don't point one at one. The link auto-expires (expires_in, default 24h, capped at 30 days — Home Assistant's own long-lived tokens never expire on their own, so Vome enforces this) and can be revoked early at any time.

Integrations & config entries

Tool

Description

ha_list_config_entries

List installed integrations (config entries). Optional domain filter.

ha_delete_config_entry

Delete a config entry by id — the fix for an orphaned/duplicate entry left behind after a device was removed, which is otherwise why a re-added device's entities pick up a _2 suffix. Needs HA_ALLOW_CONFIG_WRITE.

ha_list_discovery_flows

List integrations Home Assistant has discovered on the network but not yet added.

ha_config_flow

Start (handler) or continue (flow_id + user_input) an integration's config flow. Needs HA_ALLOW_CONFIG_WRITE.

ha_config_entry_options

Read or set an integration's options — including ESPHome's allow_service_calls.

ha_integration_setup_vome

Add the Vome (vomesync) config entry with default settings, idempotently.

Supervisor / Vome add-on (HAOS / Supervised)

Tool

Description

ha_supervisor_api

Call a Supervisor endpoint via supervisor/api (store, add-ons, …).

ha_addon_install_vome

Add https://github.com/Vortitron/VomeSync to the store, install Vome, and start it.

HACS (Home Assistant Community Store)

Tool

Description

ha_hacs_info

HACS version, stage, and whether it has pending background tasks.

ha_hacs_list_repositories

List repositories HACS knows about (optionally filtered by category).

ha_hacs_add_repository

Add a custom repository by owner/repo and category. Confirms by re-listing, since HACS acks even a failed add. Needs HA_ALLOW_CONFIG_WRITE.

ha_hacs_download_repository

Install (or update) a tracked repository — the step that actually writes its files. Needs HA_ALLOW_CONFIG_WRITE.

ha_hacs_remove_repository

Uninstall a repository's files and stop tracking it. Needs HA_ALLOW_CONFIG_WRITE.

There is no REST API or service call for managing HACS repositories — these go over HACS's own WebSocket commands (hacs/*), the same way as the Supervisor tools above. Adding a repository only registers it; call ha_hacs_download_repository afterwards to install it, and restart Home Assistant if it's a new integration or add-on domain.

Users

Tool

Description

ha_list_users

List every user: id, name, username, role, active/owner status.

ha_create_user

Create a user with a role (admin / user / read_only) but no login yet. Needs HA_ALLOW_CONFIG_WRITE.

ha_update_user

Change a user's name, role, active state, or local-only restriction. Needs HA_ALLOW_CONFIG_WRITE.

ha_delete_user

Permanently delete a user and its login. Needs HA_ALLOW_CONFIG_WRITE.

ha_set_user_credentials

Give a user with no login yet a username/password. Needs HA_ALLOW_CONFIG_WRITE.

ha_change_user_password

Reset the password for a user that already has a login. Needs HA_ALLOW_CONFIG_WRITE.

ha_remove_user_credentials

Remove a login without deleting the user. Needs HA_ALLOW_CONFIG_WRITE.

ha_provision_service_login

Give a program (an MQTT client, a Zigbee bridge, an ESPHome device) its own non-admin login and write the password straight into its add-on options or a secrets file. The password is generated here and never returned. Needs HA_ALLOW_CONFIG_WRITE, plus ha:files for secrets files.

A user + password these tools create is a standing Home Assistant login, independent of any VomeHome API key. Revoking the key that created it does not remove the account — unlike everything else in this server, which acts through the calling key and stops working the moment it's revoked. Treat granting ha:config on an instance as equivalent to trusting the holder with permanent account creation on that home. role has no default on ha_create_user; it must be chosen explicitly rather than silently landing on admin.

Logins for programs: ha_provision_service_login. Wiring a device into a home usually stops at one step: someone invents a password and types it into two places. ha_set_user_credentials makes the caller choose it, which an agent should not be doing. This tool generates it instead (128 bits), writes it into the consumer's add-on options (e.g. mqtt.user / mqtt.password) and/or a secrets file, and replies with where it went, never what it is. The Mosquitto add-on accepts Home Assistant logins, so one call wires an MQTT client. It checks every target before creating anything, deletes a new login that could be delivered nowhere, never makes an admin, is local-only by default, and with rotate=true re-issues only logins it created itself (marked (service login) in the user's name), never a person's account. Programs outside Home Assistant, with neither add-on options nor a secrets file, are out of its reach.

ha_config_entry_options reaches settings that exist nowhere else in the API. The one people ask for is ESPHome's "allow the device to perform Home Assistant actions" (allow_service_calls): a device cannot call HA services without it, and it is several clicks deep in the UI, so it is routinely forgotten. Get the entry id from ha_list_config_entries with domain=esphome, call with entry_id alone to read the form, then again with user_input. Submitting sets every field on the form, so send the values you read back with only what you meant to change altered.

Needs a Supervised/HAOS target (e.g. a VomeHome sandbox from vomehome_create_instance, or the ha-plc-sandbox MCP entry). In brokered mode the API key's scopes decide — no HA_ALLOW_WRITE / VOMEHOME_ALLOW_CREATE env flags required. Container-only HA has no add-on store — use HACS for the integration there.

Typical developer flow: vomehome_create_instance → wait until running → ha_addon_install_vome → restart Core → add the Vome integration.


Install

Requires Node.js ≥ 18.18 (Node 20+ recommended). There is nothing to install by hand — your editor launches the server on demand with npx, so the same config works on every machine (no absolute paths).

One‑click (Cursor)

Add to Cursor

Click it, then edit the pre‑filled HA_URL and HA_TOKEN. (If the button does nothing, copy the cursor:// link from the source of this section into your browser's address bar.)

One‑line config

Add this to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project) and fill in your token — that's the whole install:

{
	"mcpServers": {
		"home-assistant": {
			"command": "npx",
			"args": ["-y", "@vortitron/home-assistant-mcp"],
			"env": {
				"HA_URL": "http://homeassistant.local:8123",
				"HA_TOKEN": "paste-your-long-lived-token",
				"HA_ALLOW_WRITE": "false"
			}
		}
	}
}

Verify / from source

npx -y @vortitron/home-assistant-mcp doctor   # one-off connectivity check

# or hack on it:
git clone https://github.com/Vortitron/home-assistant-mcp.git
cd home-assistant-mcp && npm install && npm run build

LAN TCP tunnels (RDP, etc.)

npx -y @vortitron/home-assistant-mcp tunnel --token <jwt> --local-port 3390

Opens a local listener on 127.0.0.1:<local-port> and forwards it, over the same outbound relay Vome already uses (no port-forwarding on your router), to a tcp-scheme LAN route on a Vome-linked Home Assistant — e.g. an RDP host. Point mstsc/Remmina/any TCP client at that local address. Get a token from Home Assistant: Developer Tools → Actions → vomesync.mint_lan_tcp_token (or the Vome App's ingress panel → LAN tunnels → "Get tunnel token"). Tokens are short-lived and scoped to one instance + one route.


Configuration

Configuration is via environment variables (a local .env is also read). Copy .env.example to .env and fill it in, or set the variables in your editor's MCP config.

Variable

Default

Description

HA_URL

— (required)

Base URL, e.g. http://homeassistant.local:8123.

HA_TOKEN

— (required)

Long-lived access token (Profile → Security).

HA_ALLOW_WRITE

off (direct) / permissive (brokered)

Local write guard. In brokered mode the API key's per-instance scope decides (server-enforced); setting false only adds a local restriction. In direct mode this is the master switch and defaults off.

HA_DENY_DOMAINS

lock,alarm_control_panel,cover,valve,camera (direct) / empty (brokered)

Domains that can never be written. In brokered mode the API key's Sensitive devices setting decides, server-side; set this only to add a local restriction.

HA_ALLOW_DOMAINS

(any)

If set, only these domains may be written.

HA_ALLOW_CONFIG_WRITE

off (direct) / permissive (brokered)

Local guard for editing automation config. Same semantics as HA_ALLOW_WRITE.

NODERED_URL

(disabled)

Node-RED editor/admin base URL, e.g. http://homeassistant.local:1880. Enables the nodered_* tools.

NODERED_TOKEN

—

Bearer token if Node-RED adminAuth is enabled.

NODERED_USERNAME / NODERED_PASSWORD

—

Credentials exchanged for a token via /auth/token, if you prefer not to mint one by hand.

VOMEHOME_API_URL

https://vome.io

VomeHome portal base URL.

VOMEHOME_TOKEN

(disabled)

VomeHome personal access token; enables the vomehome_* tools.

VOMEHOME_INSTANCE_ID

(direct mode)

The active/default instance to broker HA calls to. With a token and no HA_TOKEN, HA tools route through VomeHome (see Brokered mode). What it may do is set by your token's per-instance scopes in the portal (server-enforced).

VOMEHOME_INSTANCES

(none)

Optional JSON registry to make multiple instances known at startup, e.g. [{"id":"rly-house","label":"home"},{"id":"sbx"}]. Per-instance write/config here are optional local restrictions (omit to defer to the server). Switch between them with vomehome_use_instance. See Several instances from one token.

VOMEHOME_ALLOW_CREATE

(defer to key)

Optional local guard for creating an instance. The real authority is the account-wide create scope on your API key; set false to block creation locally regardless. Instances you create are granted full HA access on that key and become the active target for the session.

HA_TIMEOUT_MS

15000

HTTP/WebSocket request timeout.

MAX_RESULTS

500

Max items a list tool returns before truncating.

LOG_LEVEL

info

error | warn | info | debug (logs go to stderr).

Getting a token

In Home Assistant: click your user (bottom-left) → Security tab → Long-lived access tokens → Create token.


Editor setup

This is a standard stdio MCP server, so the same binary works everywhere.

Cursor

Use the one‑click button above, or create .cursor/mcp.json in your project (or ~/.cursor/mcp.json for all projects). See examples/cursor.mcp.json:

{
	"mcpServers": {
		"home-assistant": {
			"command": "npx",
			"args": ["-y", "@vortitron/home-assistant-mcp"],
			"env": {
				"HA_URL": "http://homeassistant.local:8123",
				"HA_TOKEN": "paste-your-long-lived-token",
				"HA_ALLOW_WRITE": "false"
			}
		}
	}
}

VS Code

Create .vscode/mcp.json (see examples/vscode.mcp.json). VS Code can prompt for the token so it is not stored in the file:

{
	"inputs": [
		{ "id": "ha_token", "type": "promptString", "description": "Home Assistant token", "password": true }
	],
	"servers": {
		"home-assistant": {
			"type": "stdio",
			"command": "npx",
			"args": ["-y", "@vortitron/home-assistant-mcp"],
			"env": {
				"HA_URL": "http://homeassistant.local:8123",
				"HA_TOKEN": "${input:ha_token}"
			}
		}
	}
}

Claude Desktop

Add the same block under mcpServers in claude_desktop_config.json.

Claude Code: the side panes

Claude Code takes the same block in .mcp.json, or one server at a time with claude mcp add-json <name> '<entry>'. Through Vome it is two commands, with a key from the Vome app's Agent tab:

/plugin install vome-connect --marketplace Vortitron/home-assistant-mcp
/plugin install vome-panes --marketplace Vortitron/home-assistant-mcp

The first connects your home (it asks for the key), the second installs all four panes. Or pick them one at a time:

The automation pane: the automation as a WHEN/THEN map, each step marked by whether its latest run reached it.

The vome-automation pane shows the automation Claude is working on, what a save changed and which steps the latest run took:

/plugin install vome-automation --marketplace Vortitron/home-assistant-mcp

That needs Claude Code 2.1.275 or newer; its README has the two-command form for older versions, how to turn on updates, and the read-only tools to allow in auto mode.

For the home's health, vome-health shows Vome's score and what its check found, marked as Claude fixes each, and re-scored with a roll and fireworks:

/plugin install vome-health --marketplace Vortitron/home-assistant-mcp

For a dashboard that works, vome-dash puts one of yours in a pane: live states, controls that switch and dim, cameras in half blocks, and the cards Claude changes lit up:

/plugin install vome-dash --marketplace Vortitron/home-assistant-mcp

For ESPHome, vome-esphome adds a pane with a map of the device Claude is working on, drawn from its YAML, and the build it runs as it happens:

/plugin install vome-esphome --marketplace Vortitron/home-assistant-mcp

And just for fun, dont-panic adds the Guide: a pane that animates whatever the agent is doing and files a live, irreverent Guide entry on it. Its README has the price levels; /guide canned costs nothing:

/plugin install dont-panic --marketplace Vortitron/home-assistant-mcp

To connect Claude Code to a home through Vome without any of the config above, install vome-connect from the same marketplace; it asks for one key, which the Vome app's Agent tab in Home Assistant gives you without signing up:

/plugin install vome-connect --marketplace Vortitron/home-assistant-mcp

Multiple Home Assistants

Each entry under mcpServers is its own server process with its own environment, so to control several Home Assistants — each with a different token — add one entry per instance and give each a distinct name. The name prefixes the tool names in your editor (e.g. ha-home: ha_list_entities), so the agent always knows which house it is talking to. See examples/cursor.multi.mcp.json:

{
	"mcpServers": {
		"ha-home": {
			"command": "npx",
			"args": ["-y", "@vortitron/home-assistant-mcp"],
			"env": {
				"VOMEHOME_TOKEN": "vh_token-for-home",
				"VOMEHOME_INSTANCE_ID": "rly-aaaaaaaaaaaa"
			}
		},
		"ha-cottage": {
			"command": "npx",
			"args": ["-y", "@vortitron/home-assistant-mcp"],
			"env": {
				"VOMEHOME_TOKEN": "vh_token-for-cottage",
				"VOMEHOME_INSTANCE_ID": "rly-bbbbbbbbbbbb"
			}
		}
	}
}

Brokered and direct entries mix freely (e.g. a brokered home plus a direct HA_URL/HA_TOKEN lab instance), and each entry can carry its own safety flags — a read-only token for the family home, writes enabled for the test bench.

Several instances from one token

Name the home on any call. Every tool except the vomehome_* ones accepts an optional instance_id. When given, the call is refused if this session is targeting a different home, instead of answering from it. Writes to files and logins already require it. Reads need it too: a session that reconnects can resume on another window's choice, and "entity not found" or an empty history from the wrong house look like real answers.

The multi-process layout above is one process per token. When several instances live on the same VomeHome account (same token), you can instead drive them all from one server and switch between them at runtime. Permissions live on the key — you grant ha:write / ha:config per instance in the portal and the server enforces it — so the config below is just about which instances are known at startup (plus any optional local belt-and-braces restrictions).

{
	"mcpServers": {
		"home-assistant": {
			"command": "npx",
			"args": ["-y", "@vortitron/home-assistant-mcp"],
			"env": {
				"VOMEHOME_TOKEN": "vh_your-account-token",
				"VOMEHOME_INSTANCE_ID": "rly-house",
				"VOMEHOME_INSTANCES": "[{\"id\":\"rly-house\",\"write\":false,\"label\":\"home (locked read-only here)\"},{\"id\":\"sbx-plc\",\"label\":\"PLC sandbox\"}]"
			}
		}
	}
}
  • VOMEHOME_INSTANCE_ID is the active/default instance the ha_* tools target at startup (folded into the registry automatically as "default"). What it may do is set by your token's per-instance scopes in the portal.

  • VOMEHOME_INSTANCES declares which instances are known at startup. Listing them is optional — the token already reaches them — but it lets you pin the active target and add local restrictions. A per-instance write / config here is an optional local-only restriction: omit it to defer to the server, or set false to keep an instance read-only on this machine regardless of what the key allows (the example locks the house locally).

  • vomehome_use_instance switches the active instance for subsequent ha_* calls; vomehome_list_instances shows which one is active and each instance's effective access.

  • Creating instances (vomehome_create_instance) needs the create scope on your key — you own what you create. The portal grants the creating key full Home Assistant access on the new instance (ha:read, ha:write, ha:config, ha:files) so ha_* tools work without a trip back to the tokens page. Other keys, and other homes, stay as you ticked them. The instance also becomes the active target for the session. Add its id to VOMEHOME_INSTANCES to keep it known across restarts.

The API key is the single source of truth and the server has the final say (it returns 403 if the key lacks a scope). The client flags above only ever restrict further on this machine; they never widen what the token can do.

On Vome's hosted endpoint (https://vome.io/mcp, nothing installed), the same idea is one URL. A session starts on the instance that client last switched to, and that choice is remembered across server restarts. To have a project always start on a particular home, pin it in the URL:

{ "mcpServers": { "vome": { "type": "http", "url": "https://vome.io/mcp?instance=rly-house",
	"headers": { "Authorization": "Bearer vh_your-account-token" } } } }

The pin is where sessions start, not a lock: vomehome_use_instance still switches. It only counts while your token can reach that instance.

Verify

npx -y @vortitron/home-assistant-mcp doctor

doctor checks REST, the WebSocket registry and (if configured) the ESPHome dashboard, and prints a health summary. It never starts the MCP server, so it is safe to run any time.


Safety

Designed to be safe to point at a real home:

  1. Read-only by default (direct mode). With a raw HA_TOKEN the MCP is the only guard, so every state-changing tool refuses until HA_ALLOW_WRITE=true. In brokered mode permissions instead live on your VomeHome API key and are enforced server-side per instance (see Brokered mode).

  2. Domain deny-list. Even with writes on, sensitive domains (locks, alarms, covers, valves, cameras) are blocked. In direct mode remove them from HA_DENY_DOMAINS; in brokered mode tick them for the key under Sensitive devices on the VomeHome API tokens page.

  3. Optional allow-list. Set HA_ALLOW_DOMAINS to permit only specific domains.

  4. Cross-domain guard. ha_call_service checks the domain of every target entity — including entity ids nested anywhere inside data — so a generic service (e.g. homeassistant.turn_on) cannot be used to reach a denied domain. Generic services targeting an area/device/label are refused while a deny/allow-list is active, because those selectors resolve server-side and cannot be checked here; target entity ids or use the domain-specific service (e.g. light.turn_on) instead.

  5. Separate config-write scope. Editing automation YAML needs its own ha:config scope (brokered) or HA_ALLOW_CONFIG_WRITE=true (direct).

  6. VomeHome guards. Rebooting or creating an instance is gated by the matching scope on your API key (server-enforced); the optional VOMEHOME_ALLOW_CREATE client flag can add a local block. The VomeHome token is scoped server-side to your own account.

Tools are also annotated with MCP hints (readOnlyHint, destructiveHint) so clients can warn before destructive calls.

What the write‑guard protects (and what it doesn't)

The guard constrains what these tools will do, and it's a strong guardrail when the MCP server is the agent's only route to Home Assistant. It is not a cryptographic boundary: a Home Assistant long‑lived token grants full access, so an agent that also holds that token can call the HA API directly and bypass the guard. So keep the token in your editor's MCP config (ideally ~/.cursor/mcp.json, outside any repo the agent can read) — not in files the agent browses.

For a genuine boundary, point the agent at VomeHome instead: it holds only a revocable VOMEHOME_TOKEN while the powerful HA credential stays server‑side, where access is policed and audited — so the agent can't go around the policy. See Brokered mode.


Brokered mode (the real boundary)

Direct mode is convenient, but the write‑guard only helps if the agent doesn't also hold the HA token. Brokered mode closes that gap: the agent is given a revocable, scoped VomeHome token and an instance id — and no Home Assistant token at all. Every HA read/write is proxied through the VomeHome portal, which:

  • keeps the HA credential server‑side (the agent never sees it);

  • enforces read / write / config per token, per instance — a token without ha:write for an instance genuinely cannot change it, no matter how it's used;

  • blocks sensitive domains (locks, alarms, …) server‑side, including via generic services (homeassistant.turn_on can't reach a lock);

  • audits every call (allowed or denied) against the token that made it.

Because the policy lives on the server, the agent cannot bypass it — that's the difference between a guardrail and a boundary.

{
	"mcpServers": {
		"home-assistant": {
			"command": "npx",
			"args": ["-y", "@vortitron/home-assistant-mcp"],
			"env": {
				"VOMEHOME_TOKEN": "vh_paste-your-token",
				"VOMEHOME_INSTANCE_ID": "your-instance-id"
			}
		}
	}
}

Mint the token at Account → API tokens in the portal. There you grant, per instance, whether it may control Home Assistant (ha:write) and/or edit automation config (ha:config) — and you can edit those grants after issuing the key. The key is the single source of truth; the MCP just carries it. Get the instance id from the dashboard or the vomehome_list_instances tool. (The portal's token page generates this token-only snippet for you.)

Token scopes for the vomehome_* tools. The instance-management tools (vomehome_list_instances, _get_instance, _use_instance, _get_login_url) need the instances:read scope, and vomehome_create_instance needs instances:write (which implies read). A token minted with only the HA scopes (ha:read / ha:write / ha:config) can broker Home Assistant calls but will get 403 … missing required scope(s): instances:read from the instance tools. If you want the agent to spin up sandboxes, mint the token with instances:write. Creating an instance grants that key full ha:* access (ha:read, ha:write, ha:config, ha:files) on the new instance automatically — existing homes keep the grants you ticked. No local VOMEHOME_ALLOW_CREATE env flag is required in brokered mode (set false only if you want a local block). A default (read-only) token already includes instances:read — the 403 only appears when a token was scoped to HA access without the instances scopes.

Brokered mode proxies the everyday loop — list/get entities, list services, call services, read config, render templates — plus automation editing: ha_get_automation, ha_set_automation, ha_delete_automation and ha_check_config. Lovelace dashboards are brokered too: ha_list_dashboards, ha_get_dashboard, ha_save_dashboard, ha_create_dashboard, ha_delete_dashboard (writes need ha:config). Reading an automation needs ha:read; writing one needs the separate ha:config scope on the token for that instance, enforced server-side. The client write guards (HA_ALLOW_WRITE / HA_ALLOW_CONFIG_WRITE) default permissive in brokered mode and are optional local restrictions on top. Registry tools (areas/devices), logs and history still need direct mode for now.

ESPHome over the relay. When you broker to a relay-connected Home Assistant (your own HA linked via the Vome component's outbound tunnel), ESPHome comes with it — listing devices, reading and writing YAML, and the streaming commands (esphome_validate / _compile / _upload / _logs / _clean), which ride the relay as polled jobs. Reads need ha:read; writing YAML, building and flashing need the instance's ha:config scope. This is the only route: see ESPHome.

Bring your own Home Assistant. The instance you broker to does not have to be a VomeHome VM. In the VomeHome portal, Account → Connect HA lets you attach a Home Assistant you host yourself (public URL / external IP, or Nabu Casa Remote UI) with a long‑lived access token. It then appears in vomehome_list_instances with an ext-… id — set VOMEHOME_INSTANCE_ID to that, and the same scoped, deny‑listed, audited boundary applies. Your HA token stays on the VomeHome server; the agent only ever gets the revocable VomeHome token.

Discovery for agents. VomeHome publishes a machine-readable index of all of this — how to sign up, mint tokens, boot a trial VM, link a home HA, and the /api/v1 surface — as a Gopher-over-HTTPS menu at https://vome.io/.well-known/agent.gopher and in llms.txt form at https://vome.io/llms.txt. If you are an agent reading this: start there.


Example agent workflows

  • "What lights are on in the living room?" → ha_list_entities (domain light, area living room).

  • "Make this template return true only after sunset" → iterate with ha_render_template.

  • "Turn the porch light to 30%" → ha_call_service (light.turn_on, brightness_pct: 30). Requires writes enabled.

  • "Fix my morning automation" → ha_get_automation → edit → ha_set_automation → ha_check_config → ha_trigger_automation.

  • "Add a sensor to this ESPHome node and flash it" → esphome_get_config → esphome_edit_config (or esphome_save_config for a new file) → esphome_validate → esphome_upload.

  • "Tidy up my Node-RED 'Heating' tab" → nodered_get_flows (find the tab id) → nodered_get_flow → edit the nodes → nodered_update_flow.

  • "Spin up a sandbox and open it" → vomehome_create_instance → vomehome_get_instance (poll status) → vomehome_get_login_url (open the link).

  • "Why is my Hue integration throwing errors?" → ha_get_system_log (logger: "hue") → read exception_summary → ha_get_system_log again with include_exception: true for the full stack.

  • "Why didn't my morning automation run?" → ha_get_trace (item: "automation.morning") → read failed_at.


Debugging with logs

Four surfaces, roughly in the order to reach for them:

Question

Tool

What is broken right now?

ha_get_system_log

Why didn't this automation do anything?

ha_get_trace

What did the add-on / host do?

ha_get_supervisor_log

What happened to this entity, and when?

ha_get_logbook / ha_get_history

Start with ha_get_system_log, not ha_get_error_log. It reads Home Assistant's structured error store, where the same failure logged 500 times is one record with count: 500, a source file:line and first/last-seen stamps. Tailing the raw log spends far more tokens to say less. Full tracebacks are left out by default — you still get exception_summary, the final line that names the actual exception — so ask for include_exception: true once you know which entry matters.

The reproduce loop. When you can trigger the problem on demand, don't sift through history at all — make the log contain only your reproduction:

  1. ha_set_log_level (integration: "hue", level: "debug") — debug on the one integration, not globally.

  2. ha_clear_system_log.

  3. Reproduce it (ha_call_service, ha_trigger_automation, …).

  4. ha_get_system_log — everything returned was caused by step 3.

Levels are runtime-only and reset on restart. Both write tools need HA_ALLOW_WRITE=true in direct mode, but not HA_ALLOW_CONFIG_WRITE, and the domain deny/allow lists don't apply — they change log plumbing, not entities.

Traces answer what logs can't. An automation whose condition returned false logs nothing at all; the trace records it. ha_get_trace defaults to the most recent run and returns failed_at — the first step that errored or evaluated false — alongside the trigger and the ordered steps. Home Assistant keeps only a few traces per item (5 by default) and none from before the last restart, so ha_list_traces returning nothing usually means "trigger it and look again".


ESPHome notes

  • REST endpoints (/devices, /edit) are used for listing and reading/writing YAML. These work over the VomeHome relay as well as directly.

  • validate, compile, upload, logs and clean run over the dashboard's multiplexed /ws API. Over the relay they are brokered as jobs: the portal starts one and this client polls it, which is what lets a multi-minute compile survive the ordinary HTTP timeouts in between.

  • The Vome component owns the dashboard protocol. ESPHome split its dashboard into esphome-device-builder, which replaced the per-command WebSockets (/validate, /logs, …) and the /edit REST endpoint with a single /ws socket; the remaining legacy endpoints are documented upstream as deprecated. The component translates /ws into the stable line/exit stream the relay carries, so this client, the portal and the relay never learn that ESPHome moved. Builds go through the dashboard's job queue, so an agent-triggered build also shows up in its own "Firmware tasks" panel.

  • Requires the Vome add-on at 0.3.30 or later. Older components speak a protocol the dashboard no longer answers; the error says so and names the version rather than blaming ESPHome.

  • The relay is preferred over reaching the dashboard directly, even when both would work. Going direct skips the portal's per-instance scope checks and its audit log — a revoked token would still be able to flash a device that happened to share a network with the agent. It is also the only route that works on a default HAOS install, where the add-on's web port is disabled and its ingress admits only the Supervisor and localhost.

  • Discovery (src/esphome/discovery.ts) finds a dashboard for direct mode, where there is no relay and so no policy layer to bypass. Call esphome_dashboard_info to see which mode is active and, when nothing is reachable, every address that was tried and how each failed.

  • The dashboard authorises WebSocket commands with its own cookie/XSRF when a dashboard password is set, so these commands work against password-less dashboards or ones reachable on a trusted network / behind an auth-terminating proxy. Token/basic auth here only helps for the latter.

  • esphome_upload validates before it flashes. A device that takes a bad build is offline until someone reaches it with a cable, so the cheap check runs first; pass skip_validate: true to bypass it.


Node-RED notes

  • The HA Node-RED add-on exposes the editor on port 1880 (http://homeassistant.local:1880). Point NODERED_URL at it.

  • If the add-on has a credential secret / adminAuth set, supply NODERED_TOKEN (or NODERED_USERNAME/NODERED_PASSWORD, which the client exchanges for a token). An add-on reachable only on your trusted network, or behind HA ingress / an auth-terminating proxy, needs no auth here.

  • nodered_set_flows rewrites everything — prefer nodered_create_flow / nodered_update_flow for day-to-day edits. Pass the rev from nodered_get_flows so a concurrent change in the editor is detected rather than silently overwritten.

  • Node-RED flows are plain JSON, which makes them a natural target for alternative front-ends (PLC-style ladder, Scratch/Blockly). That exploration lives in the VomeHome repo (docs/alt_interfaces_plan.md).

Development

npm run dev          # run from source with tsx (watch)
npm run build        # compile to dist/
npm test             # vitest
npm run lint         # eslint
npm run typecheck    # tsc --noEmit

Layout:

src/
	index.ts              # entry: MCP stdio server + `doctor`/`tunnel` CLI
	config.ts             # env parsing + validation
	safety.ts             # write-guard policy
	logger.ts             # stderr logger
	ha/                   # Home Assistant REST + WebSocket + brokered clients
	esphome/              # ESPHome dashboard client
	nodered/              # Node-RED admin API client
	vomehome/             # VomeHome portal client
	tools/                # one module per tool group
	cli/doctor.ts         # connectivity check
	cli/tunnel.ts         # raw-TCP LAN tunnel client (RDP, etc.)
tests/                  # vitest unit tests

Roadmap

  • VomeHome‑brokered HA access (the real boundary) — shipped (MVP). HA reads/writes can be proxied through VomeHome with a revocable VOMEHOME_TOKEN so the HA credential never reaches the agent and the read‑only / deny‑domain / audit policy is enforced server‑side. Automation editing and the ESPHome REST subset are brokered too (the latter over a relay-connected HA). See Brokered mode. Next: registry (areas/devices) over the broker and a per‑token audit view in the portal.

  • VomeHome test installs. The vomehome_* tools already list, create, reboot and open instances. Next: point HA_URL/HA_TOKEN at a freshly created sandbox automatically so an agent can try changes there before touching a real home, then promote what works. (Requires the portal API endpoints described in project_outline.md.)

  • ESPHome over the relay — shipped. Builds, flashing and device logs are brokered as polled jobs, so a remote agent can flash hardware with no inbound exposure and with scope checks and audit in front of every command. Next: device adoption (the /import + wizard flow), so an agent can take a brand-new board from unflashed to working entity without a UI step.

  • Node-RED — flow read/write/deploy shipped. Next: brokering the admin API through VomeHome (as HA and the ESPHome REST subset already are) so a relay-connected home needs no directly-reachable Node-RED URL, and a flow diff/validate step before deploy.

  • MCP resources for entities/areas (in addition to tools).

  • Optional HTTP/SSE transport for remote use.


License

MIT © Vortitron

Available Tools

111 tools
esphome_activityESPHome build activityA
Read-only

What the ESPHome build commands (validate, compile, upload, logs) started in this session are doing: each running or recently finished job with its newest output lines. Pass back the returned 'seq' as 'since' to get only lines produced after it. For watching a long build while it runs; the build tools themselves return the full output when they finish.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoReturn only output lines newer than this sequence number (the 'seq' of an earlier call).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=true, openWorldHint=false), so the description only needs to add context, and it does: the view is session-scoped ("started in this session"), includes recently finished as well as running jobs, and supports incremental polling via the seq/since handshake. The one gap is that it doesn't say how long finished jobs or their lines are retained, which matters for a session-scoped buffer.

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

Conciseness4/5

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

Three sentences, front-loaded with what the tool returns, then the polling contract, then the when-to-use note. Every sentence carries information; the only minor cost is that the parenthetical command list slightly lengthens the first sentence.

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

Completeness4/5

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

With no output schema, the description must convey the return shape, and it does at a high level (jobs plus their newest output lines, plus a seq cursor). It is enough to call the tool correctly, though the exact envelope (per-job fields, whether finished jobs eventually drop out) is not spelled out.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by tying the two fields together: "Pass back the returned 'seq' as 'since' to get only lines produced after it," explaining the cross-reference the schema alone does not make obvious. The instance_id parameter's refusal behavior is left entirely to the schema, which is acceptable at full coverage.

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

Purpose5/5

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

The description names a specific resource (the ESPHome build commands validate/compile/upload/logs started in this session) and states precisely what is returned: each running or recently finished job with its newest output lines. It also explicitly separates itself from the build tools themselves, which return full output only on completion, so an agent can distinguish it from esphome_validate/esphome_compile/esphome_upload/esphome_logs without opening any schema.

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

Usage Guidelines4/5

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

"For watching a long build while it runs; the build tools themselves return the full output when they finish" gives a clear condition for choosing this tool over the one-shot build commands. It stops short of an explicit when-not (e.g. don't poll after the job has finished or after a session restart), but the alternative is named and 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.

esphome_cleanClean ESPHome build filesA
Destructive

Delete the cached build files for a configuration. Use this when a compile fails for reasons the YAML does not explain — a stale build directory after an ESPHome version change is the usual cause. Then compile again. Runs over the VomeHome relay — no ports to open. If a call reports that ESPHome is unreachable, run esphome_dashboard_info to see why rather than telling the user this is unsupported.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.
timeout_secondsNoOverride the command timeout.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real value beyond that: it names what gets destroyed (cached build files), states the transport ('runs over the VomeHome relay — no ports to open'), and prescribes recovery routing for an unreachable error.

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

Conciseness4/5

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

Front-loaded with the core action, then layered with trigger, transport, and troubleshooting in a logical order. Each sentence carries information, though four sentences is slightly more than the minimum needed for a delete operation.

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

Completeness4/5

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

For a destructive 3-param tool with full schema coverage, annotations, and no output schema, the description covers purpose, trigger, transport, follow-up, and error handling. Nothing essential for correct invocation is missing, though return/confirmation behavior is left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents configuration, instance_id, and timeout_seconds. The description reinforces that a configuration is required but adds no syntax, format, or default detail beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

Opens with a specific verb+resource: 'Delete the cached build files for a configuration.' This clearly distinguishes it from siblings like esphome_compile and esphome_validate, which is exactly the differentiation an agent needs.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('when a compile fails for reasons the YAML does not explain'), a root cause (stale build directory after an ESPHome version change), and the follow-up action ('Then compile again'). It also routes the agent to esphome_dashboard_info for the unreachable case instead of mislabeling it unsupported.

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

esphome_compileCompile ESPHome firmwareA

Compile firmware for an ESPHome configuration and return the build output. Can take several minutes. Runs over the VomeHome relay — no ports to open. If a call reports that ESPHome is unreachable, run esphome_dashboard_info to see why rather than telling the user this is unsupported.

ParametersJSON Schema
NameRequiredDescriptionDefault
full_outputNoReturn every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.
timeout_secondsNoOverride the command timeout.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and openWorldHint=true; the description adds real context beyond them — expected latency of several minutes, that the work runs over the VomeHome relay with no open ports, and how unreachable errors should be handled. It does not describe build-artifact side effects or timeout behavior, but the added operational detail 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.

Conciseness4/5

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

Four sentences, front-loaded with the core purpose and artifact, followed by latency, transport note, and error routing. Nothing is redundant, though the relay/ports sentence is slightly tangential to selecting or calling the tool.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so adequately: build output, summarised-by-default behavior is covered by the schema, latency is flagged, and the failure path is routed. Only the exact failure/timeout semantics of a failed compile are left unstated.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents configuration, full_output, instance_id, and timeout_seconds in detail. The description adds no parameter-level meaning beyond what the schema provides, which makes the baseline 3 correct.

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

Purpose4/5

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

States a specific verb and resource ('Compile firmware for an ESPHome configuration') plus the return artifact ('build output'), which is enough to distinguish it from siblings like esphome_validate, esphome_upload, and esphome_clean. It does not explicitly name those siblings, so it stops short of a 5.

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

Usage Guidelines4/5

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

Gives clear operational context ('Can take several minutes') and an explicit failure-routing rule: if ESPHome is unreachable, call esphome_dashboard_info rather than reporting it as unsupported. It lacks guidance on when to compile vs validate or upload, 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.

esphome_dashboard_infoCheck ESPHome capabilityA
Read-only

Report whether ESPHome is reachable and what is possible right now — listing and editing configs, and the streaming commands (validate/compile/upload/logs/clean). ESPHome is reached through a VomeHome relay-connected Home Assistant running the Vome add-on; when that is in place everything is available. Call this before telling a user that flashing or log-reading is unsupported — it usually is not.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real context beyond that: the tool is a gating check whose result depends on the relay/add-on topology, and it implies a capability answer rather than an action. It does not describe the shape of the 'not reachable' response, but for a read-only probe this is good.

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

Conciseness4/5

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

Front-loaded with the core answer (reachability and what is possible), then the environment note, then the usage trigger. It is somewhat dense with em-dash clauses, but every sentence carries weight and none is redundant.

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

Completeness4/5

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

There is no output schema, so the description must convey what comes back; it does by naming the capability classes it reports (config listing/editing, streaming commands). Combined with the read-only annotation and full param coverage, an agent has enough to invoke and interpret it, though the exact response format remains unspecified.

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

Parameters3/5

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

One optional parameter with 100% schema description coverage; the schema already explains instance_id and the cross-home refusal behavior in detail. The description adds nothing about the parameter, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource: reporting whether ESPHome is reachable and enumerating what is possible (config listing/editing and the streaming commands). It is clearly a capability probe, distinguishable from the actual action siblings (esphome_validate, esphome_compile, esphome_upload, esphome_logs, esphome_clean) that it names.

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

Usage Guidelines4/5

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

Gives an explicit trigger: call this before telling a user that flashing or log-reading is unsupported. It also explains the environmental precondition (a VomeHome relay-connected Home Assistant running the Vome add-on) under which everything is available. It does not state when the tool is unnecessary, 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.

esphome_edit_configEdit ESPHome configA
Destructive

Change part of an ESPHome configuration file in place: each edit replaces one exact piece of text with another, and must match exactly once. Prefer this to esphome_save_config for any change to an existing file: a real device's YAML runs to thousands of lines, and resending all of it to change a few is slow and risks a slip anywhere in it. Nothing is saved unless every edit applies. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true. Follow with esphome_validate, then esphome_upload to flash it.

ParametersJSON Schema
NameRequiredDescriptionDefault
editsYesApplied in order, each to the result of the one before.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true and readOnlyHint=false; the description goes well beyond them by disclosing atomicity ('Nothing is saved unless every edit applies'), the exactly-one-match constraint, the ordered application of edits, and the two required environment flags (HA_ALLOW_WRITE, HA_ALLOW_CONFIG_WRITE). These are precisely the mutation semantics an agent needs before committing.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the mechanism and the sibling preference, then prerequisites, then the follow-up workflow. Every clause carries information; no filler or restated title.

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

Completeness5/5

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

For a destructive, in-place file mutation with no output schema, the description covers matching constraints, atomic failure behavior, auth preconditions, and the surrounding validate/upload workflow. An agent has everything needed to invoke it correctly and safely.

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

Parameters3/5

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

Schema description coverage is 100%, so old_text, new_text, edits ordering, instance_id and configuration are already documented in the schema. The description restates the exact-match/unique-occurrence rule and ordered application, which largely duplicates what the schema provides rather than adding new parameter-level meaning. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb+resource (change part of an ESPHome configuration file in place) and immediately specifies the mechanism: exact-text replacement matching exactly once. It explicitly names the sibling it supersedes (esphome_save_config) and the reason, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use rule ('Prefer this to esphome_save_config for any change to an existing file'), the rationale for it (thousands of lines, slow resend, slip risk), and the required follow-up chain (esphome_validate, then esphome_upload). 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_configGet ESPHome configB
Read-only

Read the YAML for an ESPHome configuration file (e.g. 'living-room.yaml').

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds only that the target is YAML plus a filename example, and does not disclose return format, error behavior, or whether a missing file errors out.

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

Conciseness4/5

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

A single efficient sentence with no padding. It is front-loaded and each clause earns its place, though it is arguably under-specified rather than maximally concise.

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

Completeness4/5

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

For a simple read-only tool with full schema coverage and annotations carrying the safety profile, the description is nearly sufficient. The main gap is the absence of a hint about what is returned (raw YAML contents) since there is no output schema.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, including the instance_id scoping/refusal semantics. The description repeats the filename example already present in the schema and adds no new parameter meaning.

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

Purpose4/5

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

The description states a specific verb (Read) and resource (the YAML for an ESPHome configuration file), which implicitly separates it from esphome_save_config and esphome_edit_config. It does not explicitly name or contrast those siblings, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance. The contrast with esphome_edit_config / esphome_save_config is only inferable from the word 'Read', leaving the agent to reason about selection on its own.

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

esphome_list_devicesList ESPHome devicesA
Read-only

List devices/configurations known to the ESPHome dashboard, including their configuration filenames (needed by the other ESPHome tools).

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds value beyond that by disclosing the payload content (configuration filenames) and its role as prerequisite data for other tools, though it says nothing about pagination, counts, or 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.

Conciseness5/5

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

One front-loaded sentence that names the operation, its scope, and the returned payload without any filler.

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

Completeness4/5

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

For a zero-required-param list tool with no output schema, the description covers purpose, output content, and downstream use. It is close to complete, only missing minor return-shape detail such as empty-list behavior.

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

Parameters3/5

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

Schema description coverage is 100% and the single instance_id parameter is fully documented in the schema, including the refusal-on-mismatch behavior. The description adds no parameter-level meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('List devices/configurations known to the ESPHome dashboard') and scopes it to the ESPHome domain, distinguishing it from the generic ha_list_devices sibling. It also names what the result contains (configuration filenames).

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

Usage Guidelines4/5

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

The parenthetical 'needed by the other ESPHome tools' establishes this as the discovery/enumeration step before other ESPHome operations, which is real usage guidance. It stops short of explicit when-not conditions or naming alternative list tools.

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

esphome_list_migrationsCheck a config for ESPHome renamesA
Read-only

Report the ESPHome spellings a device's YAML still uses that have since been renamed — the same 'Config migration available' notice the ESPHome dashboard shows in its own UI, which is otherwise invisible from here. Each entry names the old and new spelling and the ESPHome release that changed it.

required: true means the installed ESPHome already rejects the old spelling, so the config will fail to compile until it is fixed; otherwise it still works but is on borrowed time. Apply a rename by editing the YAML with esphome_save_config.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial behavioral context: what each entry contains (old spelling, new spelling, release that changed it), the operational meaning of `required: true` (config will fail to compile vs. works but is on borrowed time), and where the information surfaces in the ESPHome UI. That is real disclosure beyond the structured fields.

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

Conciseness4/5

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

Two short paragraphs with the core capability front-loaded and the required-flag semantics second. Mostly efficient, though 'which is otherwise invisible from here' and 'on borrowed time' are stylistic filler rather than operational information.

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

Completeness5/5

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

With no output schema, the description correctly compensates by describing the shape of each returned entry and the meaning of its fields, plus the mutation path via esphome_save_config. Nothing an agent needs to call and interpret this read-only tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented in the schema, including the instance_id refusal behavior. The description does not add format or syntax detail for `configuration` beyond 'a device's YAML', so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Report the ESPHome spellings a device's YAML still uses that have since been renamed') and anchors it to a recognizable artifact ('the same Config migration available notice the ESPHome dashboard shows'). An agent can distinguish it from esphome_validate or esphome_get_config without opening any schema.

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

Usage Guidelines4/5

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

Gives clear context for use and routes the follow-up action explicitly ('Apply a rename by editing the YAML with esphome_save_config'), and explains the meaning of the required flag. It does not, however, contrast itself with the closest sibling, esphome_validate, so the agent must infer that validation and migration-checking are different concerns.

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

esphome_logsRead ESPHome device logsA
Read-only

Stream the live logs from an ESPHome device and return what was captured. This is the way to see what a device is actually doing — boot messages, wifi/API connection problems, sensor readings, crashes and reboot reasons. Use it after flashing, or whenever a device is behaving oddly. Returns once the timeout elapses, so set timeout_seconds to how long you want to watch. Runs over the VomeHome relay — no ports to open. If a call reports that ESPHome is unreachable, run esphome_dashboard_info to see why rather than telling the user this is unsupported.

ParametersJSON Schema
NameRequiredDescriptionDefault
portNoDevice address (IP/hostname) or 'OTA' for logs over the network. Defaults to 'OTA'.
full_outputNoReturn every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.
timeout_secondsNoHow long to capture logs for. Defaults to the standard command timeout.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint/openWorldHint, but the description adds real behavioral context beyond them: it is a streaming call that returns only when the timeout elapses, it runs over the VomeHome relay with no ports to open, and it specifies failure-handling routing. The summarised-vs-full output behavior is largely already covered by the schema, so it falls just short of 5.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, timeout behavior, transport, and error routing in logical order. Each sentence carries information, though the description is on the longer side for a five-parameter read tool.

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

Completeness5/5

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

With no output schema, the description carries the burden of explaining returns and does so (captured boot messages, connection problems, sensor readings, crashes), plus timeout semantics and relay transport. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all five parameters. The description only restates timeout_seconds semantics ('set timeout_seconds to how long you want to watch'), which is largely redundant, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource (stream/return logs from an ESPHome device) and enumerates what the logs reveal (boot messages, wifi/API issues, sensor readings, crashes, reboot reasons), which distinguishes it from sibling config/compile/upload tools.

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

Usage Guidelines5/5

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

Explicit when-to-use ('after flashing, or whenever a device is behaving oddly') and routes to a named alternative on failure ('run esphome_dashboard_info to see why rather than telling the user this is unsupported'). 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.

esphome_save_configSave ESPHome configA
Destructive

Write YAML to an ESPHome configuration file, whole: for a new file. To change part of an existing one, use esphome_edit_config. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true. Follow with esphome_validate to confirm it compiles, then esphome_upload to flash it.

ParametersJSON Schema
NameRequiredDescriptionDefault
yamlYesFull YAML content to write.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true. The description adds the two env-flag preconditions and the post-write workflow, which are not derivable from annotations. It does not explicitly state that existing content is overwritten, though 'whole: for a new file' implies non-partial writes and destructiveHint covers it.

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

Conciseness4/5

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

Tight, front-loaded: scope first, alternative second, preconditions third, workflow last. Every clause is load-bearing. Slightly crowded into one block but no wasted words.

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

Completeness4/5

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

For a 3-param write tool with no output schema, the description covers preconditions, the edit alternative, and the downstream validate/upload sequence. Missing only an explicit statement that the file is overwritten in place and whether validation is automatic.

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

Parameters3/5

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

Schema coverage is 100% with per-parameter descriptions, so the schema carries the parameter semantics. The description adds nothing about the yaml or configuration parameters, and the instance_id cross-session guard is only in the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

Specific verb 'Write' + resource 'ESPHome configuration file' with explicit scope qualifier 'whole: for a new file.' It also names the sibling esphome_edit_config for the partial-change case, making it distinguishable from all siblings at a glance.

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

Usage Guidelines5/5

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

Explicit when-to-use (new file, whole write) vs when-not (partial change → esphome_edit_config), plus required feature flags (HA_ALLOW_WRITE, HA_ALLOW_CONFIG_WRITE) and prescribed follow-up order (validate → upload). This is a complete usage contract.

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

esphome_uploadFlash ESPHome firmware (OTA)A
Destructive

Compile and flash firmware to a device over the air. This is how you update an ESPHome device — no cable, no manual step in the ESPHome UI. 'port' is the device address or 'OTA' (the default). Requires write access. The build runs first and a failed build never reaches the device. Runs over the VomeHome relay — no ports to open. If a call reports that ESPHome is unreachable, run esphome_dashboard_info to see why rather than telling the user this is unsupported.

ParametersJSON Schema
NameRequiredDescriptionDefault
portNoDevice address (IP/hostname) or 'OTA'. Defaults to 'OTA'.
full_outputNoReturn every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.
timeout_secondsNoOverride the command timeout.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare the mutation profile (destructive, openWorld, not read-only), and the description adds material context beyond them: write access is required, the build runs first so a failed build 'never reaches the device' (a safety-relevant guarantee for a destructive tool), and it runs over the VomeHome relay with no ports to open.

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

Conciseness4/5

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

Purpose is front-loaded and the following sentences each carry distinct operational information (auth, build-then-flash ordering, relay transport, unreachable-tool routing). Slightly long and drops into one marketing-flavored aside ('no cable, no manual step in the ESPHome UI'), but there is little wasted text.

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

Completeness4/5

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

For a destructive, no-output-schema tool, the description covers safety ordering, permissions, transport, and failure routing well. The one remaining gap is return/output behavior (the summarising of long output), which is only covered by the full_output schema parameter, not the description.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters are already documented in the schema. The description's only parameter note ('port' is device address or 'OTA', the default) merely restates the schema, adding no syntax or format detail beyond it. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific compound verb and resource: 'Compile and flash firmware to a device over the air.' It also frames the outcome ('This is how you update an ESPHome device'), making its role relative to the compile-only sibling evident without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit routing: use this for over-the-air updates, and if ESPHome is reported unreachable, call esphome_dashboard_info to diagnose 'rather than telling the user this is unsupported.' That names both the condition and the alternative tool, which is exactly what a routing description should do.

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

esphome_validateValidate ESPHome configA
Read-only

Validate (compile-check) an ESPHome configuration and return the output. The fast way to confirm a YAML edit is correct before compiling or flashing. Runs over the VomeHome relay — no ports to open. If a call reports that ESPHome is unreachable, run esphome_dashboard_info to see why rather than telling the user this is unsupported.

ParametersJSON Schema
NameRequiredDescriptionDefault
full_outputNoReturn every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
configurationYesConfiguration filename, e.g. 'living-room.yaml'.
timeout_secondsNoOverride the command timeout.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real operational context: it runs over the VomeHome relay with no ports to open, and it tells the agent how to handle an unreachable instance rather than misreporting. Return summarization behavior is useful but partially overlaps the schema.

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

Conciseness5/5

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

Three tightly packed sentences, front-loaded with the core action and then the practical guidance. Every sentence earns its place and none restate the title.

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

Completeness5/5

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

For a non-destructive validate tool with full annotation and schema coverage, the description covers purpose, the pre-compile workflow position, and error remediation. Nothing an agent needs to invoke it correctly is missing, and no output schema is required since the return is 'the output'.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (full_output, instance_id, configuration, timeout_seconds) are already documented in the schema, setting the baseline at 3. The description references 'return the output' but adds no syntax or format detail beyond what the schema provides.

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

Purpose5/5

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

States a specific verb+resource ('Validate (compile-check) an ESPHome configuration') and immediately frames its scope relative to siblings by saying it's the step before compiling or flashing. An agent can distinguish it from esphome_compile and esphome_upload without opening any schema.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('the fast way to confirm a YAML edit is correct before compiling or flashing'), which implies the alternative (full compile/upload) and the condition selecting this tool. It also routes the agent on failure: use esphome_dashboard_info if ESPHome is unreachable, rather than reporting it unsupported.

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

ha_addon_install_vomeInstall the Vome add-onA
Destructive

Developer helper: add the VomeSync GitHub add-on repository to the Supervisor store (if missing), install the Vome add-on, and start it. Requires HAOS/Supervised. In brokered mode the API key's ha:config scope is authoritative — no HA_ALLOW_WRITE env flag needed. After install, restart Home Assistant once so custom_components/vomesync is loaded, then add the Vome integration.

ParametersJSON Schema
NameRequiredDescriptionDefault
skip_startNoIf true, install but do not start the add-on
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
repository_urlNoAdd-on repository git URL (default: https://github.com/Vortitron/VomeSync)https://github.com/Vortitron/VomeSync

TDQS

A4.1/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: environment requirement (HAOS/Supervised), the authorization model (ha:config scope is authoritative, no HA_ALLOW_WRITE flag needed), and the required follow-up restart and integration step. The 'if missing' wording implies repo-add idempotency. It does not explain the destructiveHint (what a failed or repeated install may affect), so it falls short of a 5.

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

Conciseness4/5

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

Three dense sentences, front-loaded with the core action and followed by prerequisites and post-steps. Every sentence carries information; minor length is justified by the multi-step workflow, though it could be tightened slightly.

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

Completeness4/5

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

For a multi-step installation tool with no output schema, the description covers the action chain, prerequisites, auth-mode nuance, and required follow-up steps. It is nearly complete, missing only explicit failure/rollback behavior given the destructiveHint.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents skip_start, instance_id, and repository_url fully. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource chain: adds the VomeSync GitHub add-on repository (if missing), installs the Vome add-on, and starts it. It is distinguishable from generic siblings like ha_hacs_add_repository because it is scoped to the Vome add-on, and it sequences itself against ha_integration_setup_vome by noting the integration step comes afterward.

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

Usage Guidelines4/5

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

Provides clear context for use: 'Developer helper', requires HAOS/Supervised, and notes the brokered-mode scope behavior. It also lays out the post-install flow (restart HA, then add the integration). However, it does not explicitly name alternatives or state when not to use it versus the generic HACS repository tools.

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

ha_call_serviceCall a serviceA
Destructive

Call a Home Assistant service to change state (e.g. domain='light', service='turn_on', data={ brightness_pct: 60 }, target={ entity_id: 'light.kitchen' }). Refused unless writes are enabled, and blocked for denied domains. Returns the entities that changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoService data / parameters (may include entity_id).
domainYesService domain, e.g. 'light', 'switch', 'climate'.
targetNoService target (entity/area/device/label selectors).
serviceYesService name, e.g. 'turn_on', 'set_temperature'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, so the mutation risk is covered. The description adds genuinely useful context beyond them: the write-enable gate, domain denylist blocking, and that the response returns the changed entities.

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

Conciseness4/5

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

Two sentences, front-loaded with the core action and followed by the gating constraint. The parenthetical example is long but earns its place by demonstrating parameter structure; nothing here is filler.

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

Completeness4/5

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

Without an output schema, the description responsibly states what comes back (the entities that changed), and it surfaces the write gate and denylist behavior an agent must know before invoking. Nested target/data objects are covered by the schema, so remaining gaps are minor.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the inline example maps domain/service/data/target to a realistic brightness_pct call and shows the target selector shape, adding practical meaning beyond the field descriptions.

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

Purpose5/5

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

States a specific verb (call) and resource (Home Assistant service) and immediately shows the exact shape of an invocation with a concrete working example. An agent can tell this is the generic service-dispatch tool, distinct from siblings like ha_update_entity or ha_fire_event, without opening the schema.

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

Usage Guidelines3/5

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

It gives important preconditions ('refused unless writes are enabled', 'blocked for denied domains') but never says when to prefer this over alternatives such as ha_update_entity, ha_trigger_automation, or ha_fire_event. Usage is implied by the example rather than explicitly scoped.

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

ha_camera_frameA camera still as pixelsA
Read-only

A camera's current still decoded and shrunk to at most width x height pixels, returned as RGB bytes (base64, 3 a pixel, row by row): for a client that draws pictures in text, such as a dashboard pane in a terminal (two pixels a character cell with half blocks). To look at a camera yourself, use ha_camera_image. Through VomeHome the API key needs Cameras ticked under Sensitive devices.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYesMost pixels across.
heightYesMost pixels down.
entity_idYesThe camera entity, e.g. 'camera.front_door'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly, openWorld), so the bar is lower, and the description still adds substantial detail: base64 RGB encoding, 3 bytes per pixel, row-by-row layout, and the credential requirement. It omits error/rate-limit behavior, which keeps it from a 5.

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

Conciseness4/5

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

Purpose is front-loaded and every sentence carries information (format, target consumer, alternative, auth). The nested parentheticals (base64, 3 a pixel, two pixels a character cell) make it dense but not wasteful.

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

Completeness4/5

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

With no output schema, the description carries the burden of explaining the return value, and it does so thoroughly (base64 RGB bytes, 3 per pixel, row-major). Combined with the auth note and sibling routing, an agent has what it needs to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents width, height, entity_id, and instance_id. The description adds the notion of downscaling to at most width x height but no per-parameter semantics beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource: it fetches a camera's current still, decodes it, and shrinks it to at most width x height pixels. It also names the sibling ha_camera_image as the tool for looking at a camera yourself, so an agent can distinguish it without opening either schema.

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

Usage Guidelines5/5

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

Explicitly scopes usage to clients that draw pictures in text (terminal dashboard panes, two pixels per cell with half blocks) and routes the user to ha_camera_image for direct viewing. It also states the VomeHome auth prerequisite (Cameras ticked under Sensitive devices).

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

ha_camera_imageLook at a cameraA
Read-only

Return a camera's current still as an image you can see — to check framing, exposure, or what the camera shows. For a camera entity that shows the latest snapshot file, this is that snapshot. Home Assistant scales it to 'width' pixels wide (default 1024). Through VomeHome the API key needs Cameras ticked under Sensitive devices.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoWidth in pixels to scale the still to (default 1024).
entity_idYesThe camera entity, e.g. 'camera.front_door'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations cover the read-only/open-world profile, and the description adds real behavioral detail: the still is scaled to 'width' pixels (default 1024), the snapshot-file semantics, and an auth prerequisite ('the API key needs Cameras ticked under Sensitive devices'). It does not cover latency or rate limits, but for a read 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.

Conciseness4/5

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

Three tight sentences, front-loaded with what the tool returns; the scale info and the VomeHome API-key prerequisite each earn their place. Slightly dense but no filler.

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

Completeness4/5

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

There is no output schema, so the description correctly explains the return is an image, plus scaling and auth prerequisites. Complete enough to invoke correctly, with only minor gaps around failure modes.

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

Parameters3/5

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

Schema description coverage is 100%, so entity_id, width (with min/max/default), and instance_id are already fully documented. The description restates the width default and instance-scoping behavior 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.

Purpose4/5

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

States a specific verb and resource: 'Return a camera's current still as an image you can see,' and clarifies the snapshot-file semantics. It does not name its nearest sibling (ha_camera_frame) to disambiguate, so it falls just short of a 5.

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

Usage Guidelines4/5

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

Gives clear use context — 'to check framing, exposure, or what the camera shows' — which tells the agent when this is the right tool. It offers no explicit exclusions or alternative (e.g. why ha_camera_frame instead), so it is short of 5.

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

ha_change_user_passwordChange a user's passwordA
Destructive

Reset the password for a user that already has a local login (created via ha_set_user_credentials or Home Assistant's own UI). Only works when the broker is acting as the home's owner account, which is how it always authenticates. Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesUser id from ha_list_users.
passwordYesNew password.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the write semantics are covered. The description adds real context beyond that: the ha:config permission requirement and the owner-account precondition, both of which affect whether a call succeeds. It does not mention whether existing sessions/tokens are invalidated by the reset.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core action and its main precondition. The clause 'which is how it always authenticates' is slightly redundant and weakens the owner-account constraint, but overall the text earns its space.

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

Completeness4/5

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

For a destructive, no-output-schema mutation, the description covers the key prerequisites (existing local login, owner-account auth, ha:config permission). The main gap is the post-call effect on the user's existing sessions or credentials, which an agent might want to know before invoking it.

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

Parameters3/5

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

Schema coverage is 100% and all three parameters carry their own descriptions (including the instance_id refusal behavior), so the schema does the heavy lifting. The description adds only the constraint that user_id must reference a user with an existing local login, not new syntax or format detail. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource ('Reset the password for a user') and explicitly scopes it to users that already have a local login, naming ha_set_user_credentials as the sibling that creates such logins. An agent can distinguish this from ha_create_user, ha_update_user, and ha_set_user_credentials without opening any schema.

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

Usage Guidelines4/5

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

It gives clear preconditions: the user must already have a local login, and the broker must be acting as the owner account. It also states the required permission (ha:config). It stops short of explicitly saying 'use ha_set_user_credentials first if the user has no local login', so the routing is implied rather than spelled out.

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

ha_check_configCheck configurationA
Read-only

Validate the current Home Assistant configuration (equivalent to Developer Tools -> Check configuration). Returns 'valid' or the specific errors. Run this after editing YAML and before reloading.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description still adds value beyond that by disclosing the return shape ('valid' or the specific errors) and positioning it as a pre-reload gate, though it says nothing about permissions, timeouts, or validation cost.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the core purpose, followed by return format and workflow timing. No filler, and each sentence carries distinct information.

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

Completeness5/5

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

For a zero-required-parameter, read-only validation tool with no output schema, the description covers purpose, timing, and return values, and the lone parameter is fully specified in the 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.

Parameters3/5

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

Schema coverage is 100% and the single optional instance_id is fully documented in the schema, including the refusal-on-mismatch behavior. The description adds no parameter detail, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (validate) and resource (the current Home Assistant configuration), anchored to a known equivalent (Developer Tools -> Check configuration). The 'Home Assistant' scoping cleanly separates it from siblings like esphome_validate and ha_get_config, which reads rather than validates.

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

Usage Guidelines4/5

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

Gives an explicit workflow cue: run after editing YAML and before reloading. That is clear when-to-use guidance, but it names no alternatives or when-not conditions (e.g., versus esphome_validate for ESPHome configs), so it stops short of a full 5.

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

ha_clear_system_logClear system logA
Destructive

Empty Home Assistant's structured error store. The point is the debug loop: clear, reproduce the problem, then ha_get_system_log shows only what your reproduction caused. Does not touch home-assistant.log on disk. Requires HA_ALLOW_WRITE=true in direct mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description goes further by scoping the destruction ('structured error store', explicitly NOT home-assistant.log on disk) and stating a prerequisite ('Requires HA_ALLOW_WRITE=true in direct mode'). This is meaningful added context beyond the annotations.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the action and then the rationale; every sentence carries distinct information (what it empties, why, what it does not touch, and the required flag).

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

Completeness5/5

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

For a destructive no-arg mutation with no output schema, the description covers scope of effect, prerequisites, the companion read tool, and the non-effect on disk logs. Nothing an agent needs to invoke it safely is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single optional instance_id parameter is fully documented in the schema, including the refusal behavior on home mismatch. The description adds nothing about the parameter, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('Empty Home Assistant's structured error store') and immediately distinguishes itself from its sibling by naming ha_get_system_log and the relationship between them. An agent can tell it apart from ha_get_error_log/ha_get_supervisor_log without opening any schema.

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

Usage Guidelines5/5

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

Explicitly describes the intended workflow ('clear, reproduce the problem, then ha_get_system_log shows only what your reproduction caused'), which is exactly the when-to-use condition. It also names the alternative tool and clarifies the boundary (does not touch the on-disk log).

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

ha_config_entry_optionsRead or change an integration's optionsA
Destructive

Open a config entry's options flow — the per-integration settings panel — and optionally submit answers to it. Call with entry_id alone to see the current form and its fields, then again with user_input to set them.

This is the only way to reach switches that exist nowhere else in the API. The one asked for most: ESPHome's 'allow the device to perform Home Assistant actions' (field allow_service_calls), which a device needs before it can call HA services and which is buried several clicks deep in the UI. Also on that form: subscribe_logs. Get entry_id from ha_list_config_entries (domain=esphome).

Submitting a form sets every field it contains, so read it first and send the values back with only the ones you mean to change altered — omitting a field is not the same as leaving it alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
flow_idNoExisting options flow id to continue.
entry_idNoConfig entry to open the options flow for (from ha_list_config_entries).
user_inputNoAnswers for the current step, e.g. { allow_service_calls: true }.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.8/5.0
Behavior5/5

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

With annotations already declaring destructiveHint=true, the description goes further and explains *why* it is destructive: submitting a form sets every field it contains, so omitting a field does not preserve it. That is exactly the behavior an agent must know before invoking, and it exceeds what the annotations convey.

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

Conciseness4/5

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

Front-loaded with the core action, then the read-vs-write pattern, then the destructive caveat. Slightly padded by the ESPHome backstory ('buried several clicks deep in the UI'), but every sentence is relevant and none is filler.

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

Completeness5/5

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

Complete for a 4-param, no-output-schema tool: it covers the read/write modes, the entry_id source, the destructive submit semantics, and a concrete use case. The remaining parameter (instance_id) is fully documented in the schema, so no gap remains.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds interpretation beyond the schema: entry_id alone means 'read the form', user_input means 'submit answers', and it names real fields (allow_service_calls, subscribe_logs). This gives practical meaning to how the parameters combine.

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

Purpose5/5

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

States a precise verb+resource+scope: 'Open a config entry's *options* flow — the per-integration settings panel — and optionally submit answers to it.' It also clarifies the two-phase nature (call with entry_id to read, again with user_input to write), distinguishing it from the sibling ha_config_flow which handles initial setup.

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

Usage Guidelines5/5

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

Explicit when-to-use with a concrete motivating case (ESPHome's allow_service_calls switch that is unreachable elsewhere) and a pointer to ha_list_config_entries for obtaining entry_id. It also gives a crucial operational instruction: read the form first and resubmit with only intended changes, since omission is not equivalent to leaving a field alone.

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

ha_config_flowStart or continue a config flowA
Destructive

Add or configure an integration via Home Assistant's config flow API. Start: pass handler (domain). Continue: pass flow_id + user_input for the current step. Requires ha:config (brokered) or HA_ALLOW_CONFIG_WRITE (direct).

ParametersJSON Schema
NameRequiredDescriptionDefault
flow_idNoExisting flow id to continue
handlerNoIntegration domain to start a new flow for (e.g. vomesync)
user_inputNoStep answers when continuing (or defaults when starting)
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
show_advanced_optionsNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, so the write profile is covered; the description adds genuinely new context by naming the required authorization ('ha:config (brokered) or HA_ALLOW_CONFIG_WRITE'). It stops short of explaining the consequence of the destructive hint (e.g., that a completed flow creates a persistent config entry) or what happens to an abandoned flow.

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

Conciseness5/5

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

Three tight sentences with no filler, and the core purpose plus the start/continue split are front-loaded before the authorization note. Every clause carries information.

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

Completeness4/5

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

For a 5-parameter, 0-required, nested-object tool with no output schema, the description covers the two invocation modes and the auth requirement well. The gap is the flow lifecycle: it doesn't say what a completed flow yields (e.g., a new config entry) or that multi-step flows must be driven iteratively, which an agent needs to know for a config-flow API.

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

Parameters4/5

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

Schema coverage is 80%, so the baseline is 3, but the description adds cross-parameter semantics the schema cannot express: handler selects 'start' mode while flow_id + user_input select 'continue' mode, and user_input doubles as defaults on start. That mode-dependency is real added meaning beyond the per-field schema descriptions.

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

Purpose5/5

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

States a specific verb+resource ('Add or configure an integration via Home Assistant's config flow API') and immediately splits the operation into its two distinct modes (start vs. continue), which distinguishes it from siblings like ha_integration_setup_vome, ha_list_discovery_flows, and ha_config_entry_options.

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

Usage Guidelines3/5

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

It gives clear conditional context for the two modes ('Start: pass handler... Continue: pass flow_id + user_input'), which tells the agent how to invoke it, but it names no alternatives or exclusions — it never says when to prefer ha_integration_setup_vome or ha_config_entry_options, nor what happens if a flow is already partially complete.

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

ha_create_dashboardCreate Lovelace dashboardA

Register a new storage-mode Lovelace dashboard. After creating, call ha_save_dashboard to set its views/cards. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoMDI icon for the sidebar (e.g. 'mdi:home').
titleYesSidebar title for the dashboard.
url_pathYesURL path slug for the new dashboard (e.g. 'sam-energy').
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
require_adminNoRestrict dashboard to admin users (default false).
show_in_sidebarNoShow in the sidebar (default true).
allow_single_wordNoAllow a url_path without a hyphen (default false).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and openWorldHint=true. The description adds real context beyond that: the required environment toggles HA_ALLOW_WRITE and HA_ALLOW_CONFIG_WRITE, and the fact that views/cards are not set at creation and must be added via a separate call.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, then the follow-up step, then the prerequisites. Nothing extraneous; each sentence carries distinct information.

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

Completeness4/5

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

For a write tool with thin annotations and no output schema, the description covers prerequisites and the post-creation workflow, which is what an agent needs. It omits failure behavior (e.g., duplicate url_path, invalid slug) and whether a value is returned, though the no-output-schema case lowers that burden.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema with examples (mdi icon, url_path slug). The description adds no additional parameter meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Register a new storage-mode Lovelace dashboard'), including the storage-mode qualifier that separates it from YAML-mode dashboards. It also names the sibling ha_save_dashboard and clarifies the division of labor, so an agent can tell them apart without opening a schema.

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

Usage Guidelines4/5

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

Explicitly states the follow-up step ('call ha_save_dashboard to set its views/cards'), which routes the agent correctly between creation and configuration. It gives no explicit when-not or alternative-for-creation guidance, but the sequencing context is clear.

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

ha_create_userCreate a Home Assistant userA
Destructive

Create a new Home Assistant user with no login yet — call ha_set_user_credentials afterwards to give them a username and password, or they exist but cannot sign in.

A user this creates is a standing account on the home, independent of any API key. Deleting the token that created it does not remove the user. Choose 'role' deliberately: 'admin' grants full control of this Home Assistant, equivalent to the owner. Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDisplay name for the new user.
roleYes'admin' (system-admin, full access), 'user' (system-users, normal dashboard access, no settings), or 'read_only' (system-read-only, cannot change anything).
local_onlyNoRestrict this user to local-network sign-in only (no remote/cloud access).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.6/5.0
Behavior5/5

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

With annotations covering the safety profile, the description still adds substantial context beyond them: the account is a standing entity independent of the creating API key, deleting the token does not remove the user, admin grants owner-equivalent control, and the call requires the ha:config permission. These are real behavioral traits not present in the structured fields.

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

Conciseness4/5

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

The critical fact (no login yet) and the follow-up step are front-loaded, and the persistence warning is bolded for emphasis. Slightly verbose in places ('or they exist but cannot sign in' is an awkward restatement), but nothing is wasted.

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

Completeness5/5

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

For a creation tool with no output schema, the description covers what is produced (an account with no credentials), how to finish the job, the persistence semantics, and the required permission. An agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning to 'role' by warning that 'admin' is equivalent to the owner and that the choice should be deliberate. It does not elaborate on name or local_only, but those are already well documented in the schema.

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

Purpose5/5

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

States a specific verb and resource ('Create a new Home Assistant user') and immediately scopes it: the account has no login yet. It also distinguishes itself from ha_set_user_credentials and ha_delete_user by explaining the two-step credential flow and that the user persists after token deletion.

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

Usage Guidelines4/5

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

Explicitly tells the agent to call ha_set_user_credentials afterwards to make the account usable, and gives guidance on choosing 'role'. It lacks an explicit when-not or a comparison against alternatives like ha_provision_service_login, but the sequencing guidance is clear and actionable.

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

ha_delete_automationDelete automationA
Destructive

Delete an automation by its unique id. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
automation_idYesUnique id of the automation to delete.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful operational context beyond them: the call requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true, otherwise it will be refused. It still omits whether deletion is irreversible or what happens if the id is unknown.

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

Conciseness5/5

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

Two short sentences with zero waste; the action and its target are front-loaded ahead of the prerequisite. Nothing is padded or repeated.

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

Completeness4/5

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

For a single-parameter destructive call with no output schema and full annotation coverage, the description supplies the essential enablement prerequisite. It could add irreversibility/error semantics, but nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%: automation_id and instance_id are both documented in the schema, including instance_id's home-mismatch refusal behavior. The description adds no syntax or format 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.

Purpose4/5

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

States a specific verb (Delete) and resource (automation) plus the lookup key (unique id), which cleanly separates it from ha_get_automation, ha_set_automation and ha_trigger_automation. It does not name any sibling explicitly, so it falls just short of the 5 bar for sibling differentiation.

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

Usage Guidelines3/5

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

Implies the use case (remove one automation identified by id) and states the enablement prerequisite, but gives no guidance on when to delete versus alternatives such as disabling via ha_set_automation, and no exclusions. Adequate but with a clear gap.

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

ha_delete_config_entryDelete a config entry (integration)A
Destructive

Permanently delete one config entry (integration instance) by id. This is the fix for orphaned or duplicate entries — the kind left behind when a device's original config entry never got cleaned up, so a re-added device's entities pick up a '_2' (or higher) suffix because the old entry is still holding the original entity_id. Get entry_id from ha_list_config_entries; match on name/domain/state to find the stale one before deleting.

There was previously no way to do this outside the Settings → Devices & services UI. Requires ha:config. The response's require_restart says whether Home Assistant needs a restart to fully drop the entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYesConfig entry id, from ha_list_config_entries.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations flag the write/destructive profile, but the description adds genuinely new context: the deletion is permanent, it requires the ha:config scope, it was previously impossible outside the UI, and the response's require_restart signals whether a restart is needed. These go meaningfully beyond destructiveHint/readOnlyHint/openWorldHint.

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

Conciseness5/5

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

Front-loaded with the core action in the first sentence, followed by the motivating scenario, the prerequisite lookup, and the auth/return notes. Every sentence contributes actionable information with no filler.

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

Completeness5/5

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

For a destructive tool with full annotations and 100% schema coverage but no output schema, the description covers target acquisition, auth requirements, irreversibility, and the one response field of interest (require_restart). 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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description adds value by telling the agent where entry_id comes from and how to identify the correct stale entry (match on name/domain/state). The instance_id guard semantics are left to the schema, but the entry_id guidance is a useful addition.

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

Purpose5/5

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

States a specific verb and resource ('Permanently delete one config entry (integration instance) by id') and distinguishes itself from siblings like ha_remove_entity and ha_delete_automation. The orphaned/duplicate-entry scenario sharpens exactly what is being deleted.

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

Usage Guidelines4/5

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

Explains clearly when to use it (orphaned or duplicate entries causing a '_2' entity_id suffix) and routes the agent to ha_list_config_entries with matching criteria (name/domain/state). It lacks an explicit 'when not to use' or a named alternative for the entity-vs-config-entry distinction, so it falls just 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.

ha_delete_config_fileDelete a file in Home Assistant's config directoryA
Destructive

Delete one file under the config directory — a throwaway test file, a superseded package, something you wrote and no longer need. It deletes a single file only, never a directory. The Vome component on the home refuses configuration.yaml, secrets.yaml and Home Assistant's database (also through a link with another name), anything outside the config directory, and .storage.

There is no undo, so read the file first if its contents might be wanted, and ask the owner before deleting anything you did not create. If something !includes the file, remove that reference first or Home Assistant will fail its configuration check. Requires the ha:files scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile relative to the config root, e.g. 'packages/old.yaml'.
instance_idYesThe instance this delete is meant for (as listed by vomehome_list_instances). Required, and checked against the one this session is targeting: if they differ nothing is deleted.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=true, but the description adds important behavioral detail beyond them: deletion is irreversible, certain files and paths are refused, and deleting an included file can break Home Assistant's configuration check. This is exactly the kind of consequence detail an agent needs for a destructive tool.

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

Conciseness4/5

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

The description is front-loaded with the core action and then layered with warnings and constraints, all of which earn their place for a destructive operation. It is slightly verbose and contains an awkward phrase ('Vome component on the home'), but the structure remains readable and purposeful.

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

Completeness5/5

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

For a destructive file-deletion tool with no output schema, the description covers the operation, restrictions, irreversible nature, permission scope, and pre-deletion checks. Given the annotation and schema richness, nothing critical is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains both 'path' and 'instance_id' clearly, including relative-path formatting and instance mismatch behavior. The description adds some path-scope context by naming refused files and directories, but it does not add parameter-specific semantics beyond the schema baseline.

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

Purpose5/5

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

The description uses a precise verb and resource: 'Delete one file under the config directory.' It immediately scopes the operation to a single file ('never a directory') and distinguishes deletion from directory removal. This is clear enough for an agent to select it over file read/write/edit/list siblings.

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

Usage Guidelines5/5

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

It gives concrete when-to-use examples ('a throwaway test file, a superseded package') and clear preconditions: read first if contents matter, ask the owner before deleting someone else's file, and remove !includes references before deletion. It also states required scope and protected path exclusions, 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.

ha_delete_dashboardDelete Lovelace dashboardA
Destructive

Delete a storage-mode Lovelace dashboard by its id (from ha_list_dashboards or ha_create_dashboard). Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
dashboard_idYesDashboard id to delete (not url_path).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true/openWorldHint=true, so the safety profile is covered. The description adds non-obvious context the annotations cannot express: two environment gates that must be enabled and the storage-mode-only constraint. It does not say whether deletion is reversible or cascades.

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

Conciseness5/5

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

Two sentences, no filler: the action and constraint come first, then the environment prerequisites. Nothing redundant or hedged.

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

Completeness4/5

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

Given a simple two-parameter destructive tool with no output schema, the description covers scope, id source, and required flags. Minor gaps remain around irreversible side effects (e.g., whether views/cards or referencing automations are affected), but nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents both parameters, including 'not url_path' and the instance_id refusal behavior. The description largely echoes the schema's id wording, so the baseline 3 applies with little added detail.

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

Purpose5/5

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

States a precise verb+resource ('Delete a storage-mode Lovelace dashboard') and even narrows the scope to storage-mode dashboards, which distinguishes it from the YAML-mode path and from sibling deleters like ha_delete_automation or ha_delete_helper. 'by its id' clarifies the keying.

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

Usage Guidelines4/5

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

Gives the precondition set (HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true) and names where the id comes from (ha_list_dashboards or ha_create_dashboard), which routes the agent usefully. It stops short of explicit when-not guidance or naming an alternative deletion path.

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

ha_delete_helperDelete a helperA
Destructive

Delete a stored Home Assistant helper by id (from ha_list_helpers). The entity disappears immediately, and anything referencing it — automations, dashboards, template sensors — will start reporting an unknown entity, so check what uses it first.

A helper defined in configuration.yaml can be destroyed by this. Stored helpers and YAML helpers share one id namespace and one entity-registry slot, and Home Assistant deletes by that slot. Deleting a stored helper whose id matches a YAML helper's key removes the YAML entity's registry entry as well, and the entity goes with it. Reloading will NOT bring it back — a reload sees an id it already has and changes nothing. Only a full restart recreates the entity. This tool checks for that before deleting and refuses when it finds it; pass confirm_shared_id to go ahead anyway.

An id that is not in ha_list_helpers is refused: a helper defined only in configuration.yaml is removed by editing that file and restarting.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesHelper type: input_boolean, input_number, input_text, input_select, input_datetime, input_button, counter, timer, schedule.
helper_idYesHelper id from ha_list_helpers.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
confirm_shared_idNoDelete even though the id looks shared with a configuration.yaml helper. Only after checking that file: the YAML entity will need a full Home Assistant restart to come back.

TDQS

A4.9/5.0
Behavior5/5

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

Far exceeds the destructiveHint annotation by disclosing the immediate effect on referencing entities, the shared-id registry collision that can destroy a YAML-defined helper, that a reload will not restore it and only a full restart will, and the built-in refusal plus the confirm_shared_id override. This is exactly the non-obvious failure mode an agent needs before calling.

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

Conciseness5/5

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

Front-loads the core action and immediate consequence in the first sentence, then escalates to the shared-id hazard and the refusal/override behaviour. Long but every sentence carries distinct, decision-relevant information.

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

Completeness5/5

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

No output schema exists, but none is needed for a delete tool. The description covers the mutation effect, the destructive edge case, the guard and its override, and the alternative path for YAML-only helpers, leaving nothing an agent needs to call it safely.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description goes further by explaining the reasoning behind confirm_shared_id (overriding the shared-id refusal and the restart consequence) and the origin of helper_id, which materially deepens the schema's text. instance_id's cross-instance guard is left to the schema, so not a full 5.

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

Purpose5/5

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

Specific verb (Delete) plus specific resource (a stored Home Assistant helper by id), with the id's provenance named as ha_list_helpers. It is clearly separable from siblings like ha_set_helper, ha_list_helpers and ha_remove_entity.

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

Usage Guidelines5/5

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

States when to use it (stored helper id from ha_list_helpers) and explicitly when it cannot be used (an id not in ha_list_helpers, i.e. a configuration.yaml-only helper, which must be removed by editing the file and restarting). It also directs the caller to check referencing automations/dashboards/template sensors first.

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

ha_delete_scriptDelete scriptA
Destructive

Delete a script by id. Automations that call it will fail at that step, so remove those calls first. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesScript id: the key in scripts.yaml and the object id of script.<id>, e.g. 'raise_heat'. 'script.raise_heat' also works.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, yet the description goes further and discloses the downstream consequence (dependent automations will fail at that step) plus the two environment flags required for the call to succeed. That is exactly the kind of context annotations cannot carry.

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

Conciseness5/5

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

Three short sentences, zero filler, with the action first, the hazard second, and the prerequisites last. Every sentence earns its place.

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

Completeness5/5

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

For a destructive mutation with full annotations, complete schema coverage, and no output schema, the description supplies the two things that matter: the blast radius on dependent automations and the required write flags. Nothing an agent needs before calling it is missing.

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

Parameters3/5

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

Schema description coverage is 100%, including a detailed script_id description and the optional instance_id scoping semantics, so the schema does the heavy lifting. The description adds only 'by id' and nothing about the instance_id guard, meriting the baseline 3.

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

Purpose4/5

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

States a specific verb and resource ('Delete a script by id'), which cleanly separates it from siblings like ha_delete_automation and ha_delete_dashboard. It does not explicitly name a sibling or call out what it is not, so it falls just short of the top score.

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

Usage Guidelines4/5

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

Gives concrete preconditions ('Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true') and a when-not-to-call-this-yet warning ('remove those calls first'). It stops short of pointing to an alternative tool for fixing the dependent automations, so it is clear context rather than full routing guidance.

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

ha_delete_userDelete a Home Assistant userA
Destructive

Permanently delete a user and any login credentials attached to it. Cannot delete the account currently in use (the broker's own owner account) or a system-generated user. Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesUser id from ha_list_users.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds the details that matter: deletion is permanent, it cascades to attached login credentials, it is gated on the ha:config permission, and it will refuse specific protected accounts. This is behavioral context beyond what the 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.

Conciseness5/5

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

Three short sentences, front-loaded with the destructive action, then constraints, then the permission requirement. No filler and nothing an agent needs is buried.

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

Completeness5/5

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

For a destructive, annotated, no-output-schema mutation tool, the description covers permanence, cascade effects, permission gate, and refusal cases. Return values need not be described since no output schema exists, and safety is already carried by annotations.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (user_id, instance_id) are fully documented in the schema itself, including the cross-tool reference to ha_list_users. The description adds no parameter-level meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Permanently delete a user') plus the cascade scope ('any login credentials attached to it'), which cleanly separates it from siblings like ha_remove_user_credentials (credentials only) and ha_update_user (mutation without deletion). An agent can select it without opening any schema.

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

Usage Guidelines4/5

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

Gives explicit when-not conditions (cannot delete the currently in-use owner account or a system-generated user) and the prerequisite 'Requires ha:config'. It stops short of naming the closest alternative (ha_remove_user_credentials) for the case where only credentials should be removed, so it is strong 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.

ha_edit_config_fileEdit part of a config file in placeA
Destructive

Change part of a text file under the config directory: each edit replaces one exact piece of text with another, and must match exactly once. Prefer this to ha_write_config_file for any change to an existing file: resending a 70 KB file to change three lines is slow and risks a slip anywhere in it. Nothing is written unless every edit applies. Afterwards the configuration is checked and the file put back if the edit broke it, as with ha_write_config_file. Requires the ha:files scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile relative to the config root, e.g. 'automations.yaml'.
editsYesApplied in order, each to the result of the one before.
verifyNoCheck the configuration afterwards and restore the file if it fails (default true).
instance_idYesThe instance this edit is meant for (as listed by vomehome_list_instances). Required, and checked against the one this session is targeting; refused if they differ.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the destructiveHint=true / openWorldHint=true annotations: it discloses atomicity ('Nothing is written unless every edit applies'), automatic post-edit verification with restore-on-failure, the exact-match-once constraint, ordering semantics, and the required ha:files scope. These are the operationally decisive facts an agent needs before mutating a config file.

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

Conciseness4/5

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

Front-loaded with the core mechanic, then the sibling comparison, then atomicity, then verification, then scope — a logical order with no filler. It runs slightly long, and the 70 KB example is a flourish, but every sentence carries real information.

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

Completeness4/5

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

For a destructive, no-output-schema mutation tool, the description covers safety profile, atomicity, verification/rollback, scope requirements, and the alternative — nearly everything an agent needs. Minor gaps remain (e.g. behavior when an old_text fails to match uniquely or what the response/error looks like), but the essentials are present.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline of 3 applies. The description reinforces edit semantics ('replaces one exact piece of text with another, and must match exactly once') but largely restates what the schema's old_text/new_text descriptions already say, adding little parameter-level detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('change part of a text file under the config directory') and immediately narrows scope to surgical, single-occurrence text replacement. It explicitly distinguishes itself from the closest sibling ha_write_config_file, so an agent can tell them apart without opening either schema.

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

Usage Guidelines5/5

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

Explicitly routes: 'Prefer this to ha_write_config_file for any change to an existing file', and gives the condition (editing an existing file) plus the reason (resending a 70 KB file is slow and error-prone). This is when-to-use guidance with a named alternative, not just an implied context.

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

ha_fire_eventFire an eventB

Fire a custom event on the Home Assistant event bus (advanced). Useful for triggering event-based automations during testing. Requires writes to be enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_dataNoOptional event data payload.
event_typeYesEvent type, e.g. 'my_custom_event'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and openWorldHint=true, so the write/open-world nature is known. The description adds a useful precondition ('Requires writes to be enabled') and an audience hint ('advanced'), but says nothing about effect on state, idempotency, or failure modes.

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

Conciseness4/5

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

Three short sentences, front-loaded with the action, then the use case. No padding; only mild redundancy between the title and the first clause.

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

Completeness3/5

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

For a mutation tool with no output schema but with annotations, the definition covers what it does and its prerequisite, but omits return/failure behavior and any routing guidance against the many other triggering siblings. Adequate but with clear gaps.

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

Parameters3/5

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

Schema description coverage is 100% and all three parameters (event_type, event_data, instance_id) are documented in the schema. The description adds no format, syntax, or payload guidance beyond that, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: fire a custom event on the Home Assistant event bus, and flags it as advanced. It does not name a sibling alternative (e.g. ha_trigger_automation or ha_call_service), so the agent still has to infer how it differs from other triggering tools.

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

Usage Guidelines3/5

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

Gives an implied use case (triggering event-based automations during testing) but no explicit when-not-to-use or named alternative. The condition selecting this over ha_trigger_automation 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.

ha_get_automationGet automation configB
Read-only

Get the full configuration (triggers, conditions, actions) of an automation. Accepts either the entity_id (automation.xxx) or the unique id.

ParametersJSON Schema
NameRequiredDescriptionDefault
automationYesentity_id (automation.xxx) or unique id.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds value by disclosing the returned shape (triggers, conditions, actions), which partially compensates for the absent output schema, but says nothing about error behavior or whether the returned config is editable.

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

Conciseness4/5

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

Two tight sentences with the purpose and return shape front-loaded and no filler. The second sentence is somewhat redundant with the schema's automation description, a minor waste.

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

Completeness4/5

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

For a read-only getter with annotations covering safety and full schema coverage, the description is nearly sufficient, and naming the returned components partly substitutes for a missing output schema. It could still say more about the config's editability or failure modes.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, including the instance_id refusal semantics. The description merely restates the automation parameter's accepted forms (entity_id or unique id) with no added syntax or format detail. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb and resource ('Get the full configuration ... of an automation') and enumerates the returned components (triggers, conditions, actions), which separates it from a bare list tool. It does not explicitly name the sibling it is not, e.g. ha_list_automations or ha_get_config, so an agent must infer the distinction.

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

Usage Guidelines2/5

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

The description gives no when-to-use or when-not guidance and never mentions alternatives such as ha_list_automations (for enumerating) or ha_set_automation (for mutation). The intended usage is only weakly implied by the purpose statement.

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

ha_get_configGet Home Assistant configA
Read-only

Return core Home Assistant configuration: version, location name, time zone, unit system and the list of loaded integrations/components. A good first call to understand the instance.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and world-scope are covered. The description adds the return content and implies cheap orientation, but says nothing about auth requirements, cost, or caching; the instance-targeting refusal rule lives in the schema, not the description. Adequate, but not rich additional context.

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

Conciseness5/5

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

Two tight sentences with the returned fields front-loaded and the orientation hint second. No filler or restatement of the tool name.

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

Completeness4/5

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

With no output schema, the description carries the burden of describing the return payload and does so by enumerating the key fields. For a zero-required-param read tool this is close to complete; only a note on response shape (flat object vs nested) is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single optional instance_id is thoroughly documented in the schema, including the refusal behavior when targeting a different home. The description adds no parameter-level detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb ('Return') and resource ('core Home Assistant configuration') and enumerates exactly what is included: version, location name, time zone, unit system, loaded integrations/components. This cleanly separates it from siblings such as ha_get_system_log or ha_list_config_entries, which return different artifacts.

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

Usage Guidelines4/5

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

'A good first call to understand the instance' gives an explicit usage context, which is real guidance for an agent orienting itself. It does not name an alternative or state when-not to use it, so it falls short of the 5-level routing guidance.

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

ha_get_dashboardGet Lovelace dashboard configA
Read-only

Get the full Lovelace configuration for one dashboard (views, cards, etc.). Use url_path from ha_list_dashboards — e.g. 'lovelace' for the default overview, or a custom path like 'sam-energy'.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_pathNoDashboard url_path (from ha_list_dashboards). Omit or use 'lovelace' for the default overview.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the payload is the full configuration including views and cards, which hints at response size, but says nothing about auth, rate limits, or failure modes; the instance-mismatch refusal behavior lives in the schema, not the description.

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

Conciseness5/5

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

Two tight sentences: the purpose first, then the argument-sourcing guidance. 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.

Completeness4/5

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

For a read-only two-parameter tool with full schema coverage and no output schema, the description conveys what is returned and where the input comes from. Only minor gaps remain around how large/structured the returned config is.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, including that 'lovelace'/omission means the default overview. The description's 'sam-energy' example adds a small amount of value about custom paths but does not go beyond the schema baseline.

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

Purpose5/5

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

States a specific verb and resource ('Get the full Lovelace configuration for one dashboard') and scopes the return ('views, cards, etc.'), which cleanly separates it from ha_list_dashboards, ha_save_dashboard, ha_create_dashboard and ha_delete_dashboard.

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

Usage Guidelines4/5

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

Explicitly routes the agent to ha_list_dashboards as the source of the url_path argument and explains what a path looks like. It does not state exclusions (e.g. what to do if you only want a summary), but the invocation context is unambiguous.

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

ha_get_entity_registryGet entity registryA
Read-only

Inspect the entity registry: platform, area, device, unique-id metadata and whether entities are disabled or hidden. Useful for finding disabled entities or the area/device an entity belongs to.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoFilter to a single domain, e.g. 'light'.
entity_idNoExact entity_id to look up.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
include_disabledNoInclude disabled entities (default true).

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the output includes disabled/hidden flags, but says nothing about auth requirements, rate limits, or how the multi-home instance_id refusal behaves (that detail lives only in the schema).

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

Conciseness5/5

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

Two sentences, zero filler, and the core capability is front-loaded before the use-case sentence. Nothing is repeated from the title or schema.

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

Completeness4/5

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

For a read-only inspection tool with full parameter coverage and no output schema, the description covers what is returned well enough to call it correctly. It could state the response shape (a list of registry entries) or filtering interactions, but nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented, including the instance_id refusal semantics and the include_disabled default. The description adds no syntax, format, or interaction 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.

Purpose4/5

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

The description names a specific verb ('Inspect') and resource ('entity registry') and enumerates the metadata returned (platform, area, device, unique-id, disabled/hidden). It is clearly distinct from ha_get_state (state vs. registry metadata), though it never names a sibling tool to route against.

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

Usage Guidelines3/5

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

'Useful for finding disabled entities or the area/device an entity belongs to' gives a concrete use context, but there is no explicit when-to-use vs. when-not guidance and no mention of alternatives like ha_list_entities or ha_get_state, which an agent selecting between registry and state lookups would need.

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

ha_get_error_logGet error logA
Read-only

Return the tail of the raw Home Assistant error log. ha_get_system_log is usually the better first stop (grouped and structured); reach for this one when you need the raw ordering, or lines the structured store drops.

ParametersJSON Schema
NameRequiredDescriptionDefault
tail_linesNoNumber of trailing lines to return (default 200).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful context beyond that: this is the raw, ungrouped log and the structured store may drop lines, which explains why the two tools can disagree. It doesn't mention the default tail size or the foreign-instance refusal, but those live in the schema.

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

Conciseness5/5

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

Two sentences with no filler, and the primary routing decision is front-loaded immediately after the one-line purpose statement.

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

Completeness4/5

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

For a two-parameter read-only log tool with full schema coverage and no output schema, the description supplies enough to call it correctly and to pick it over the structured-log sibling. Only the return shape/pagination is unaddressed, which is minor here.

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

Parameters3/5

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

Schema description coverage is 100% for both parameters, including the default of 200 lines and the instance_id refusal semantics, so the schema carries the load. The description adds no parameter-level detail beyond what is already documented.

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

Purpose5/5

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

States a specific verb and resource ('Return the tail of the raw Home Assistant error log') and contrasts it with the sibling ha_get_system_log, so an agent can distinguish the two logs without opening either schema.

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

Usage Guidelines5/5

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

Explicit routing guidance: ha_get_system_log is named as the usual better first stop, and the exact conditions for choosing this tool instead (raw ordering, lines the structured store drops) are spelled out.

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

ha_get_historyGet entity historyA
Read-only

Get historical state changes for one or more entities over a time window. Times are ISO 8601 (e.g. 2026-06-05T06:00:00+00:00). Defaults to the last day if no start_time is given; with a start_time and no end_time it runs up to now (Home Assistant on its own would stop 24 hours after the start).

ParametersJSON Schema
NameRequiredDescriptionDefault
minimalNoReturn minimal response (state + last_changed only) to reduce size.
end_timeNoISO 8601 end timestamp.
entity_idsYesEntities to fetch history for.
max_pointsNoReturn each series as at most this many [time, value] points: numbers averaged per time bucket, other states as each bucket's last. For charts: a day of a sensor can be thousands of states.
start_timeNoISO 8601 start timestamp.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds non-obvious behavior beyond that: the default time window and the fact that this tool overrides Home Assistant's native 24-hour cutoff. It does not discuss result size or rate characteristics, which keeps it below a 5.

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

Conciseness4/5

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

Three dense sentences, front-loaded with the core purpose followed by time-window semantics. The parenthetical about Home Assistant's native cutoff earns its place, though the phrasing is slightly wordy.

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

Completeness4/5

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

For a read-only query tool with a fully documented 6-parameter schema and no output schema, the description covers the critical ambiguity (default time ranges) that would otherwise cause wrong calls. It could hint at the returned shape (per-entity series) since no output schema exists, but overall it is sufficient.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds meaning the schema does not: the default/fallback behavior of start_time and end_time and the ISO 8601 format expectation. It still doesn't clarify minimal or max_points trade-offs, which are covered only in the schema.

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

Purpose5/5

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

States a specific verb+resource ("Get historical state changes") plus scope ("one or more entities over a time window"), which cleanly separates it from sibling readers like ha_get_state (current state) and ha_get_logbook. An agent can route to it without opening the schema.

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

Usage Guidelines4/5

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

Gives clear operational context: default window is the last day, and a start_time without end_time runs to now (with the note that Home Assistant alone would stop after 24h). It does not name alternatives (e.g. ha_get_logbook for event-style history), so it stops short of explicit when/when-not routing.

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

ha_get_logbookGet logbookA
Read-only

Return human-readable logbook entries (what happened and when), optionally filtered to a single entity and time window. Times are ISO 8601; with a start_time and no end_time it runs up to now (Home Assistant on its own would stop 24 hours after the start).

ParametersJSON Schema
NameRequiredDescriptionDefault
end_timeNoISO 8601 end timestamp.
entity_idNoRestrict to a single entity_id.
start_timeNoISO 8601 start timestamp.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true). The description adds a genuinely non-obvious behavioral fact: with start_time and no end_time it runs to now, whereas Home Assistant alone would cap at 24 hours. That is useful context beyond the structured fields, though no return-shape or pagination behavior is described.

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

Conciseness5/5

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

Two sentences, both earning their place: the first defines the resource and filtering, the second covers timestamp format and the end_time default caveat. Front-loaded with the purpose and no filler.

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

Completeness4/5

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

With no output schema, the description wisely characterizes the return content (human-readable 'what happened and when'), and the annotations carry the safety profile. It omits any mention of the instance_id refusal behavior that the schema documents, but that gap is minor given full schema coverage.

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

Parameters4/5

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

Schema coverage is 100%, so the schema documents all four parameters. The description still adds value by stating the timestamp format (ISO 8601) and the end_time default semantics, i.e. behavior the schema's terse per-property descriptions do not convey.

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

Purpose4/5

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

States a specific verb and resource — 'Return human-readable logbook entries (what happened and when)' — with the filter scope made explicit. It separates itself conceptually from sibling log tools (ha_get_history, ha_get_system_log, ha_get_error_log), but never names them, so differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

Usage is implied by the resource ('logbook entries'), and the optional entity/time filtering hints at typical calls, but there is no explicit when-to-use, when-not-to-use, or routing to the many sibling log/history tools. An agent must infer the choice from the name alone.

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

ha_get_scriptGet script configA
Read-only

Get a script's full configuration (alias, sequence, fields, mode). List scripts with ha_list_entities domain='script'.

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptYesScript id: the key in scripts.yaml and the object id of script.<id>, e.g. 'raise_heat'. 'script.raise_heat' also works.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered structurally. The description adds the shape of the returned configuration, which is genuinely useful, but says nothing about auth needs, failure modes, or behavior for unknown script ids beyond what the schema's instance_id text already conveys.

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

Conciseness5/5

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

Two tight sentences with the core purpose front-loaded and the disambiguation trailing. Every clause earns its place; no filler.

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

Completeness4/5

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

With no output schema, the description correctly carries the burden of describing the return shape (alias, sequence, fields, mode), which is adequate for a read-only getter. The field list is slightly coarse but sufficient for an agent to decide to call it.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are fully documented in the schema, including the 'script.raise_heat' id form and the instance_id refusal semantics. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Get a script's full configuration') and enumerates what the config contains (alias, sequence, fields, mode), so an agent knows exactly what comes back. It also differentiates itself from the listing path by naming ha_list_entities as the sibling to use for enumeration.

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

Usage Guidelines4/5

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

It explicitly routes the enumeration case to ha_list_entities domain='script', giving one clear when-to-use alternative with a condition. It does not address the get-vs-other-getters case (e.g. ha_get_automation, ha_get_config), so it stops short of full exclusion guidance.

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

ha_get_stateGet entity stateA
Read-only

Get the full state and attributes for one or more entities. Use this to read exact current values before changing them or writing template/automation logic.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idsYesOne or more entity_ids, e.g. ['light.kitchen','sensor.outside_temp'].
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds that it returns full state plus attributes, but says nothing about behavior for unknown entities, unavailable states, or cross-instance refusal (that detail lives only in the instance_id schema field).

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

Conciseness5/5

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

Two tight sentences with no filler; the core action leads and the usage cue follows immediately. Every clause earns its place.

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

Completeness3/5

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

With no output schema, the description should carry more of the return-shape burden; it only gestures at 'full state and attributes' without indicating the state/attributes structure an agent must parse. Adequate for selection, thin for consumption.

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

Parameters3/5

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

Schema description coverage is 100%: entity_ids format and examples plus the instance_id refusal semantics are fully documented in the schema. The description adds only the 'one or more' cardinality, so baseline 3 is appropriate.

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

Purpose4/5

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

Names a specific verb (get) and resource (entity state/attributes) and adds a scope qualifier ('one or more entities'), which distinguishes it from the list-style sibling ha_list_entities and the time-series ha_get_history. It does not explicitly name a sibling, but the purpose is unmistakable.

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

Usage Guidelines4/5

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

Gives a clear usage context: read exact current values before mutating them or writing template/automation logic. That is real when-to-use guidance, though it names no alternative tool to use instead (e.g., ha_list_entities for bulk browsing).

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

ha_get_supervisor_logGet Supervisor / add-on logA
Read-only

Tail the logs of an add-on, Home Assistant Core, the Supervisor itself, or the host — for problems that never reach HA's own error log (an add-on crash-looping, a failed install, host-level trouble). Requires a Supervised / HAOS install. Works through the VomeHome broker too (read scope).

ParametersJSON Schema
NameRequiredDescriptionDefault
targetNoWhich log to read (default 'core'). Use 'addon' with addon_slug.
addon_slugNoAdd-on slug when target='addon', e.g. 'core_mosquitto' or the Vome slug.
tail_linesNoNumber of trailing lines to return (default 200).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful context beyond that: a Supervised/HAOS prerequisite and the fact that it works through the VomeHome broker with read scope.

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

Conciseness5/5

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

Two dense sentences, front-loaded with the action and resource list, with the differentiator and the constraint following. No filler and nothing that could be cut without losing meaning.

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

Completeness4/5

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

With no output schema, the description could say more about what the tail output looks like (format, truncation, whether it streams), but it does cover scope, prerequisites and the broker path. Adequate for a read-only log accessor.

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

Parameters3/5

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

Schema description coverage is 100%, so target, addon_slug, tail_lines and instance_id are all already documented, including the enum values and defaults. The description adds no format or syntax detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a concrete verb (tail) and enumerates the exact resources (add-on, HA Core, Supervisor, host), and explicitly distinguishes itself from HA's own error log. An agent can tell it apart from ha_get_error_log / ha_get_system_log without opening any schema.

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

Usage Guidelines4/5

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

Gives a clear when-to-use trigger: problems that never reach HA's error log, with concrete symptoms (crash-looping add-on, failed install, host-level trouble). It does not name the sibling log tools as explicit alternatives, so it stops short of a full routing rule.

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

ha_get_system_logGet system log (structured)A
Read-only

Home Assistant's deduplicated error store: one record per distinct problem, with level, logger, source file:line, occurrence count and first/last seen. Prefer this over ha_get_error_log — 20 grouped issues instead of 200 raw lines. Filter by minimum level, logger name or free text. Full tracebacks are omitted by default (you still get the final exception line); set include_exception=true, usually narrowed with 'contains', to read a whole stack.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum entries to return, newest first (default 25).
loggerNoCase-insensitive substring matched against the logger name only, e.g. 'hue'.
containsNoCase-insensitive substring matched against logger, message, source and traceback.
min_levelNoMinimum severity to include (default 'warning').
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
include_exceptionNoInclude full tracebacks (default false — large).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover the read-only safety profile, but the description adds real behavioral detail: deduplication semantics, that tracebacks are omitted by default yet the final exception line is retained, and that include_exception returns full stacks. That default-vs-opt-in behavior 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.

Conciseness5/5

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

Four dense sentences, front-loaded with what the tool returns and its differentiator before the filtering and traceback guidance. No filler; every clause carries information.

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

Completeness5/5

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

With no output schema, the description compensates by enumerating the record shape (level, logger, source file:line, occurrence count, first/last seen). Annotations handle safety, so an agent has everything needed to call it and interpret results.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a genuine interaction tip not in the schema: pairing include_exception=true with 'contains' to narrow a stack read. It also summarizes the filter axes (min level, logger, free text), which reinforces rather than merely repeats the schema.

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

Purpose5/5

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

States a specific verb and resource ('get system log') and characterizes the resource precisely as a 'deduplicated error store: one record per distinct problem' with the fields returned. It explicitly distinguishes itself from the sibling ha_get_error_log, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit preference rule ('Prefer this over ha_get_error_log — 20 grouped issues instead of 200 raw lines') and conditions for the include_exception toggle ('usually narrowed with contains'). When-to-use and the alternative are both named.

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

ha_get_traceGet automation/script traceA
Read-only

Step-by-step detail for one run: what triggered it, every condition and action in order with its result, and 'failed_at' naming the first step that errored or evaluated false. This is the tool for 'why didn't my automation run' — logs usually stay silent about a condition returning false. Give 'item' and omit run_id for its most recent run, or give a run_id from ha_list_traces (item is then optional — the run's own item is looked up). Summarised by default; set full=true for the raw trace including the config (large).

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoReturn the raw, unsummarised trace including the item's config (default false).
itemNoentity_id or unique id (automation.x / the unique id; script.y / y). Required unless run_id is given.
domainNoItem kind (default 'automation').
run_idNoSpecific run to fetch (default: the latest).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
include_variablesNoInclude each step's changed variables (default false — verbose).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish read-only/open-world. The description adds real behavioral context beyond them: output is summarised by default, full=true returns the raw trace including config and is 'large', and it explains that logs stay silent about false conditions. It doesn't cover pagination or error behavior, but that is minor against 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.

Conciseness4/5

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

Front-loads the return-shape summary, then the use case, then the argument rules. Roughly four dense sentences with no filler, though it is on the longer side for a single-get tool and could trim the 'why didn't my automation run' aside slightly.

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

Completeness4/5

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

With no output schema, the description carries the burden of describing returns and does so well: trigger, ordered conditions/actions, results, and failed_at. The summarised-vs-full distinction is covered. It stops short of describing the shape of the summarised payload or error cases, leaving a small gap.

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

Parameters4/5

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

Schema coverage is 100% (baseline 3), but the description goes further by explaining the interaction semantics: give item and omit run_id for the latest run, or give run_id and item becomes optional because the run's own item is looked up. That relational behavior is not spelled out in the schema and adds genuine value.

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

Purpose5/5

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

States a specific verb and resource ('Get', trace) and enumerates what one run's output contains: trigger, ordered conditions/actions with results, and 'failed_at'. It distinguishes itself from the sibling ha_list_traces by being the drill-down for a single run while that tool enumerates runs.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'This is the tool for why didn't my automation run', and names ha_list_traces as the source of run_id. It gives concrete when-to-use rules for the item vs run_id combination, so there is no ambiguity about which argument to supply in which situation.

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

ha_hacs_add_repositoryAdd a custom HACS repositoryA
Destructive

Add a custom repository to HACS by GitHub 'owner/repo' (or its URL) and category (e.g. 'integration', 'plugin', 'theme', 'python_script', 'appdaemon', 'netdaemon', 'template'). This only registers it with HACS — call ha_hacs_download_repository afterwards to actually install it. Requires ha:config: this is how a repository HACS doesn't already list (a fork, a private project, one not yet in the default store) becomes installable at all.

HACS reports success on this call even when the add silently failed, so this tool confirms by re-listing repositories and checking the new one actually appears.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryYesHACS category: integration, plugin, theme, python_script, appdaemon, netdaemon, or template.
repositoryYesGitHub 'owner/repo' or its URL, e.g. 'me/my-integration'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=true), and the description adds traits annotations cannot express: the ha:config authorization requirement, the scope of the mutation ('only registers it'), and the critical quirk that HACS reports false success so the tool self-verifies by re-listing repositories.

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

Conciseness4/5

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

Two tight paragraphs: the first covers action, inputs, and the prerequisite follow-up; the second covers the silent-failure verification. Front-loaded and largely waste-free, though the parenthetical category list duplicates the schema's enumeration.

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

Completeness5/5

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

With no output schema, the description compensates by explaining the observable outcome and the confirmation mechanism, plus prerequisites and the required follow-up call. An agent has everything needed to invoke it correctly and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents repository, category, and instance_id semantics in detail. The description's category examples and 'owner/repo' format restate schema content rather than extending it, so the baseline of 3 applies.

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

Purpose5/5

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

The description gives a specific verb+resource ('Add a custom repository to HACS'), states the identifier format ('owner/repo' or URL) and the category taxonomy, and explicitly distinguishes itself from the sibling ha_hacs_download_repository by clarifying it only registers rather than installs.

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

Usage Guidelines5/5

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

It states the exact follow-up needed ('call ha_hacs_download_repository afterwards to actually install it') and the condition that selects this tool (a fork, private project, or repo not in the default store). The auth prerequisite 'Requires ha:config' further scopes when the call will succeed.

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

ha_hacs_download_repositoryInstall (download) a HACS repositoryA
Destructive

Install or update a repository HACS already knows about — this is the step that actually writes its files into the config directory and, for a brand-new integration, reloads HACS's entities. Accepts either the repository id (from ha_hacs_list_repositories or ha_hacs_add_repository) or its 'owner/repo' full name. A newly installed custom integration or add-on domain still needs a Home Assistant restart before it can be set up; a plugin/theme/dashboard resource does not. Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoSpecific version/tag to install. Omit for the latest.
repositoryYesRepository id or 'owner/repo' full name.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds real value on top: it discloses that files are written to the config directory, that HACS entities get reloaded for brand-new integrations, and that a restart is conditionally needed. It does not say what an update overwrites or whether a failure leaves partial files, which is the main remaining gap for a destructive write.

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

Conciseness4/5

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

Three dense sentences with the core action front-loaded, followed by accepted inputs, then prerequisites. Every sentence carries information, though the restart caveat and auth requirement could be trimmed slightly for a tighter read.

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

Completeness4/5

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

No output schema exists, and the description covers the essentials an agent needs: write semantics, auth scope, accepted identifier forms, and post-install behavior. It stops short of describing the return payload or what happens on a failed download, which keeps it from a 5.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds provenance the schema lacks: it says where the repository id comes from (ha_hacs_list_repositories or ha_hacs_add_repository) and confirms the 'owner/repo' alternative. It does not elaborate on version or instance_id beyond the schema text.

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

Purpose5/5

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

States a specific verb+resource ('Install or update a repository HACS already knows about') and immediately scopes it against siblings by naming the registration step (ha_hacs_add_repository) as the prior step. The phrase 'the step that actually writes its files into the config directory' tells the agent exactly what distinguishes this tool from the other ha_hacs_* tools.

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

Usage Guidelines5/5

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

Explicitly names the two sources for the repository id (ha_hacs_list_repositories or ha_hacs_add_repository), the implicit precondition that HACS must already know the repository, and the post-install requirement (restart for integrations/add-ons, not for plugin/theme/dashboard resources). It also states the required auth scope (ha:config).

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

ha_hacs_infoHACS statusA
Read-only

Whether HACS is installed and its version, configured country, and whether it has pending background tasks. Returns an error if HACS is not installed on this instance.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description still adds real behavioral context beyond them: it discloses the error behavior when HACS is absent and mentions pending background tasks as part of the returned state.

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

Conciseness5/5

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

Two tight sentences with the returned fields front-loaded and the failure mode last. No filler, nothing redundant.

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

Completeness4/5

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

No output schema exists, so the description carries the burden of describing the return value, which it does concisely. Missing only a pointer to related HACS tools for workflow context.

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

Parameters3/5

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

Only one optional parameter and schema description coverage is 100%; its description is quite detailed, including the refusal behavior for a mismatched session. The tool description adds nothing about instance_id, so the baseline 3 for high schema coverage applies.

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

Purpose4/5

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

States the specific resource (HACS) and exactly what the call reports: install status, version, configured country, and pending background tasks. This distinguishes it from the sibling HACS tools, which all act on repositories (list/add/download/remove) rather than reporting installation state.

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

Usage Guidelines3/5

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

Usage is only implied. The note that it errors when HACS is not installed hints at a precondition, but the description never says when to call it versus the other ha_hacs_* tools (e.g., as a preflight before add/download). No explicit when-not guidance.

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

ha_hacs_list_repositoriesList HACS repositoriesA
Read-only

List repositories HACS knows about — both custom and default-store ones it has fetched metadata for. Each row includes id, full_name, category, installed, and whether it's custom. Use this to find a repository's id before calling ha_hacs_download_repository or ha_hacs_remove_repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoriesNoFilter to these HACS categories (e.g. ['integration']). Omit for all.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and network scope are covered structurally. The description adds genuine behavioral context by defining the population returned (custom + fetched default-store repos) and the per-row shape, though it says nothing about result size limits or pagination.

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

Conciseness5/5

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

Two sentences, both earning their place: the first defines scope and output, the second gives the call-time routing condition. Nothing redundant and the most decision-relevant content leads.

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

Completeness4/5

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

There is no output schema, so the description usefully enumerates the returned fields, and it covers both the data scope and the reason to call it. It is nearly complete; only a note on result volume or ordering is missing for a list tool.

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

Parameters3/5

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

Schema description coverage is 100%, with both 'categories' and 'instance_id' fully documented, including the refusal behavior for a mismatched instance. The description adds nothing about either parameter, so the baseline 3 applies — it neither compensates for nor detracts from the schema.

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

Purpose5/5

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

States a specific verb and resource ('List repositories HACS knows about') and pins down the exact scope — custom plus default-store entries that have fetched metadata. It further enumerates the returned row fields (id, full_name, category, installed, custom), so an agent knows precisely what it gets and how it differs from ha_hacs_info.

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

Usage Guidelines5/5

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

Explicitly states the operative use case: 'Use this to find a repository's id before calling ha_hacs_download_repository or ha_hacs_remove_repository.' That names the downstream siblings and the condition that selects this tool, turning it into a routing rule rather than a bare description.

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

ha_hacs_remove_repositoryRemove a HACS repositoryA
Destructive

Uninstall a HACS-managed repository's files and stop HACS tracking it as custom. Accepts either the repository id or its 'owner/repo' full name. Safe to call on a repository that was never installed (it just stops tracking it). Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
repositoryYesRepository id or 'owner/repo' full name.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is known. The description adds genuine value beyond them: it specifies that files are deleted and tracking stops, that the call is idempotent/safe on never-installed repos, and that ha:config is required.

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

Conciseness5/5

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

Three short sentences, each earning its place: what happens, the accepted input, the idempotency guarantee, and the permission requirement. Front-loaded with the core action.

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

Completeness5/5

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

For a destructive mutation with no output schema, the description covers what is destroyed, the tracking side effect, the idempotent behavior, and the auth prerequisite. Combined with annotations and fully described parameters, nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the description's note that the repository accepts an id or 'owner/repo' name merely restates the schema's own description. No additional syntax, format, or constraint detail is added, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Uninstall a HACS-managed repository's files and stop HACS tracking it as custom'), which cleanly separates it from the add/download/list HACS siblings. An agent can identify the removal operation without opening any schema.

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

Usage Guidelines4/5

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

Gives clear context for when it is appropriate, including the notable case of calling it on a repository that was never installed, and states the required permission (ha:config). It does not name an alternative tool or a when-not-to-use case, 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.

ha_integration_setup_vomeAdd the Vome (vomesync) integrationA
Destructive

Ensure the Vome custom component is set up as a config entry: start the vomesync config flow and submit defaults (new signing key + default sync.vome.io URLs). Idempotent if an entry already exists. Requires Core restart after the add-on first installed custom_components/vomesync. Needs ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidNoOptional switch UID (or uid/access_key) to subscribe on first setup
forceNoIf true, start another flow even when a vomesync entry already exists
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, and destructiveHint=true. The description adds genuine value beyond them: idempotency semantics, the Core-restart prerequisite, and the required ha:config scope. It does not clarify why destructiveHint is set or what state changes, which keeps it out of 5 territory.

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

Conciseness4/5

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

Three tightly packed sentences with the purpose front-loaded, followed by idempotency and prerequisite details. Every sentence carries information, but the dense jargon-heavy phrasing (config flow, sync.vome.io URLs, custom_components path) is slightly terse.

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

Completeness4/5

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

For a zero-required-parameter setup tool with no output schema, the description covers the key prerequisites, idempotency, and auth scope an agent needs to invoke it correctly. Only a note on the expected result of a successful setup is absent, keeping it just below fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (uid, force, instance_id) are documented in the schema itself, establishing a baseline of 3. The description alludes to defaults being submitted and to idempotency (implying 'force'), but adds no parameter syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource: 'Ensure the Vome custom component is set up as a config entry: start the vomesync config flow and submit defaults'. This distinguishes it from sibling tools like ha_addon_install_vome, ha_config_flow, and ha_delete_config_entry without the agent needing to open a schema.

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

Usage Guidelines4/5

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

Provides clear operating context: idempotent if an entry already exists, requires a Core restart after the add-on first installed custom_components/vomesync, and needs ha:config scope. It does not explicitly name an alternative sibling (e.g., when to use ha_config_flow instead), 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.

ha_list_areasList areasA
Read-only

List all Home Assistant areas (rooms/zones) with their ids, names and floor. Use the area_id or name to filter other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered and the bar is lower. The description adds that results carry ids, names and floor, but says nothing about pagination, scale, or instance-refusal behavior beyond what the schema states.

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

Conciseness5/5

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

Two tight sentences, zero waste, with the core purpose front-loaded ahead of the secondary usage hint. Nothing to trim.

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

Completeness4/5

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

With no output schema, the description does the useful work of naming the returned fields (ids, names, floor) and the filterable keys. Annotations cover the read-only safety profile, so nothing critical is missing, though edge cases like empty results or instance mismatch go unmentioned.

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

Parameters3/5

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

Schema description coverage is 100% and the single optional instance_id parameter is fully documented in the schema, so baseline 3 applies. The description adds no meaning about instance_id semantics beyond the schema text.

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

Purpose5/5

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

Specific verb+resource ("List all Home Assistant areas") and it disambiguates the HA-specific term by glossing areas as "rooms/zones" with the returned fields (ids, names, floor). An agent can distinguish this from ha_list_devices or ha_list_entities without opening the schema.

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

Usage Guidelines3/5

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

The line "Use the area_id or name to filter other tools" gives downstream context but names no alternative tool and no when/when-not condition (e.g. when to use this vs. ha_list_devices). 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.

ha_list_automationsList automationsA
Read-only

List all automations with their entity_id, unique id (needed to read/edit config), on/off state and last triggered time.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuine value beyond that by disclosing the exact payload (entity_id, unique id, state, last triggered time), which matters since there is no output schema. It does not cover pagination or the instance_id refusal behavior, but that is minor here.

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

Conciseness5/5

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

A single tight sentence with the resource and its returned fields front-loaded; every clause earns its place and nothing is padded.

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

Completeness4/5

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

For a read-only list tool with no output schema, describing the returned fields is the key missing piece and it is supplied; the only gap is the absence of guidance on the alternative list tools in this large sibling set.

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

Parameters3/5

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

Schema description coverage is 100% and the single optional instance_id is fully documented in the schema, including the cross-home refusal semantics. The description adds nothing about the parameter, so the baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb ('List') and resource ('all automations') and enumerates the returned fields, which clearly separates it from the singular ha_get_automation. The parenthetical 'unique id (needed to read/edit config)' even hints at the downstream sibling, though it never names ha_get_automation or ha_set_automation explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: by noting the unique id is 'needed to read/edit config,' it suggests this is the discovery step before get/set automation. There is no explicit when-to-use statement, no when-not, and no named alternative (e.g. ha_list_entities) for a broader entity listing.

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

ha_list_config_entriesList config entries (integrations)B
Read-only

List installed Home Assistant config entries (integrations). Optional domain filter, e.g. vomesync.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoOptional integration domain filter (e.g. vomesync, mqtt)
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description's only added context is that the entries are 'installed' integrations, a useful but thin distinction; it says nothing about pagination, ordering, or what a returned entry contains.

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

Conciseness4/5

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

Two short, front-loaded sentences with the resource named first and the filter qualifier trailing. The 'e.g. vomesync' repetition of the schema example is slightly redundant but wastes little space.

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

Completeness3/5

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

For a zero-required-parameter read tool this is nearly enough, and annotations cover safety. With no output schema, though, the description never indicates what a config entry looks like or how results are shaped, leaving that to discovery.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters including the instance_id refusal semantics are fully documented in the schema. The description restates the optional domain filter with the same example, adding no new meaning beyond the schema baseline.

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

Purpose4/5

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

States a specific verb and resource ('List installed Home Assistant config entries') and parenthetically disambiguates them as integrations, which separates it from raw config reads like ha_get_config. However, it does not explicitly contrast itself with adjacent siblings such as ha_list_discovery_flows or ha_config_entry_options.

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

Usage Guidelines2/5

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

No when-to-use, when-not-to-use, or alternative routing is given. The agent gets no signal that this lists already-installed integrations rather than pending discovery flows, which is the key discrimination among its siblings.

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

ha_list_config_filesList files in the config directoryA
Read-only

List a directory under Home Assistant's config directory. Omit 'path' for the root, where configuration.yaml lives.

Requires the ha:files scope, which covers reads as well as writes because these files hold credentials. Home Assistant's internal .storage is never listed.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoDirectory relative to the config root, e.g. 'packages'. Omit for the root.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.7/5.0
Behavior4/5

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

While readOnlyHint already declares a safe read, the description adds real behavioral context beyond the annotations: the required ha:files scope and why it spans writes (credentials in these files), plus the exclusion that internal .storage is never listed. These are non-obvious constraints an agent would otherwise miss.

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

Conciseness4/5

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

Three tight sentences, front-loaded with what the tool does before the scope prerequisite and exclusion. The credentials rationale is slightly more than strictly needed but earns its place by explaining the unusual scope requirement.

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

Completeness4/5

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

For a simple no-output-schema listing tool, the description covers scope, the default path behavior, the auth prerequisite, and a notable exclusion. Return-format detail is unnecessary given no output schema, leaving little missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both path and instance_id fully. The description's 'omit path for the root' restates the schema's own hint rather than adding new meaning, so it sits at the baseline.

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

Purpose4/5

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

States a specific verb (List) and resource (a directory under Home Assistant's config directory), with the scope 'under HA's config directory' making it distinct from generic config reads. It does not explicitly name the sibling read/write/delete config-file tools, but the listing scope is unambiguous.

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

Usage Guidelines3/5

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

'Omit path for the root' gives default-behavior guidance, and the scope note functions as a prerequisite. However, it never states when to reach for this tool versus ha_read_config_file or ha_get_config, so the agent must infer the choice from the verb alone.

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

ha_list_dashboardsList Lovelace dashboardsA
Read-only

List Home Assistant Lovelace dashboards (url_path, title, mode, sidebar visibility). Works in direct HA mode and VomeHome brokered mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description usefully adds that it operates in both direct HA and VomeHome brokered mode, but says nothing about auth requirements, result limits, or the cross-home refusal behavior hinted at in the instance_id schema.

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

Conciseness4/5

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

Two compact sentences with the resource and returned fields front-loaded and no wasted prose. The dual-mode sentence is the only slightly tangential element but is still informative.

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

Completeness4/5

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

With no output schema, the description compensates by naming the fields returned (url_path, title, mode, sidebar visibility), and the read-only nature is covered by annotations. For a simple list tool this is nearly complete; only edge behavior (cross-home refusal, limits) is left to the schema.

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

Parameters3/5

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

Schema description coverage is 100% for the single instance_id parameter, so the schema already carries the semantics. The description adds no parameter-level detail beyond what the schema states, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb and resource (list Lovelace dashboards) and enumerates the returned fields (url_path, title, mode, sidebar visibility). It is distinguishable from the singular ha_get_dashboard sibling, though the description never explicitly contrasts them.

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

Usage Guidelines3/5

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

Usage is implied by the verb 'List' versus the sibling get/create/save/delete tools, but there is no explicit when-to-use guidance or exclusion. The 'Works in direct HA mode and VomeHome brokered mode' note gives context but not a selection rule.

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

ha_list_devicesList devicesA
Read-only

List Home Assistant devices from the device registry. Optionally filter by area (id or name) and/or a search string matching name, manufacturer or model.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoArea id or name to filter by.
searchNoCase-insensitive substring matched against name, manufacturer and model.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe read profile is covered. The description adds that results come from the device registry and how filters match, but does not cover return format, pagination, or scope size. Modest added value over the annotations.

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

Conciseness5/5

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

Two tight sentences with zero waste, efficiently front-loading the core action and then the optional filters. Nothing redundant or padded.

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

Completeness4/5

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

For a read-only list tool whose safety profile is carried by annotations and whose parameters are fully documented by the schema, the description is nearly complete. No output schema exists, so return values need not be explained, though scope/volume hints would have pushed it higher.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters are already documented, including the meaningful instance_id scope rule. The description's filter details (area id/name, search across name/manufacturer/model) largely restate the schema rather than adding syntax or format meaning.

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

Purpose4/5

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

States a specific verb and resource — 'List Home Assistant devices from the device registry' — and identifies the source registry, which implicitly separates it from esphome_list_devices. However it does not explicitly name a sibling or clarify how it relates to ha_list_entities, so no explicit sibling differentiation.

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

Usage Guidelines3/5

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

Usage context is implied by the optional filters ('Optionally filter by area... and/or a search string'), which hints at how to narrow results. There is no explicit when-to-use vs alternatives guidance or exclusion criteria relative to the many sibling list tools.

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

ha_list_discovery_flowsList in-progress (discovered) config flowsA
Read-only

List config flows Home Assistant has started but not finished — chiefly integrations discovered on the network and waiting to be added. Each row carries the discovery context (host/IP, device id, model, serial) the integration matched on, so this answers 'what has HA found that is not set up yet?'. Optional domain filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoOptional integration domain filter (e.g. tuya_local, esphome)
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
include_user_flowsNoInclude flows the user started by hand; by default only discovered flows are returned

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful context beyond that: the flows are unfinished, they result from network discovery, and each row carries the matched discovery context (host/IP, device id, model, serial) — valuable since there is no output schema.

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

Conciseness4/5

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

Three front-loaded sentences that stay on task, with the core purpose stated first. The middle sentence is somewhat long but earns its place by describing return content that no output schema provides.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so by describing what each row contains. Combined with fully documented parameters and read-only annotations, it is nearly complete for a simple list tool.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters are already documented, including the instance_id refusal behavior and the include_user_flows default. The description only restates the optional domain filter, adding no meaning beyond the schema; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (List) and resource (config flows), then sharpens the scope to flows 'started but not finished' — i.e. network-discovered integrations. It effectively distinguishes this from siblings such as ha_list_config_entries (finished, configured entries) and ha_config_flow (individual flow management).

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

Usage Guidelines4/5

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

The framing 'what has HA found that is not set up yet?' gives clear usage context and the default-vs-user-started distinction. It stops short of explicitly naming the sibling to use instead when the agent wants already-set-up integrations, so there is no explicit exclusion.

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

ha_list_entitiesList entitiesA
Read-only

List entities with their current state. Filter by domain (e.g. 'light'), a free-text search over entity_id and friendly name, and/or an area (id or name). This is the fastest way to discover what exists before calling services or editing automations.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoArea id or name to filter by.
limitNoMaximum rows to return.
domainNoRestrict to one domain, e.g. 'light', 'sensor'.
searchNoCase-insensitive substring matched against entity_id and friendly_name.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
include_attributesNoInclude full attributes for each entity (default false, compact rows).

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that results are 'current state' and implicitly compact (include_attributes defaults to false), but says nothing about pagination/limit behavior, result ordering, or auth/session constraints beyond what the schema states.

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

Conciseness4/5

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

Three tight sentences with the core purpose front-loaded; the filter list follows immediately and the routing sentence closes. The last sentence is slightly promotional ('fastest way') but still earns its place as usage guidance.

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

Completeness4/5

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

For a six-parameter, zero-required read tool with no output schema and thin annotations, the description covers the discovery use case and the primary filters adequately. Gaps remain around return volume/pagination and the instance_id cross-home safety behavior, which live only in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented, and the baseline is 3. The description reinforces domain ('light'), area (id or name) and search semantics but adds no syntax or format detail beyond the schema, and never mentions limit, instance_id, or include_attributes.

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

Purpose4/5

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

The description gives a specific verb+resource ('List entities') plus the scope modifier 'with their current state,' which separates it from a single-entity read like ha_get_state. It never names the near siblings (ha_get_entity_registry, ha_list_devices), so an agent must infer the boundary itself, keeping this just short of a 5.

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

Usage Guidelines4/5

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

The final sentence gives a clear context: use this to discover what exists before calling services or editing automations, which is a genuine when-to-use statement. It offers no explicit exclusions or named alternatives (e.g. 'for one entity use ha_get_state'), so it 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.

ha_list_helpersList Home Assistant helpersA
Read-only

List the helpers Home Assistant stores — input_boolean, input_number, counter, timer and the rest. These are the ones created through the UI (or by ha_set_helper); helpers defined in configuration.yaml are not returned here, because Home Assistant keeps those separately and they cannot be edited at runtime.

They are kept separately but they are NOT independent: both kinds share one id namespace and one entity-registry slot per id. A row listed here can therefore be a phantom whose entity actually belongs to a configuration.yaml helper of the same id — see ha_delete_helper.

Omit 'kind' to list every type. Types: input_boolean, input_number, input_text, input_select, input_datetime, input_button, counter, timer, schedule.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOne helper type to list. Omit for all of them.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only cover readOnlyHint and openWorldHint, so the description carries the rest. It discloses a genuinely non-obvious behavioral trait: UI-created and config.yaml helpers share one id namespace and entity-registry slot, so a listed row can be a phantom. It does not describe return format 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.

Conciseness4/5

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

Front-loads the scope and the crucial exclusion immediately, and the type list is compact. Slight redundancy across the 'kept separately' sentences costs a point but nothing is padding.

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

Completeness4/5

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

For a read-only list tool with no output schema, the description covers scope, filtering, and the id-namespace gotcha an agent needs to interpret results. Return-field details are left unspecified, which is the main remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, and the description's kind/instance_id remarks (omit for all; refused on mismatched home) essentially restate what the schema already documents. Baseline 3 is appropriate since the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (list) and resource (helpers), enumerates the concrete helper kinds, and sharply distinguishes the scope from siblings like ha_get_config by stating that configuration.yaml helpers are NOT returned. An agent can tell this apart from ha_list_entities without opening a schema.

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

Usage Guidelines4/5

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

Gives clear usage context: omit 'kind' to list every type, and routes the agent to ha_delete_helper for the phantom-row case. It does not explicitly say when to prefer this over ha_list_entities or ha_get_entity_registry, 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.

ha_list_servicesList servicesA
Read-only

List callable Home Assistant services. Without a domain, returns every domain and its service names. With a domain, returns that domain's services including their fields/parameters so you know what data to pass to ha_call_service.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoRestrict to one domain, e.g. 'light'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: the unscoped call returns all domains with service names, while the scoped call returns fields/parameters — a meaningful disclosure of return shape in the absence of an output schema.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the core action, then the two return modes. Every clause earns its place with zero filler.

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

Completeness4/5

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

With no output schema, the description carries the burden of describing return shape and does so for both modes, plus connects to ha_call_service. Minor gap: it does not cover the instance_id guard behavior, though the schema already documents it.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the description adds clarifying semantics for domain (unscoped = all domains, scoped = fields/parameters) and implies the purpose of the fields an agent will receive. The instance_id parameter's behavior is left entirely to the schema.

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

Purpose5/5

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

Specific verb ('List') plus resource ('callable Home Assistant services'), with the two return modes spelled out. It is clearly distinguishable from siblings like ha_list_entities or ha_get_config, and it names the downstream tool it feeds (ha_call_service).

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

Usage Guidelines4/5

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

Explains the two usage modes (no domain vs. with domain) and ties the domain mode to needing field/parameter details before calling ha_call_service. It does not state when to prefer a sibling or any exclusions, so it stops short of explicit when-not guidance.

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

ha_list_tracesList automation/script tracesA
Read-only

List recent runs of an automation or script: when it ran, whether it finished, and how it stopped ('failed_condition' means a condition blocked it). Omit 'item' to list runs across everything in the domain. Home Assistant keeps a limited number of traces per item (5 by default), and none from before the last restart.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemNoentity_id or unique id (automation.x / the unique id; script.y / y). Omit for all.
limitNoMaximum runs to return, newest first (default 20).
domainNoWhich kind of item to list traces for (default 'automation').
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish this is a read-only, open-world call, but the description adds real behavioral context beyond them: retention limits (5 traces per item by default, none surviving a restart) and the meaning of the 'failed_condition' stop reason. It stops short of describing output shape or ordering behavior, but that is meaningful added value.

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

Conciseness4/5

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

Front-loaded with the core action, then the returned fields, then two dense caveats (scoping and retention) that each earn their place. No filler, though the parenthetical about 'failed_condition' makes the first sentence slightly heavy.

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

Completeness4/5

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

With no output schema, the description usefully sketches what a run record contains (timing, completion, stop reason) and warns about retention and restart loss, which is what an agent needs to interpret sparse results. A note on result ordering or the refusal behavior for instance_id would make it fully self-sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents item, limit, domain, and instance_id thoroughly. The description only restates the 'omit item' default behavior, adding no syntax or format detail beyond what the parameters already carry. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('List recent runs of an automation or script') and enumerates the returned fields (when it ran, whether it finished, how it stopped). This clearly separates it from sibling ha_get_trace (single trace detail) and ha_list_automations (definitions, not runs).

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

Usage Guidelines3/5

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

It gives one usage condition ('Omit item to list runs across everything in the domain'), which implies the filtered vs. unfiltered modes, but never routes the agent toward or away from alternatives such as ha_get_trace for full trace contents. Usage is implied rather than explicit.

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

ha_list_usersList Home Assistant usersA
Read-only

List every user on this Home Assistant instance: id, name, username (if they have a local login), role (from group_ids), is_active, is_owner, and whether they're system-generated (Supervisor's internal users — leave those alone).

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely useful context beyond that: that system-generated Supervisor users appear in the result and should be left alone, plus the note that username is only present for local logins.

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

Conciseness4/5

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

A single front-loaded sentence; the enumerated field list is the bulk of it and earns its place as a substitute for a missing output schema, though it is slightly dense.

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

Completeness5/5

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

There is no output schema, so spelling out the returned fields is exactly the right compensation, and the system-generated-user caveat closes the only real ambiguity for a simple read-only list tool.

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

Parameters3/5

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

Schema description coverage is 100% and the single instance_id parameter already documents its refusal behavior, so the description correctly does not repeat it. Baseline 3 applies since the description adds no parameter meaning of its own.

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

Purpose5/5

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

States a specific verb+resource ('List every user on this Home Assistant instance') and enumerates the returned fields, so an agent can distinguish it from siblings like ha_create_user, ha_update_user, or ha_delete_user at a glance.

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

Usage Guidelines3/5

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

Usage is implied by the read-only listing purpose, but there is no explicit when-to-use or when-not, and no alternative tool (e.g., a hypothetical single-user getter) is named or excluded.

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

ha_matter_reinterviewRe-interview a Matter deviceA

Ask a Matter device to describe itself again — the device page's Re-interview button. Do this after a firmware update, or when a button, endpoint or feature stopped appearing: Home Assistant only learns about changed endpoints when it asks. A battery device may need waking (press a button) first. Takes the Home Assistant device id from ha_list_devices. Requires HA_ALLOW_CONFIG_WRITE (ha:config).

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesHome Assistant device id (ha_list_devices), not the Matter node id.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare openWorldHint=true, readOnlyHint=false and destructiveHint=false; the description goes further by disclosing the required permission (HA_ALLOW_CONFIG_WRITE / ha:config) and the physical wake-up prerequisite. It explains why the call is needed (HA only learns changed endpoints when it asks), but says nothing about side effects like entity re-registration or reload effects.

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

Conciseness5/5

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

Front-loaded with the action and its UI analogue, then conditions, then prerequisite, then auth requirement — four short clauses with no filler. Every sentence carries an operational fact.

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

Completeness5/5

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

For a non-destructive but config-writing device operation with no output schema, the description supplies the triggers, the permission gate, the wake-up caveat, and the device-id provenance. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented, including instance_id's refuse-if-different-home semantics. The description only restates the device_id source (from ha_list_devices), matching the schema's own 'not the Matter node id' note, so it adds no meaning beyond structured data. Baseline 3 applies.

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

Purpose5/5

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

States a concrete verb and resource (ask a Matter device to describe itself) and anchors it to a familiar UI affordance, 'the device page's Re-interview button'. No sibling tool does re-interviewing, so an agent can disambiguate it instantly from ha_list_devices, ha_get_config, or the esphome tools.

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

Usage Guidelines4/5

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

Gives explicit trigger conditions — after a firmware update, or when a button/endpoint/feature stopped appearing — plus the prerequisite that a battery device may need a button press to wake. It does not state when NOT to use it or name an alternative route for related problems, so it stops just short of a full 5.

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

ha_provision_service_loginGive a program its own Home Assistant login, without anyone seeing the passwordA
Destructive

Create a non-admin Home Assistant login for a program (an MQTT client such as Zigbee2MQTT or an energy manager, an ESPHome device, a bridge), generate its password here, and write it straight into where that program reads it: an add-on's options and/or a secrets file. The password is never returned — not to you and not to the owner — so you never have to choose, see or type one. The Mosquitto add-on accepts Home Assistant logins, so this is all an MQTT client on this home needs.

Ask the owner before calling it: it creates a standing account on their home that outlives the API key that made it. Every delivery target is checked before anything is created; a new login that could be delivered nowhere is deleted again. Use rotate=true to issue a new password to a login this tool created earlier (the old one stops working); it refuses any other account. A program outside Home Assistant with neither add-on options nor a secrets file cannot be reached from here — ask the owner to set its login. Revoke with ha_delete_user. Requires ha:config, plus ha:files for secrets_file targets.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesWhat the login is for, e.g. 'Zigbee2MQTT'.
roleNo'read_only' (default) is enough for MQTT; 'user' if the program drives HA itself.
rotateNoRe-issue the password of an existing login this tool created, and redeliver it.
usernameYesLogin name: lowercase, e.g. 'zigbee2mqtt'.
deliver_toYesWhere the program reads its login. At least one.
local_onlyNoAccept sign-in from the local network only (default true).
instance_idYesThe instance this login is for (as listed by vomehome_list_instances). Checked against the one this session is targeting; refused if they differ.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations flag this as destructive and open-world, and the description adds real substance beyond them: the password is never returned, the account is standing and outlives the API key, delivery targets are validated before creation with delete-on-failure rollback, rotate invalidates the old password, and it requires ha:config (plus ha:files for secrets_file targets).

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

Conciseness4/5

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

Front-loads the core action and the never-seen password guarantee, then layers prerequisites, rotation, limitations and revocation. Slightly long, but each sentence carries distinct operational information rather than restating the schema.

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

Completeness5/5

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

For a destructive, credentialed mutation with no output schema, the description covers prerequisites, permission scopes, rollback on failed delivery, rotation semantics, reachability limits, and the revoke path. An agent has everything needed to call it correctly or refuse.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes beyond it by explaining rotate's contract (new password, old one stops working, refuses other accounts) and framing deliver_to as 'where the program reads its login' with the Mosquitto context for role/login use.

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

Purpose5/5

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

States a specific verb (create a non-admin login), the exact resource (Home Assistant login for a program), and the mechanism that makes it distinct (password generated and written directly to an add-on's options/secrets file, never exposed). It is clearly distinguishable from siblings like ha_create_user, ha_set_user_credentials and ha_delete_user.

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

Usage Guidelines5/5

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

Explicit when-to-use and when-not-to-use guidance: ask the owner first, use rotate=true only for a login this tool previously created, and a program with neither add-on options nor a secrets file cannot be reached at all. It also names the revocation alternative (ha_delete_user).

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

ha_read_config_fileRead a config fileA
Read-only

Read a file under Home Assistant's config directory — configuration.yaml, a package, an included YAML file, or (with encoding='base64') a packaged binary asset such as an icon or a data file a custom integration ships.

Read this before writing it: ha_write_config_file replaces the whole file, so the way to add a section is read, append, write back. Requires the ha:files scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile relative to the config root, e.g. 'configuration.yaml'.
encodingNo'utf8' (default) for text; 'base64' for a binary file, which otherwise fails with 'not UTF-8 text'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real behavioral context beyond that: the ha:files scope requirement, the warning that writing replaces the whole file, and the fact that binary reads fail with 'not UTF-8 text' unless base64 is used.

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

Conciseness5/5

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

Two tight paragraphs, front-loaded with what can be read and followed by the one workflow-critical caution. No filler sentences; each clause carries usable information.

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

Completeness5/5

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

For a read-only tool with no output schema and fully documented parameters, the definition covers file scope, encoding behavior, scope requirement, and the interaction with the writer sibling. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description nonetheless adds practical meaning for the encoding parameter (base64 for icons/data files a custom integration ships) and frames path as relative to the config root, exceeding what the schema alone conveys.

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

Purpose5/5

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

States a specific verb (Read) and resource (a file under Home Assistant's config directory) and enumerates the concrete file kinds (configuration.yaml, packages, included YAML, base64 binary assets). This distinguishes it from siblings like ha_get_config, ha_write_config_file, and ha_edit_config_file without needing the schema.

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

Usage Guidelines4/5

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

Explicitly instructs 'Read this before writing it' and explains the read-append-write-back workflow because ha_write_config_file replaces the whole file, plus names the required ha:files scope. It stops short of contrasting with ha_get_config or ha_edit_config_file directly, so it is clear context rather than full alternative routing.

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

ha_reload_automationsReload automationsA

Reload automations from configuration without restarting Home Assistant (calls automation.reload). Requires writes to be enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and openWorldHint=true, so the bar is lower, yet the description adds real value: it discloses the underlying service call and the write-permission prerequisite. It does not explain failure modes or whether in-flight automations are interrupted, which keeps it from a 5.

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

Conciseness5/5

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

Two tight sentences with the action, mechanism, and prerequisite front-loaded; there is no filler or redundancy.

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

Completeness4/5

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

For a no-output mutation tool with annotations covering the safety profile, the description covers purpose, mechanism, and the key gating prerequisite. It omits what happens on failure or whether running automations are affected, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100% and the single instance_id parameter is fully documented in the schema, including its cross-home refusal behavior. The description adds no parameter-level information, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (reload automations) and distinguishes itself from the broader restart operation by noting it happens 'without restarting Home Assistant'. The parenthetical naming the underlying service (automation.reload) removes any ambiguity about what actually executes.

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

Usage Guidelines4/5

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

The description gives clear context for when this is the right call (after config changes, without a full restart) and adds a prerequisite, 'Requires writes to be enabled'. It does not, however, name alternatives such as ha_check_config or ha_trigger_automation, 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.

ha_remove_entityRemove an entity from the registryA
Destructive

Remove an entity's registry entry, for cleaning up orphans: an entity whose integration no longer provides it (status 'unavailable' with restored: true), or one left behind by a deleted device. An entity its integration still provides comes straight back, so disable it with ha_update_entity instead. Requires HA_ALLOW_CONFIG_WRITE (ha:config).

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesThe entity to remove.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds behavior annotations cannot express: the prerequisite HA_ALLOW_CONFIG_WRITE (ha:config) scope, and the non-obvious side effect that removal is futile for entities the integration still provides because they 'come straight back.' This is exactly the kind of beyond-annotations context that prevents a bad call.

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

Conciseness5/5

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

Three sentences, zero filler, and the core action is front-loaded before the conditional guidance and the permission note. The parenthetical qualifies the orphan condition rather than padding.

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

Completeness5/5

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

For a destructive, two-parameter tool with no output schema, the description covers action, eligibility conditions, the safer alternative, and the required auth scope. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both entity_id and the optional instance_id are already documented in the schema, including the cross-home refusal semantics. The description adds no further parameter detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('Remove an entity's registry entry') and immediately scopes it to orphan cleanup, which separates it from ha_update_entity and the various ha_delete_* siblings. An agent can tell what is removed (the registry entry, not the entity itself) without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (status 'unavailable' with restored: true, or leftovers from a deleted device) and an explicit when-not with the named alternative: if the integration still provides the entity, 'disable it with ha_update_entity instead.' That is the full routing decision an agent needs.

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

ha_remove_user_credentialsRemove a user's login without deleting the userA
Destructive

Remove the local username/password login from a user, without deleting the user record itself. The user still exists (and keeps any other login method) but can no longer sign in with this username. Use ha_delete_user to remove the account entirely. Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesThe username to remove (not the user id).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known; the description adds genuinely useful scope detail beyond that — the user record survives, other login methods survive, and only this username stops working. It also discloses the required permission (ha:config), which annotations cannot express. No statement about reversibility of the removal itself.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and its scope, then the alternative, then the permission requirement. No filler or restatement of the title.

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

Completeness4/5

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

For a two-parameter destructive tool with no output schema and full annotation coverage, the description covers what an agent needs: what is removed, what survives, the sibling to use instead, and the permission gate. Only the effect on the deleted credential (recoverability, error behavior) is left unstated.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are well documented there (including that 'username' is not the user id and what instance_id does). The description adds nothing about parameter format or semantics, so the baseline 3 applies.

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

Purpose5/5

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

States a precise verb and scope: removing the *local username/password login* while explicitly preserving the user record. It draws a clear line against ha_delete_user, so an agent can distinguish this from account deletion without opening either schema.

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

Usage Guidelines4/5

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

Gives an explicit when-not and alternative: 'Use ha_delete_user to remove the account entirely.' That is strong routing. It does not, however, distinguish this from the nearer credential siblings ha_set_user_credentials and ha_change_user_password, which an agent could plausibly confuse with a credential-removal operation.

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

ha_render_templateRender a Jinja templateA
Read-only

Render a Home Assistant Jinja2 template against live state and return the result. Ideal for iterating on template sensors, automation conditions and value_templates until they produce the expected output. Example: "{{ states('sensor.outside_temp') | float < 5 }}".

ParametersJSON Schema
NameRequiredDescriptionDefault
templateYesThe Jinja2 template to render.
variablesNoOptional variables made available to the template.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that evaluation happens against live (not cached) state, which is meaningful context, but says nothing about permissions, latency, or how the instance_id refusal behaves beyond what the schema states.

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

Conciseness4/5

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

Three sentences, purpose front-loaded, with the example placed last. Every sentence contributes; 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.

Completeness4/5

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

Low-complexity read-only tool with fully documented schema and no output schema. 'Return the result' is somewhat vague about the return shape, but for a template renderer that is a minor gap given the annotations and complete parameter docs.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The inline example template '{{ states('sensor.outside_temp') | float < 5 }}' adds real value by demonstrating expected syntax for the required template param. It adds nothing for variables or instance_id, but the example lifts it above baseline.

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

Purpose5/5

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

States a specific verb (render) and resource (Jinja2 template) plus the scope ('against live state') and that it returns the result. No sibling tool performs templating, so the agent can distinguish it immediately.

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

Usage Guidelines4/5

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

Gives concrete usage context: iterating on template sensors, automation conditions and value_templates until output is correct. However, it names no alternatives and gives no when-not guidance or prerequisites, so it stops short of a full routing statement.

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

ha_save_dashboardSave Lovelace dashboard configA
Destructive

Save (create or replace) the Lovelace configuration for a dashboard. 'config' is the dashboard body (title, views, …). Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesLovelace dashboard configuration object (title, views, cards, …).
url_pathYesDashboard url_path to save (must already exist, or create it first with ha_create_dashboard).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and openWorldHint=true, and the description is consistent with that ('create or replace'). It adds value beyond the annotations by disclosing the two environment flags required for the call to succeed, which an agent otherwise could not know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and replace semantics, then the config explanation and hard prerequisites. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with no output schema and a nested object parameter, the description covers action, scope, and auth prerequisites well. It stops short of what happens to an existing dashboard's views on replace, but that is a minor gap given the destructiveHint annotation already signals overwrite risk.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The one gloss it offers ('config' is the dashboard body with title, views) largely restates the schema's own description and adds no new format or constraint detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('save', clarified as create-or-replace) and resource ('the Lovelace configuration for a dashboard'), which cleanly separates it from ha_create_dashboard, ha_get_dashboard, and ha_delete_dashboard in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It supplies a hard precondition (HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true), which is genuinely useful, but gives no guidance on when to choose this over siblings like ha_create_dashboard or ha_set_automation. The 'create it first with ha_create_dashboard' routing lives in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_set_automationCreate or update automationA
Destructive

Create or update an automation by unique id. 'config' is the automation body (alias, trigger, condition, action, mode). Home Assistant reloads automations automatically after saving. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesAutomation config object: { alias, trigger, condition, action, mode, ... }.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
automation_idYesUnique id of the automation (existing id to update, or a new id to create).

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely new context: HA auto-reloads automations after saving and the call requires HA_ALLOW_WRITE and HA_ALLOW_CONFIG_WRITE, which is real prerequisite 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the operation front-loaded, followed by the config shape, the reload side effect, and the required flags. No filler; each sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, nested-object mutation tool with no output schema, the description covers the operation, the config body, the reload behavior and the write-permission prerequisites. Only minor gaps remain, such as whether a partial update overwrites unspecified fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents automation_id, config and instance_id. The description reinforces that 'config' is the automation body (alias, trigger, condition, action, mode) but adds no syntax or format detail beyond what the schema states, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (create or update) and resource (automation) keyed by unique id, which cleanly separates it from read/delete/trigger siblings like ha_get_automation and ha_delete_automation. It does not explicitly name an alternative, but the verb+resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The create-vs-update distinction is implied (whether the id already exists), and the reload-after-save note gives useful context, but there is no explicit when-to-use/when-not guidance or routing to alternatives such as ha_delete_automation or ha_reload_automations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_set_helperCreate or update a helperA
Destructive

Create a Home Assistant helper, or update one that exists. This is how to add a helper without editing configuration.yaml — that file is not reachable from here and would need a restart; a helper created this way is stored by Home Assistant and its entity exists immediately.

Omit 'helper_id' to create; pass the id from ha_list_helpers to update. The new entity is ..

Fields per kind — Home Assistant validates and will name anything wrong: • input_boolean: name; optional icon, initial • input_number: name, min, max; optional step, initial, mode (box|slider), unit_of_measurement, icon • input_text: name; optional min, max, initial, pattern, mode (text|password), icon • input_select: name, options (array of strings); optional initial, icon • input_datetime: name, and at least one of has_date / has_time; optional initial, icon • input_button: name; optional icon • counter: name; optional initial, step, minimum, maximum, restore, icon • timer: name; optional duration (HH:MM:SS), restore, icon • schedule: name; optional monday…sunday (arrays of {from, to}), icon

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesHelper type: input_boolean, input_number, input_text, input_select, input_datetime, input_button, counter, timer, schedule.
configYesThe helper's fields, e.g. { name: 'Holiday mode', icon: 'mdi:palm-tree' }.
helper_idNoExisting helper id to update. Omit to create a new one.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, and the description adds real context beyond them: the entity exists immediately, Home Assistant validates and rejects misnamed fields, and the helper is stored by Home Assistant rather than in YAML. It does not, however, state what happens to config fields omitted on an update (merge vs. replace) or whether kind can change on an existing helper, which matters for a tool flagged destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the create/update switch, then a scannable bulleted per-kind field list. The list is long but every line carries information absent from the schema, so nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still covers creation, update, entity naming, validation behavior, and storage. The remaining gap is update semantics on the existing helper (partial vs. full replacement, kind immutability) plus any permission requirements, which an agent would need before mutating an existing helper.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema description coverage is 100%, the schema leaves config as an untyped object with additionalProperties:{}, so it conveys nothing about valid keys. The description compensates fully with a per-kind field list including which fields are required vs. optional and enum-like values (mode box|slider, HH:MM:SS durations, weekday schedules).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb pair (create/update) and resource (Home Assistant helper), and explicitly differentiates the tool from the config-file route used by ha_read_config_file/ha_edit_config_file: 'This is how to add a helper without editing configuration.yaml'. It also states the naming convention of the resulting entity (<kind>.<slug of name>), which no sibling tool provides.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The create-vs-update rule is spelled out unambiguously ('Omit helper_id to create; pass the id from ha_list_helpers to update'), naming the sibling that supplies ids. It also rules out the alternative mechanism (configuration.yaml) and explains why it is not used (not reachable, requires restart).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_set_log_levelSet log levelA

Raise or lower logging for one integration (or several) at runtime, via logger.set_level. Use this before reproducing a problem — debug on one integration, rather than global debug that drowns the log. Bare names are treated as core integrations ('hue' -> homeassistant.components.hue); anything containing a dot is used as-is ('custom_components.vomesync'). Levels reset on restart. Requires HA_ALLOW_WRITE=true in direct mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoLevel to apply to 'integration'.
levelsNoSeveral at once: { "hue": "debug", "custom_components.vomesync": "info" }.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
integrationNoIntegration or logger path to change, e.g. 'hue' or 'custom_components.vomesync'.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and openWorldHint=true; the description adds substantial context beyond that: levels reset on restart (persistence), the HA_ALLOW_WRITE=true requirement in direct mode (auth prerequisite), and the name-resolution rule that bare names map to core integrations while dotted names are used as-is. These are exactly the behavioral traits an agent cannot infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences, front-loaded with the action and usage trigger, then naming rules, then caveats. Nearly every clause earns its place; slight density comes from chaining several caveats (reset behavior, write flag) into single sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and only four parameters, the definition covers what an agent needs: the operation, the target-resolution rules, the persistence caveat, the write-permission prerequisite, and (via the schema) the instance_id scoping behavior. Nothing material is left unspecified for a mutation tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains how 'integration'/'level' map to a single target versus 'levels' for several, and clarifies bare-name vs dotted-path resolution ('hue' -> homeassistant.components.hue) that the schema only hints at with examples. It does not explain the level enum semantics (e.g., what each verbosity does), so it is not a full 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (raise or lower logging), the resource (one or several integrations), and the underlying mechanism (logger.set_level). It is immediately distinguishable from the many log-reading siblings like ha_get_system_log or ha_get_error_log, which read logs rather than adjust levels.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit when-to-use ('before reproducing a problem') and a contrast case (avoiding global debug that drowns the log), which is strong routing guidance. It stops short of naming an alternative tool for global/catch-all logging, so it is not a full when/when-not/alternatives treatment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_set_scriptCreate or update scriptA
Destructive

Create or update a script by id. 'config' is the script body ({ alias, sequence, fields, mode, ... }); Home Assistant reloads scripts after saving. Use it for a step several automations share, then call it from each with action 'script.'. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesScript config object: { alias, sequence, fields, mode, ... }.
script_idYesScript id: the key in scripts.yaml and the object id of script.<id>, e.g. 'raise_heat'. 'script.raise_heat' also works.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is covered. The description adds real value beyond that: HA reloads scripts after saving, and the call requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true. It does not spell out what an overwrite of an existing script_id destroys, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences with the create/update purpose front-loaded, followed by config semantics, side effect, usage pattern, and prerequisites. Each sentence carries information, with only mild redundancy between the description's config gloss and the schema's own.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-object mutation tool with no output schema, the description covers purpose, the auto-reload side effect, the shared-step use case, and the required write flags. The nested config body is only sketched, but the 100%-covered schema carries that detail, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents script_id (key in scripts.yaml, 'script.<id>' form) and instance_id semantics thoroughly. The description's restatement of config as the '{ alias, sequence, fields, mode, ... }' body mirrors the schema description rather than extending it, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description leads with a specific verb+resource pairing ('Create or update a script by id') that is immediately distinguishable from the sibling getters/deleters (ha_get_script, ha_delete_script). It is clear, though it does not name any sibling explicitly to route the agent, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives genuine when-to-use guidance: 'Use it for a step several automations share, then call it from each with action script.<id>.' That is a concrete scenario an agent can act on. It offers no explicit exclusions or named alternatives (e.g. ha_update_entity), 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.

ha_set_user_credentialsGive a user a username and passwordA
Destructive

Create a local username/password login and attach it to an existing user that has none yet (use ha_create_user first). Fails if that username is already taken, or the user already has a login (use ha_change_user_password instead).

This mints a standing Home Assistant login independent of any VomeHome API key — revoking the key that called this does not revoke the login. Only do this for an account the home's owner actually wants to exist. Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYesUser id from ha_list_users or ha_create_user.
passwordYesLogin password, chosen by the caller.
usernameYesLogin username.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint/openWorldHint annotations: it discloses both failure conditions (username taken, user already has a login) and a non-obvious security trait — that the minted login is a standing credential independent of the calling API key and survives key revocation. It also states the required ha:config permission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its routing alternative in the first sentence, then the security warning that warrants emphasis, then the permission requirement. No filler; every sentence carries decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool, it covers prerequisites, failure modes, alternatives, security lifetime of the created credential, and auth requirements. No output schema exists and none is needed, so nothing an agent requires to call this safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents user_id, username, password, and instance_id. The description adds only the implicit uniqueness constraint on username; otherwise it defers to the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a local username/password login and attach it to an existing user') and immediately distinguishes it from siblings ha_create_user (prerequisite) and ha_change_user_password (for users that already have a login). An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('attach it to an existing user that has none yet'), when-not ('Fails if... the user already has a login (use ha_change_user_password instead)'), and a prerequisite ('use ha_create_user first'). It also adds a scoping constraint ('Only do this for an account the home's owner actually wants to exist').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_supervisor_apiCall Home Assistant Supervisor APIA
Destructive

Call a Supervisor endpoint through Home Assistant's supervisor/api WebSocket command (e.g. /addons, /store/addons, /store/repositories). Requires a Supervised / HAOS install and ha:config for mutating methods. Use this for add-on store operations.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoOptional JSON body for POST/PUT
methodNoHTTP methodget
endpointYesSupervisor API path, e.g. /store/repositories or /addons/core_mosquitto/info
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the raw danger is flagged. The description usefully adds an environment prerequisite and the ha:config auth requirement for mutations, but it does not warn that arbitrary DELETE/PUT endpoints can remove add-ons or repositories, nor describe how errors surface.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences: what it does, then prerequisites, then the use case. No filler, though the parenthetical example list is somewhat redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an open-world passthrough with no output schema and destructive annotations, the definition covers prerequisites but never explains what the call returns (raw API JSON) or how failures behave. It is minimally sufficient rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so endpoint, method, data, and instance_id are all documented in the schema itself. The description's path examples largely duplicate the endpoint parameter's own example, adding little beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Call a Supervisor endpoint through ... supervisor/api WebSocket command') and grounds it with concrete path examples (/addons, /store/addons, /store/repositories). It is clearly an escape hatch to the raw Supervisor API, which distinguishes it from structured siblings like ha_hacs_list_repositories, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives real context: prerequisites ('Requires a Supervised / HAOS install and ha:config for mutating methods') and a stated use case ('Use this for add-on store operations'). It does not name exclusions or point to the more specific HACS/add-on siblings, 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.

ha_trigger_automationTrigger automationA

Manually run an automation's actions now (automation.trigger). Accepts entity_id or unique id. Set skip_condition=false to also evaluate conditions. Requires writes to be enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
automationYesentity_id (automation.xxx) or unique id.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
skip_conditionNoSkip the automation's conditions (default true).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag readOnlyHint=false and openWorldHint=true; the description adds genuinely useful context beyond that — that writes must be enabled and that conditions are skipped by default unless skip_condition=false. It still doesn't say what the invocation returns, whether it blocks until actions finish, or what happens on a currently-running automation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then identifier options, then the flag, then the prerequisite. Nothing is padded and no sentence is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter mutation with no output schema, the description covers the action, the naming options, the condition flag, and the writes prerequisite — enough to invoke correctly. Missing only peripheral detail such as whether the call is synchronous or what a failure looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented, including the entity_id/unique-id duality and the default-true skip_condition. The description restates the skip_condition behavior in practical terms but adds no new syntax, format, or constraint detail; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Manually run an automation's actions now') and anchors it to the underlying HA service call (automation.trigger), so the agent knows exactly what happens. It does not explicitly contrast itself with nearby siblings like ha_reload_automations or ha_set_automation, which a 5 would require.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete guidance: how to identify the automation (entity_id or unique id), how to change the condition behavior (skip_condition=false), and a hard prerequisite (writes enabled). No 'when not to use' or explicit pointer to an alternative tool, 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.

ha_update_entityRename, move, disable or hide an entityA
Destructive

Change an entity's registry entry: its display name, its entity_id, its area, its icon, or whether it is disabled or hidden. Omit a field to leave it alone; pass null for name, area_id or icon to clear it back to the default. Renaming the entity_id does not update automations, scripts or dashboards that use the old one, so check those first (ha_list_automations). Disabling stops the entity being created at all; hiding only keeps it off auto-generated dashboards. Requires HA_ALLOW_CONFIG_WRITE (ha:config).

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoe.g. 'mdi:radiator'; null resets it.
nameNoDisplay name; null resets it to the integration's.
hiddenNotrue hides it (by the user); false shows it again.
area_idNoArea id from ha_list_areas; null removes it.
disabledNotrue disables it (by the user); false enables it again.
entity_idYesThe entity to change, e.g. 'sensor.kitchen_temp'.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
new_entity_idNoA new entity_id in the same domain.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and openWorldHint=true, but the description adds substantive context: the null-clears-to-default semantics, the side effect that renaming does not propagate to automations/scripts/dashboards, the functional difference between disabling (entity is not created) and hiding (merely off auto dashboards), and the required HA_ALLOW_CONFIG_WRITE (ha:config) authorization. No contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool changes, then the omit/null conventions, then the rename caveat, then the permission requirement. Three dense sentences, no filler, every clause carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutating tool with no output schema, the description covers the essentials an agent needs: mutable fields, null/omit semantics, destructive side effects of renaming, disable-vs-hide behavior, and the required auth scope. Nothing critical is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so per-parameter meaning is already documented, establishing a baseline of 3. The description adds the general omission rule (omit = unchanged) and the null = reset convention at the tool level, plus the rename side-effect, which goes slightly beyond the per-field schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (change) and resource (an entity's registry entry) and enumerates exactly which fields are mutable: display name, entity_id, area, icon, disabled/hidden. This distinguishes it cleanly from neighbors like ha_remove_entity and ha_get_entity_registry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit operating rules ('omit a field to leave it alone', 'pass null ... to clear it back to the default'), warns that renaming entity_id breaks automations/scripts/dashboards and points to ha_list_automations to check first, and explains the disable-vs-hide distinction. When-to-use and a concrete alternative are both present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_update_userUpdate a Home Assistant userA
Destructive

Change a user's name, role, active state, or local-only restriction. Omit a field to leave it unchanged. Setting is_active=false disables sign-in without deleting the account. Cannot modify the owner's active state, or any system-generated (Supervisor) user. Requires ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
roleNo'admin' (system-admin, full access), 'user' (system-users, normal dashboard access, no settings), or 'read_only' (system-read-only, cannot change anything).
user_idYesUser id from ha_list_users.
is_activeNofalse disables sign-in without deleting the account.
local_onlyNo
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so safety is partly covered; the description adds genuinely new behavior: partial-update semantics, that is_active=false disables sign-in without deleting the account, and permission/ownership restrictions. It does not state reversibility or failure behavior, but adds solid context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the field scope, then partial-update semantics, the destructive effect, and the restrictions. 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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the mutation scope, partial-update behavior, disabling effect, and restrictions, which is close to complete. Minor gaps remain (no statement about reversibility or error/refusal behavior beyond the ownership rule) but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 67% schema coverage, the description enumerates the modifiable fields (name, role, active state, local-only) and explains the omit-to-keep behavior, which meaningfully supplements the schema. user_id and instance_id are only covered by their schema descriptions, so it doesn't fully compensate, but it adds value rather than repeating.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Change/Update) plus the resource (user) and the exact field scope (name, role, active state, local-only). This scope cleanly separates it from credential/password siblings (ha_set_user_credentials, ha_change_user_password) and from ha_create_user/ha_delete_user without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real usage semantics ('Omit a field to leave it unchanged') and explicit exclusion conditions (cannot modify the owner's active state or a system-generated Supervisor user) plus the ha:config prerequisite. It stops short of routing the agent to a named alternative tool, so it is clear context rather than full when/when-not/alternative coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_view_snapshotSnapshot of a dashboard viewA
Read-only

In one call, everything a dashboard view shows: the state and attributes of each entity, each Markdown template rendered, history as a few points per series, and camera stills as small RGB grids. For a client drawing a dashboard (such as a pane in Claude Code); to read a few entities yourself, ha_get_state is simpler. Parts that fail carry an error; the rest still answers. Camera stills need the key's Cameras tick through VomeHome.

ParametersJSON Schema
NameRequiredDescriptionDefault
framesNoCamera stills: per key, the camera and the most pixels across and down.
historyNoHistory graphs: per key, the entities, how many hours back, and points per series.
templatesNoTemplates to render, by a key of the caller's choosing (at most 10).
entity_idsNoEntities whose state to return.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint; the description adds genuinely useful behavior: partial-failure tolerance ('Parts that fail carry an error; the rest still answers') and a prerequisite for camera stills (the key's Cameras tick through VomeHome). The prerequisite wording is somewhat obscure, and nothing is said about output size limits or ordering.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the aggregate contents, then the intended caller and alternative, then failure semantics. Nearly every clause earns its place, though the trailing camera prerequisite sentence is awkwardly phrased and slightly cryptic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With five optional, deeply nested parameters and no output schema, the description does the important work of outlining what each returned section contains. It omits any note on result size, ordering, or how the caller-supplied template keys map back in the response, but the core is covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters including nested frames/history structures. The description restates those areas at a high level (frames, templates, history, entity_ids) without adding syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('snapshot of a dashboard view') and enumerates exactly what the single call aggregates: entity state/attributes, rendered Markdown templates, history points, and camera stills. It also distinguishes itself from ha_get_state, which it names as the simpler alternative for reading a few entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the intended caller ('a client drawing a dashboard, such as a pane in Claude Code') and the alternative condition (reading a few entities yourself -> use ha_get_state). This is a clear when-to-use and when-to-use-something-else statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_watch_statesWait for state changesA
Read-only

Wait up to wait_seconds for any of these entities to change, and return what changed: for a client showing live states (a dashboard pane) instead of polling. The first call returns every entity's current state; pass back the returned cursor to get only changes after it. Through VomeHome only (the home's Vome component sends the changes); the key needs ha:read on the home.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoThe cursor from the last call: only changes after it.
entity_idsYesThe entities to watch.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
wait_secondsNoHow long to wait for a change (default 20).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial behavior: it is a bounded long-poll ('Wait up to wait_seconds'), the first call returns all current states while later calls return only changes, it only works through VomeHome, and the key needs ha:read on the home. That is exactly the kind of auth/mechanism context annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with purpose before mechanism and constraints, with no filler. It is slightly compressed in the final sentence (VomeHome + ha:read), but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a stateful long-poll tool with no output schema, the description covers the mechanism, continuation, auth, and transport constraint. Minor gaps remain around timeout return behavior (e.g., empty vs partial on expiry), but the safety profile is fully covered by annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds the round-trip workflow for cursor ('The first call returns every entity's current state; pass back the returned cursor') that goes beyond the schema's one-line note. It also frames wait_seconds as an upper bound.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Wait ... for any of these entities to change, and return what changed') and clearly differentiates itself from polling siblings like ha_get_state/ha_get_history by emphasizing the wait semantics. An agent can tell what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names the use case ('for a client showing live states (a dashboard pane)') and the alternative it replaces ('instead of polling'), plus the continuation rule for the cursor. The condition that selects this tool versus polling is explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ha_write_config_fileWrite a config fileA
Destructive

Write a file under Home Assistant's config directory. Defaults to UTF-8 text; pass encoding='base64' to write a binary file (an icon, a data file a custom integration ships) — content is then the base64 of the bytes, not the bytes themselves.

This edit is checked and reversible. After the write, Home Assistant's own configuration check runs, and if it fails the previous contents are put straight back — a bad edit cannot leave Home Assistant unable to start. The result says whether it was verified and whether it was rolled back. Editing configuration.yaml this way is the normal, supported route for a home the user has authorised; it is how a hosted install is configured at all, since there is no SSH into one. (check_config only ever validates YAML, so it says nothing about a binary write; verify defaults to off for encoding='base64' for that reason.)

It replaces the entire file — read it first with ha_read_config_file and send back the full content with your change applied, or you will delete everything else in it.

Pass verify=false when writing several files that are only valid together, then call ha_check_config yourself at the end.

A successful write does not apply the change: restart Home Assistant, or reload the relevant domain, for it to take effect.

Requires the ha:files scope. Prefer a purpose-built tool where one exists: helpers via ha_set_helper and automations via ha_set_automation both apply immediately and cannot break startup.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile relative to the config root, e.g. 'configuration.yaml'.
verifyNoCheck the configuration afterwards and restore the file if it fails. Default true for utf8, false for base64 (check_config can't validate binary content).
contentYesThe complete new contents of the file (base64 if encoding='base64').
encodingNo'utf8' (default) for text; 'base64' for binary content.
instance_idYesThe instance this write is meant for (as listed by vomehome_list_instances). Required, and checked against the one this session is actually targeting: if they differ the write is refused rather than applied to the wrong home.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive/openWorld, but the description adds the crucial behaviors: HA's config check runs after the write and restores prior contents on failure, the result reports verified/rolled-back status, the write replaces the entire file, changes require a restart or reload, and the ha:files scope is required. These are exactly the operational traits an agent needs for a destructive write and are not derivable from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Multi-paragraph but front-loaded, with the highest-risk facts (checked-and-reversible, whole-file replacement) emphasized and bolded. Slightly redundant with the schema on the verify default, but that repetition is defensible for a destructive tool where a mistake is costly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by stating what the result reports (verified vs rolled back). It also covers scope requirements, restart semantics, binary vs text handling, and preferred alternatives, so nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description meaningfully augments it: it clarifies that with encoding='base64' the content is the base64 of the bytes rather than the bytes, and explains why verify defaults off for base64 (check_config only validates YAML). The instance_id cross-check against the session's target is also described in more operational terms than the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (write a file under Home Assistant's config directory) and immediately distinguishes itself from siblings by naming ha_read_config_file, ha_check_config, ha_set_helper, and ha_set_automation. An agent can tell it apart from ha_edit_config_file and ha_delete_config_file without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-use guidance: prefer purpose-built tools (ha_set_helper, ha_set_automation) where one exists, read first with ha_read_config_file before replacing the whole file, pass verify=false only when writing interdependent files and then call ha_check_config yourself. Alternatives and their reasons are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nodered_create_flowCreate a Node-RED flow (tab)A

Add a new Node-RED flow (a new tab) with its nodes, leaving existing flows untouched. The 'flow' object should have a 'label' and a 'nodes' array (Node-RED node objects). Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true. Safer than nodered_set_flows because it cannot disturb other tabs.

ParametersJSON Schema
NameRequiredDescriptionDefault
flowYesFlow object: { label, nodes: [...], configs?: [...] }. The new tab id is returned.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true, so mutation is already known. The description adds real value beyond them: the non-destructive scope ('leaving existing flows untouched'), the required env-flag prerequisites, and a safety comparison against the flow-replacing sibling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each carrying distinct information: action, scope guarantee, object shape, and prerequisites/safety. The key differentiator against nodered_set_flows is front-loaded at the end of the first sentence and reinforced, with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating create with no output schema, it covers scope, prerequisites, and the alternative. The return value ('new tab id is returned') is only in the schema description and error behavior is unspecified, but annotations already carry the safety profile, so the gap is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents 'flow' and 'instance_id'. The description restates the 'label' and 'nodes' shape (the schema also mentions an optional 'configs'), adding no syntax detail beyond what structured data provides. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Add a new Node-RED flow (a new tab) with its nodes.' It also distinctly separates itself from the sibling nodered_set_flows by naming it directly, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the alternative ('Safer than nodered_set_flows because it cannot disturb other tabs') and the prerequisite conditions (HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true). The when-to-use and the safer-vs-broader choice 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.

nodered_delete_flowDelete a Node-RED flow (tab)A
Destructive

Delete an entire Node-RED flow (one tab) and all of its nodes by id. This cannot be undone from here. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFlow (tab) id to delete.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the bar is lower, yet the description still adds significant value: the operation is irreversible ('cannot be undone from here'), it cascades to all nodes, and it requires HA_ALLOW_WRITE and HA_ALLOW_CONFIG_WRITE to be enabled. This prerequisite detail is not available anywhere in the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and scope, followed by the irreversibility warning and prerequisites. No filler, every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no output schema, the description covers the critical unknowns an agent needs: scope of deletion, irreversibility, and the required environment flags. Combined with annotations and full schema coverage, nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces that the id targets a whole flow (tab) rather than a node, but adds no format or constraint detail beyond the schema, and says nothing about the optional instance_id parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Delete an entire Node-RED flow (one tab)') and clarifies scope: everything including all contained nodes, keyed by id. This clearly separates it from siblings like nodered_update_flow or nodered_set_flows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (deleting a whole flow, not editing one) but never explicitly says when to prefer it over nodered_update_flow or nodered_set_flows, nor does it state that partial edits should use a different tool. Context is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nodered_get_flowGet one Node-RED flow (tab)A
Read-only

Get a single Node-RED flow (one editor tab) and its nodes by flow id. Use nodered_get_flows first to discover tab ids and labels.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFlow (tab) id, e.g. the 'id' of a tab node from nodered_get_flows.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully discloses that the response includes the flow plus its nodes (helpful with no output schema), but says nothing about not-found behavior, auth, or the instance-mismatch refusal that only the schema mentions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action and followed by the discovery prerequisite. No redundant restatement of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with annotations covering safety and a fully described schema, the description supplies what is missing: what the return contains and how to source the id. Only error/edge behavior is left unstated, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both id and instance_id are already documented with examples and refusal semantics. The description's 'by flow id' adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get), resource (a single Node-RED flow / one editor tab), and explicitly notes it includes the flow's nodes, which distinguishes it from the plural sibling nodered_get_flows and from nodered_list_nodes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear prerequisite ('Use nodered_get_flows first to discover tab ids and labels'), which tells the agent how to obtain the required id. It stops short of stating when-not to use it or naming alternatives for other retrieval needs, so it is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nodered_get_flowsGet Node-RED flowsA
Read-only

Get the full Node-RED flow configuration (the JSON array of all nodes across every tab) plus the current revision string. Pass that 'rev' back to nodered_set_flows to avoid clobbering a concurrent change. Prefer nodered_get_flow / nodered_update_flow for single-tab edits.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: it returns a 'rev' string and explains the concurrency hazard (clobbering a concurrent change) that the rev guards against. It stops short of describing size/pagination behavior for large flow sets.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the return payload and revision are front-loaded, the concurrency purpose follows, and the sibling routing hint closes. No redundant restatement of the tool name or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the burden of describing returns — and it does, naming the JSON node array and the revision string. Combined with the routing guidance and the annotation-covered safety profile, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is a single optional instance_id parameter, which the description does not mention at all. With the schema fully documenting the parameter, the baseline of 3 applies; the description neither adds nor detracts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the full Node-RED flow configuration') and defines the scope precisely as 'the JSON array of all nodes across every tab' plus the revision string. It also explicitly distinguishes itself from the sibling single-tab tools, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('pass that rev back to nodered_set_flows to avoid clobbering a concurrent change') and when-not-to-use ('prefer nodered_get_flow / nodered_update_flow for single-tab edits'). Both the alternative and the condition selecting it 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.

nodered_list_nodesList installed Node-RED nodesA
Read-only

List the installed Node-RED node modules and the node types they provide (the palette). Use this to check which node types are available before writing a flow that references them.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows this is a safe read operation. The description adds that the result is the installed palette, but does not disclose auth requirements, pagination, or other behavioral traits beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is two front-loaded sentences with no filler. Both sentences earn their place by stating what is listed and the intended use case.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with detailed annotations and full schema coverage, the description is complete: it names the returned content and the motivating workflow. It does not need to explain return structure because no output schema exists and it already describes the returned data at an appropriate level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single optional instance_id parameter is fully documented in the schema. The description itself adds no parameter-level meaning, which is acceptable given the high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('installed Node-RED node modules and the node types they provide'), and adds a clarifying synonym ('the palette'). This clearly distinguishes it from sibling tools that retrieve, create, update, or delete flows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Use this to check which node types are available before writing a flow that references them.' However, it does not name alternatives or describe when another Node-RED tool would be more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nodered_set_flowsReplace ALL Node-RED flowsA
Destructive

Replace the ENTIRE Node-RED flow configuration and deploy. This overwrites every tab — prefer nodered_create_flow / nodered_update_flow unless you really mean to rewrite everything. Pass the 'rev' from nodered_get_flows to avoid clobbering a concurrent change. deployment_type controls how Node-RED applies it ('full' restarts all flows; 'flows'/'nodes' restart only what changed; 'reload' re-reads from storage). Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
revNoRevision from nodered_get_flows, for optimistic concurrency.
flowsYesThe complete flow config: an array of Node-RED node objects (tabs, nodes and config nodes).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.
deployment_typeNoHow Node-RED applies the deploy. Defaults to 'full'.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, and the description compounds that with concrete detail: the whole config is overwritten, existing tabs are destroyed, optimistic concurrency via rev, and the two environment flags (HA_ALLOW_WRITE, HA_ALLOW_CONFIG_WRITE) required for the call to succeed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the destructive scope in the first sentence, then routes to alternatives, then adds the concurrency and deployment semantics. Every clause carries operational information; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with no output schema, the description covers scope, alternatives, concurrency, deploy modes, and required auth flags. Nothing an agent needs in order to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the schema documents all four parameters. The description still adds genuine meaning beyond it by explaining what each deployment_type value does to running flows (full restarts all; flows/nodes restart only what changed; reload re-reads from storage), which the enum alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Replace the ENTIRE Node-RED flow configuration and deploy') and explicitly scopes it as whole-config replacement. It names the sibling tools it should not be confused with (nodered_create_flow / nodered_update_flow), so an agent can distinguish it without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-not-to-use rule ('prefer nodered_create_flow / nodered_update_flow unless you really mean to rewrite everything') and a concrete precondition for safe use ('Pass the rev from nodered_get_flows to avoid clobbering a concurrent change'). Alternatives and conditions are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nodered_update_flowUpdate a Node-RED flow (tab)A

Replace a single Node-RED flow (one tab) and its nodes by id, leaving other tabs untouched. Read it first with nodered_get_flow, edit, then send the whole flow object back. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFlow (tab) id to update.
flowYesFull flow object for this tab: { id, label, nodes: [...], configs?: [...] }.
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give readOnlyHint=false and openWorldHint=true; the description adds substantial context beyond that: this is a full-object replacement (not a merge), it scopes destruction to one tab and leaves others intact, and it requires two specific write flags. That 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: scope/replacement first, then the recommended workflow, then prerequisites. Every sentence earns its place with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with a nested object parameter and no output schema, the description covers scope, replacement semantics, the read-before-write workflow, and auth prerequisites. It is close to complete; the only gap is any note on the response/confirmation, which is minor given no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented in the schema. The description reinforces that 'flow' is the whole object to be sent back and that the operation is keyed 'by id', but adds no new syntax or format detail. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (replace) plus resource and scope ('a single Node-RED flow (one tab) and its nodes by id, leaving other tabs untouched'). It clearly separates the single-tab scope from the broader nodered_set_flows / nodered_get_flows siblings. It does not explicitly distinguish itself from nodered_create_flow, so a 4 rather than a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit workflow ('Read it first with nodered_get_flow, edit, then send the whole flow object back') that names the correct read alternative and tells the agent the order of operations. It also lists prerequisites (HA_ALLOW_WRITE, HA_ALLOW_CONFIG_WRITE). No explicit exclusions for when not to use it, keeping it at 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vome_health_checkRun a fresh health checkA

Start a fresh Vome health check on this Home Assistant: after fixing findings, this is how the score catches up. It runs at Vome and takes a couple of minutes; the new report replaces the old one, so read it with vome_health_report (its generated_at changes when it lands). On a home not linked to Vome yet, the integration opens a temporary link first (deleted after a day unless someone signs in). Requires write access. It needs the Vome integration (the Vome app in Home Assistant, or Vome from HACS); vome_health_check runs a first check.

ParametersJSON Schema
NameRequiredDescriptionDefault
use_aiNoInclude Vome's written summary of the findings (default true).
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint=false / openWorldHint=true annotations: it discloses the couple-of-minute latency, that the new report replaces the old one, that write access is required, and that an unlinked home gets a temporary link deleted after a day unless someone signs in. These are exactly the operational traits an agent needs before invoking a mutating, slow, open-world call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and the key scoping fact (report replacement), but the trailing clause 'vome_health_check runs a first check' restates the name and adds little. Mostly dense, with one mildly redundant sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, it covers latency, side effects on the existing report, permissions, and how to retrieve results. It could be slightly clearer about what the call itself returns immediately, but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (use_ai, instance_id) are already fully documented in the schema; the description adds no meaning about either. Baseline 3 applies when the schema carries the parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a fresh Vome health check on this Home Assistant') and clearly separates itself from the read-side sibling by directing report reading to vome_health_report. An agent can distinguish it from vome_health_report and ha_check_config without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear triggering context ('after fixing findings, this is how the score catches up') and names the follow-up tool (vome_health_report). It also states the integration prerequisite and the not-yet-linked case, though it offers no explicit 'do not use when...' exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vome_health_reportRead the home's health scoreA
Read-only

Vome's health score for this Home Assistant, out of 100, with everything its check found: each finding has a severity (warn, advice, info), a title, the evidence, a recommendation and often the exact entities involved — devices flooding the recorder, entities left behind by removed integrations, automations that are off or never run, batteries not reporting, error noise. Use it to see what is wrong with a home and fix it, finding by finding; then vome_health_check re-scores it. It needs the Vome integration (the Vome app in Home Assistant, or Vome from HACS); vome_health_check runs a first check.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idNoOptional: the instance you mean (as listed by vomehome_list_instances). When given, the call is refused if this session is targeting a different home, instead of answering from it.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only readOnlyHint and openWorldHint; the description goes well beyond by enumerating the concrete shape of each finding (severity levels, evidence, recommendation, entities) and giving example categories of problems detected. With no output schema, the description carries the return-value burden and does so adequately, plus it discloses the integration prerequisite.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the score and its scale, then the finding structure, then usage, then prerequisites. The example list ('devices flooding the recorder... error noise') is longer than strictly needed, but each clause adds concrete flavor for an agent judging relevance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by describing exactly what a report contains. Combined with the setup prerequisite and the sibling routing to vome_health_check, an agent has everything needed to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single optional instance_id, and the schema description already explains the refusal-on-mismatch behavior. The description adds nothing about the parameter, so the baseline 3 for fully-documented schemas applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific verb and resource: returns Vome's health score out of 100 with all findings, each carrying severity, title, evidence, recommendation and involved entities. It clearly distinguishes itself from the sibling vome_health_check, which 're-scores' the home, so an agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('use it to see what is wrong with a home and fix it, finding by finding'), what to do next ('then vome_health_check re-scores it'), and the prerequisite ('it needs the Vome integration... vome_health_check runs a first check'). Alternative and sequencing are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_chap_enrolCHAP: turn on monitoringA
Destructive

Turn on CHAP for an instance: heartbeats and outage alerts. Needed before a standby can be linked.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id of the home's main install (from vomehome_list_instances).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context (what is turned on, prerequisite ordering) but never explains why an 'enable' operation is flagged destructive, whether it overwrites existing state, or whether it can be undone — a notable gap given there is no un-enrol sibling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, and the core action is front-loaded ahead of the prerequisite. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation tool with annotations and no output schema, the description covers what it does and the ordering prerequisite. It leaves the destructive/reversibility semantics unexplained, which matters because annotations flag destructiveHint=true with no visible way to reverse it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage for the single instance_id parameter, including its source tool (vomehome_list_instances). The description adds no parameter-level 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Turn on') plus resource (CHAP for an instance) and clarifies what enabling it produces: heartbeats and outage alerts. It implicitly differentiates from siblings by naming the follow-on operation (linking a standby), though it does not explicitly contrast with vomehome_chap_status or the other chap_* tools by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Needed before a standby can be linked' gives a clear precondition that tells the agent when this tool is the right one, and it implicitly routes the agent to vomehome_chap_link_standby afterward. It stops short of naming alternatives or stating when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_chap_pairCHAP: pair both installsA
Destructive

Pair both installs with Vome and fill the standby from a one-off backup of the main install, then keep it in step. Takes a few minutes; follow it with vomehome_chap_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id of the home's main install (from vomehome_list_instances).

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare mutation (readOnlyHint=false) and destructiveHint=true, so the bar is lower. The description still adds real behavioral context beyond them: the operation is a multi-step pairing-plus-backup-seed, it runs for several minutes, and it establishes an ongoing synchronization relationship rather than a one-shot action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the core action front-loaded and the operational notes (duration, follow-up) trailing. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description is the only guide to behavior, yet it omits failure behavior, reversibility, and prerequisites (e.g., whether both installs must already be enrolled, or whether the standby's existing data is lost). The duration and follow-up hints help, but for a destructive pair-and-sync operation the definition is only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 100% schema description coverage, and the schema already explains that instance_id is the main install's id sourced from vomehome_list_instances. The description adds nothing about the parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('pair both installs with Vome') and expands on what that entails: seeding the standby from a one-off backup of the main install and then keeping it in step. This composite scope hints at how it differs from the narrower chap_enrol/chap_link_standby siblings, but it never names or contrasts those alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful workflow positioning ('follow it with vomehome_chap_status') and an effort estimate ('takes a few minutes'), but offers no when-to-use or when-not versus the other CHAP tools; an agent must infer the ordering from the surrounding family.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_chap_set_home_addressCHAP: the home's address at homeB
Destructive

Set the house-network address (e.g. 192.168.1.15/24) that follows whichever install runs the home, so phones and dashboards need no change after a switch. address=null stops moving it.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesAn address on the house network, or null.
instance_idYesVomeHome instance id of the home's main install (from vomehome_list_instances).

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, so the safety profile is covered externally. The description adds genuine context beyond them: what the address is for (phones/dashboards unchanged after a switch) and that address=null stops the moving behavior. It does not state reversibility of a previously set address or any auth prerequisites, leaving that to the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with the core action front-loaded and no filler. The second sentence on the null case earns its place, but the phrasing 'follows whichever install runs the home' is slightly indirect jargon that costs a little clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with annotations but no output schema, the definition covers purpose, effect, and null semantics adequately. It stops short of explaining prerequisites (e.g. needing instance_id from vomehome_list_instances) or what a caller observes after the change, which a destructive configuration call could usefully include.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes beyond the schema's terse 'An address on the house network, or null.' by supplying a concrete CIDR example (192.168.1.15/24) and clarifying the functional meaning of null ('stops moving it'), which the schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Set) and resource (the house-network address / home address), and the follow-up clause explains the intent ('follows whichever install runs the home'). It distinguishes itself conceptually from the other vomehome_chap_* siblings, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what happens after the call but gives no when-to-use guidance relative to alternatives such as vomehome_chap_switch, vomehome_chap_link_standby, or vomehome_use_instance. The agent must infer that this is the configuration step for a stable home address.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_chap_standby_candidatesCHAP standby candidatesA
Read-only

The user's other house installs, connected to Vome and not in a pair, that could be this home's standby. Use an id from here with vomehome_chap_link_standby.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id of the home's main install (from vomehome_list_instances).

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully defines the inclusion filter for results (connected to Vome, not in a pair), but says nothing about preconditions such as CHAP enrolment, result ordering, count, or emptiness behavior. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what the list contains and followed immediately by the action to take with the result. Every clause earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description reasonably compensates by describing what the returned entries are and implying an id field is present for reuse. It does not describe other fields an entry may carry or ordering, which is a minor gap for a simple read-only lookup.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter and 100% schema description coverage, the schema already explains instance_id and even points at vomehome_list_instances as its source. The description adds no format or sourcing 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states precisely what the tool returns: the user's other house installs that are connected to Vome and not already paired, i.e. candidates for standby. It distinguishes itself from siblings by naming the consumer tool vomehome_chap_link_standby. It is phrased as a noun phrase rather than an explicit verb+resource, but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent: take an id from this list and pass it to vomehome_chap_link_standby, which is exactly the workflow-level guidance an agent needs. It does not state when this call is unnecessary (e.g. if the home is not CHAP-enrolled) or what to do if the list is empty.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_chap_statusCHAP statusA
Read-only

How CHAP stands for an instance: whether it is enrolled, its pair (main install, standby, which one runs the home, the kind of pair), whether the two are paired and in step, each part's state as the CHAP page's picture shows it, and actions — what can be done now. Asked of a standby, it says which main install it belongs to.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id of the home's main install (from vomehome_list_instances).

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real value by enumerating the returned content (enrollment state, pair info, sync status, per-part state, and an `actions` field describing what can be done now) — important since no output schema exists. It omits permissions/auth requirements and error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single dense sentence loaded with nested parentheticals, which makes it harder to parse than necessary, though there is little outright filler. Front-loading the subject ('How CHAP stands for an instance') is fine but the comma-spliced enumeration of return fields hurts readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only tool with no output schema, the description compensates by describing the returned structure in detail, which is exactly what an agent needs. Missing only guidance on error cases or preconditions, which are minor here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single instance_id parameter is fully documented in the schema. The description adds no format or sourcing detail beyond what the schema already states, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description conveys a specific resource — the CHAP status of an instance — and enumerates what it reports (enrollment, pair composition, sync state, per-part state, available actions). It is distinguishable from the vomehome_chap_* action siblings (enrol, pair, switch, link_standby) which mutate state, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the mention that 'Asked of a standby, it says which main install it belongs to' gives a contextual nuance but no explicit when-to-use or when-not-to-use versus siblings like vomehome_chap_pair or vomehome_chap_switch. An agent can infer it is the read/inspection tool but gets no routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_chap_switchCHAP: switch to the standbyA
Destructive

Move the home to the standby on purpose (for maintenance): the main install's latest changes go across first, then the standby starts and the main install stops. Pass cancel=true to call off a switch still waiting for the changes. Ask the user before switching a real home.

ParametersJSON Schema
NameRequiredDescriptionDefault
cancelNoCall off a switch in progress instead.
instance_idYesVomeHome instance id of the home's main install (from vomehome_list_instances).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description reinforces this by describing what actually happens (the main install stops, the standby starts). It adds useful process and cancel semantics beyond the annotation flags, though it omits failure/rollback behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences that front-load the action and its maintenance purpose, with cancel and the safety warning following. Slightly run-on, but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive switch operation with no output schema, the description covers purpose, process order, the cancel escape hatch, and a user-consent warning. Missing details on duration, failure handling, or post-switch state keep it short of a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the parameters are already documented, but the description adds real nuance: cancel only applies to a switch 'still waiting for the changes', which the schema description doesn't convey. instance_id is left to the schema, hence not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (switch/move) and resource (the home to the standby) and details the exact sequence (changes flow first, standby starts, main stops). The direction ('to the standby') clearly separates it from the reverse sibling vomehome_chap_switch_back even though that sibling isn't named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use context ('on purpose (for maintenance)') and an explicit precondition ('Ask the user before switching a real home'). It does not name switch_back as the alternative operation, so the when-not side is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_chap_switch_backCHAP: switch backA
Destructive

Move the home back to its main install. By default the standby's changes go back first; now=true switches back at once and leaves anything changed on the standby since its last sync behind — for emergencies only. Ask the user first.

ParametersJSON Schema
NameRequiredDescriptionDefault
nowNoSwitch back without syncing first (emergency).
instance_idYesVomeHome instance id of the home's main install (from vomehome_list_instances).

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and openWorldHint=true. The description goes beyond that by explaining WHAT is destroyed (changes on the standby since its last sync are left behind when now=true) and the default sync-back behavior first – exactly the added value the annotation bar asks for.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, semantically front-loaded with the default behavior before the emergency variant. Slightly dense punctuation but no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, so the description needn't cover return values, and it covers the mutation semantics, the default, the emergency override, and the user-consent requirement. A note about prerequisites (e.g., that a standby must be linked) would complete it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, including a description for now that matches the prose. The description reinforces the tradeoff of now=true rather than introducing new syntax or defaults, so the schema is doing the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (switch back) and object (the home / its main install), and names the sibling counterpart by implication (vomehome_chap_switch is the forward direction). An agent can distinguish this from vomehome_chap_switch and vomehome_chap_link_standby.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly signals the emergency-only case for now=true and instructs 'Ask the user first', which is explicit when-to-use guidance. It doesn't enumerate the alternative (vomehome_chap_switch) but the direction is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_complete_onboardingFinish the Home Assistant setup wizardA

Finish the outstanding setup-wizard steps on a VomeHome instance, so it opens on a dashboard rather than the wizard. Intended for a home being set up for other people to look at — a demo should not greet a stranger with a setup form. Provisioning deliberately never does this: location and analytics are the owner's choice, so only run it for a home whose setup you are responsible for. Pass core_config to set the location and units first; omit it and Home Assistant keeps what it detected, which is a safer default than a confidently wrong location. Needs ha:config.

ParametersJSON Schema
NameRequiredDescriptionDefault
core_configNoOptional location/unit settings applied before the step is marked done.
instance_idYesVomeHome instance id (UUID).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorld=true), so the description only needs to add context — and it does: it states the required 'ha:config' scope, explains the default behavior when core_config is omitted, and justifies why provisioning skips this step. It stops short of describing whether the wizard step is reversible or what happens on partial failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and outcome, then restrictions, then the parameter decision — a logical order. It is four sentences for a two-parameter tool, slightly more talkative than strictly necessary, but every sentence carries a distinct decision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists and the description does not describe the return, but for a simple completion action the agent mostly needs when-to-run, auth scope, and the core_config default — all present. Minor gap: no statement of what a failure or already-completed onboarding returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and core_config already carries a description, so the baseline is 3. The description earns above baseline by explaining the semantic consequence of omitting core_config ('Home Assistant keeps what it detected, which is a safer default than a confidently wrong location') and by sequencing it before the step is completed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Finish the outstanding setup-wizard steps on a VomeHome instance') plus the concrete outcome ('opens on a dashboard rather than the wizard'). It also implicitly separates itself from the read-side sibling vomehome_get_onboarding and from provisioning, which 'deliberately never does this'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit target audience ('a home being set up for other people to look at — a demo should not greet a stranger with a setup form') and an explicit precondition ('only run it for a home whose setup you are responsible for'). It also routes the agent on a secondary choice: pass core_config to set location/units first, or omit it to preserve detected values.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_create_instanceCreate VomeHome instanceA

Create a new Home Assistant instance on VomeHome — useful for spinning up a throwaway test/sandbox install. In brokered mode the API key's create scope is authoritative (no local env flags required). Optionally set VOMEHOME_ALLOW_CREATE=false to block creation locally. The creating API key is granted full Home Assistant access on the new instance (ha:read, ha:write, ha:config, ha:files) and it becomes the active target.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-friendly name for the new instance.
timezoneNoOptional IANA time zone, e.g. 'Europe/London'.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it is not read-only and is open-world; the description goes well beyond by disclosing that the creating API key receives full HA access (ha:read/write/config/files) and that the new instance silently becomes the active target — a consequential side effect. It also explains the authorization model in brokered mode and the local opt-out flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose in the first clause, then layers scope/authorization/side-effect notes. Four dense sentences with no filler, though the env-flag detail is somewhat operational for a tool description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers auth requirements, the opt-out switch, and the active-target side effect, which is what an agent most needs before a mutating call. With no output schema, the return value (e.g. new instance id) and post-create next steps are left unspecified, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (name and timezone are both documented in-schema), so the baseline is 3. The description adds no format or defaulting detail for either parameter (e.g. timezone default, name uniqueness), so it does not earn above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new Home Assistant instance on VomeHome') and no sibling offers creation, so the agent can distinguish it from vomehome_list_instances/get_instance/use_instance without opening a schema. The sandbox/test framing further sharpens the intent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use context ('throwaway test/sandbox install') and a blocking mechanism via VOMEHOME_ALLOW_CREATE=false. It stops short of explicitly contrasting with vomehome_use_instance, which an agent might plausibly reach for when it only wants to target an existing instance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_get_instanceGet VomeHome instanceA
Read-only

Get one VomeHome instance by id, including live status and the Home Assistant URL. Requires VOMEHOME_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id (UUID), as returned by vomehome_list_instances.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. On top of that the description discloses the auth requirement (VOMEHOME_TOKEN) and the nature of the returned data (live status, HA URL), which is meaningful added context for an open-world read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence with the action, scope, and return content front-loaded, followed by the auth caveat. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only lookup with no output schema, the description covers what it retrieves and the token requirement. It could be marginally stronger by noting failure behavior for an invalid id, but nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single instance_id parameter is fully documented as a UUID from vomehome_list_instances. The description's 'by id' adds no format or source 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one VomeHome instance by id') plus what the result contains (live status and the Home Assistant URL). Sibling differentiation from vomehome_list_instances is implied by 'one ... by id' but the sibling is not named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (fetch a single instance's details once you have its id from the list tool), and the description states the auth prerequisite ('Requires VOMEHOME_TOKEN'). It gives no explicit when-not conditions or pointer to the alternative tool for listing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_get_login_urlGet VomeHome one-click login URLA
Read-only

Get a one-click login URL that opens your VomeHome Home Assistant already signed in. Present the returned URL to the user as a link to open in a new browser tab/window. The URL embeds a short-lived credential, so treat it as a secret and do not log it. Requires VOMEHOME_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id (UUID) to open.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint. The description adds important behavioral context beyond that: the URL embeds a short-lived credential, must be treated as a secret, must not be logged, and requires VOMEHOME_TOKEN. This is exactly the extra security and auth guidance an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four short sentences, front-loaded with the tool's purpose. Every sentence carries necessary information: what it returns, how to present it, security handling, and auth requirement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only tool with no output schema, the description is complete. It explains the return value, how to use it, and the required credential, leaving no critical gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single instance_id parameter is fully documented in the schema. The description does not add further meaning about the parameter, so it meets the baseline where the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (get) and resource (one-click login URL) and states the outcome clearly: it opens the VomeHome Home Assistant already signed in. This is distinct from sibling tools such as vomehome_create_guest_link or vomehome_use_instance, so an agent can identify its unique role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: return the URL to the user for opening in a new tab/window. It does not explicitly name alternatives or when-not-to-use conditions, but the operational context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_get_onboardingGet Home Assistant setup-wizard stateA
Read-only

Which Home Assistant setup-wizard steps are still outstanding on a VomeHome instance. A newly provisioned home has its owner account created but the location, analytics and integration steps left for a person to choose, so it shows the wizard instead of a dashboard until they are done. Requires VOMEHOME_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id (UUID).

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful context beyond that: the auth requirement (VOMEHOME_TOKEN) and the behavioral explanation that a newly provisioned home shows the wizard instead of a dashboard until location, analytics and integration steps are chosen. It does not describe the returned shape, but the schema/output situation makes that minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose, then the behavioral rationale, then the auth requirement. The middle sentence is longer than strictly necessary but it earns its place by explaining the wizard-vs-dashboard behavior an agent may need to interpret.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, single-parameter query with no output schema, the description conveys what is being reported (outstanding wizard steps), the auth prerequisite, and the situational meaning of the result. Missing only an explicit pointer to the sibling tool that consumes this state (vomehome_complete_onboarding).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter (instance_id) with 100% schema description coverage, so the schema already documents it fully. The description adds no syntax, format, or lookup guidance for instance_id, which matches the baseline 3 for a fully documented single-param schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (Home Assistant setup-wizard steps on a VomeHome instance) and its scope (which steps are 'still outstanding'), which implicitly contrasts with the sibling vomehome_complete_onboarding. It is phrased as a question rather than an explicit verb like 'list' or 'get', and it never names the sibling it complements, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the description explains what the wizard state means and why a home shows a wizard instead of a dashboard, which hints this is a pre-check tool. It never states when to call it (e.g. before vomehome_complete_onboarding) or any exclusions, so an agent must infer the workflow position.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_list_instancesList VomeHome instancesA
Read-only

List the Home Assistant instances on your VomeHome account, with status, tier, HA URL and (where available) live health. Requires VOMEHOME_TOKEN.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read posture is covered. The description usefully adds the auth prerequisite (VOMEHOME_TOKEN) and that health is only 'where available,' but says nothing about pagination, ordering, or what an empty account returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the verb and resource, with the returned field list and the auth caveat appended compactly. No filler, no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with no output schema, the description covers purpose, the fields returned, the auth requirement, and the conditional nature of health data. The remaining gap is the absence of any routing guidance to sibling tools, which keeps it just short of full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters at all, so per the rubric the baseline is 4. The description cannot add parameter meaning because there is nothing to document, and it does not confuse the reader with phantom inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (List) + resource (Home Assistant instances on your VomeHome account), and it enumerates the returned fields (status, tier, HA URL, live health). This distinguishes it from siblings like vomehome_get_instance (singular) and vomehome_use_instance (selects one).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The scope 'on your VomeHome account' implies the discovery use case and the description notes the auth requirement, but it never states when to reach for this versus vomehome_get_instance for a single instance or vomehome_chap_status. Usage is implied, not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_reboot_instanceReboot VomeHome instanceA
Destructive

Reboot a VomeHome Home Assistant instance (reboots the underlying VM). In brokered mode the API key's ha:write (or instances:write) scope is authoritative; an optional local VOMEHOME_INSTANCES write:false only adds a client-side block.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id (UUID) to reboot.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the disruptive nature is structurally known. The description goes beyond that by explaining the authorization model: in brokered mode the API key's ha:write/instances:write scope is authoritative, and an optional local VOMEHOME_INSTANCES write:false only adds a client-side block. That is genuinely useful context an agent cannot derive from the annotations, though it does not cover downtime duration or how in-flight sessions are handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and the VM-level effect before the authorization nuance. Dense but every clause carries information; the auth sentence is jargon-heavy but relevant and not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive reboot with no output schema to explain, the description covers the action, its blast radius (underlying VM), and the permission model. It omits what happens on failure (e.g., auth rejection vs. unreachable instance) and expected downtime, which a cautious agent would want before invoking a destructive operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter (instance_id) with 100% schema description coverage, so the schema already explains its type and purpose. The description adds nothing about the id format or sourcing beyond what the schema states, which is the expected baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('Reboot a VomeHome Home Assistant instance') and immediately disambiguates scope by clarifying it reboots the underlying VM, which is not obvious from the name alone. No sibling tool in the list performs a reboot, so the action is unambiguous against the surrounding vomehome_* instance tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the operational context (brokered mode vs. local mode) but never states when to reach for this tool versus alternatives such as vomehome_get_instance or vomehome_use_instance, nor any preconditions like confirming the instance is reachable or idle. The permission discussion is closer to behavioral disclosure than usage routing, so guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vomehome_use_instanceSwitch active VomeHome instanceA

Switch which VomeHome instance the Home Assistant tools target. Subsequent ha_* calls (states, services, automations, templates, check_config) operate on this instance, and write/config permission follows that instance's own flags (declared in VOMEHOME_INSTANCES, the default instance, or auto-granted on create). An undeclared but reachable instance inherits the global default, which in brokered mode defers to the API key's server-side scopes.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_idYesVomeHome instance id to make active, as returned by vomehome_list_instances.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnlyHint=false and openWorldHint=true; the description goes far beyond by disclosing the permission model: write/config permission follows the target instance's own flags, flags come from VOMEHOME_INSTANCES or the default, are auto-granted on create, an undeclared-but-reachable instance inherits the global default, and brokered mode defers to the API key's server-side scopes. That is exactly the non-obvious operational 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first clause and the text is a single dense sentence with no filler. It is somewhat run-on and information-heavy for one sentence, but every clause carries real content rather than restating the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter switch, the definition covers purpose, downstream effect, and the full permission-inheritance model. It does not cover the return shape or whether the switch persists across sessions, but with no output schema and openWorldHint already declared, the remaining gap is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single instance_id parameter is already documented, including that it comes from vomehome_list_instances. The description adds no syntax, format, or validation detail for the parameter itself, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (switch) and resource (active VomeHome instance) and immediately scopes its effect: subsequent ha_* calls target this instance. This clearly separates it from vomehome_list_instances and vomehome_get_instance, which read rather than mutate the active target.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes the usage context well — call it when you want later ha_* calls (states, services, automations, templates, check_config) to hit a different instance — and the schema points to vomehome_list_instances for obtaining the id. It stops short of explicit when-not guidance or naming an alternative switching route, 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 111 tool updatesv0.10.0
    • First observedesphome_activity
    • First observedesphome_clean
    • First observedesphome_compile
    • First observedesphome_dashboard_info
    • First observedesphome_edit_config
    • First observedesphome_get_config
    • First observedesphome_list_devices
    • First observedesphome_list_migrations
    • First observedesphome_logs
    • First observedesphome_save_config
    • First observedesphome_upload
    • First observedesphome_validate
    • First observedha_addon_install_vome
    • First observedha_call_service
    • First observedha_camera_frame
    • First observedha_camera_image
    • First observedha_change_user_password
    • First observedha_check_config
    • First observedha_clear_system_log
    • First observedha_config_entry_options
    • First observedha_config_flow
    • First observedha_create_dashboard
    • First observedha_create_user
    • First observedha_delete_automation
    • First observedha_delete_config_entry
    • First observedha_delete_config_file
    • First observedha_delete_dashboard
    • First observedha_delete_helper
    • First observedha_delete_script
    • First observedha_delete_user
    • First observedha_edit_config_file
    • First observedha_fire_event
    • First observedha_get_automation
    • First observedha_get_config
    • First observedha_get_dashboard
    • First observedha_get_entity_registry
    • First observedha_get_error_log
    • First observedha_get_history
    • First observedha_get_logbook
    • First observedha_get_script
    • First observedha_get_state
    • First observedha_get_supervisor_log
    • First observedha_get_system_log
    • First observedha_get_trace
    • First observedha_hacs_add_repository
    • First observedha_hacs_download_repository
    • First observedha_hacs_info
    • First observedha_hacs_list_repositories
    • First observedha_hacs_remove_repository
    • First observedha_integration_setup_vome
    • First observedha_list_areas
    • First observedha_list_automations
    • First observedha_list_config_entries
    • First observedha_list_config_files
    • First observedha_list_dashboards
    • First observedha_list_devices
    • First observedha_list_discovery_flows
    • First observedha_list_entities
    • First observedha_list_helpers
    • First observedha_list_services
    • First observedha_list_traces
    • First observedha_list_users
    • First observedha_matter_reinterview
    • First observedha_provision_service_login
    • First observedha_read_config_file
    • First observedha_reload_automations
    • First observedha_remove_entity
    • First observedha_remove_user_credentials
    • First observedha_render_template
    • First observedha_save_dashboard
    • First observedha_set_automation
    • First observedha_set_helper
    • First observedha_set_log_level
    • First observedha_set_script
    • First observedha_set_user_credentials
    • First observedha_supervisor_api
    • First observedha_trigger_automation
    • First observedha_update_entity
    • First observedha_update_user
    • First observedha_view_snapshot
    • First observedha_watch_states
    • First observedha_write_config_file
    • First observednodered_create_flow
    • First observednodered_delete_flow
    • First observednodered_get_flow
    • First observednodered_get_flows
    • First observednodered_list_nodes
    • First observednodered_set_flows
    • First observednodered_update_flow
    • First observedvome_health_check
    • First observedvome_health_report
    • First observedvomehome_chap_enrol
    • First observedvomehome_chap_link_standby
    • First observedvomehome_chap_pair
    • First observedvomehome_chap_set_home_address
    • First observedvomehome_chap_standby_candidates
    • First observedvomehome_chap_status
    • First observedvomehome_chap_switch
    • First observedvomehome_chap_switch_back
    • First observedvomehome_chap_unlink_standby
    • First observedvomehome_complete_onboarding
    • First observedvomehome_create_guest_link
    • First observedvomehome_create_instance
    • First observedvomehome_get_instance
    • First observedvomehome_get_login_url
    • First observedvomehome_get_onboarding
    • First observedvomehome_list_guest_links
    • First observedvomehome_list_instances
    • First observedvomehome_reboot_instance
    • First observedvomehome_revoke_guest_link
    • First observedvomehome_use_instance

TDQS

A3.6/5.0

Scored across 111 tools

Disambiguation3/5

Most tools target distinct actions and have strong descriptions, but the 111-tool surface contains several overlapping clusters: entity lookup vs. state vs. registry, multiple log readers, config-file editing vs. helper/automation/dashboard editing, HACS vs. config entries, and ESPHome vs. HA config editing. The descriptions mitigate most confusion, but an agent can still misselect among related tools.

Naming Consistency4/5

Names are mostly consistent snake_case with domain prefixes (ha_, esphome_, nodered_, vomehome_, vome_) and follow a verb_noun pattern. Minor deviations exist: two Vome prefixes (vomehome_ vs. vome_), and a few long noun-first names such as vomehome_chap_standby_candidates.

Tool Count1/5

111 tools is extreme and well beyond any reasonable single-server surface. Even accounting for Home Assistant's breadth, this bundles multiple sub-products (HA core, ESPHome, Node-RED, VomeHome, CHAP, HACS) into one enormous tool list, imposing heavy context and selection costs.

Completeness4/5

Coverage is very broad: entities, automations, scripts, dashboards, helpers, users, config files, logs, HACS, ESPHome, Node-RED, and VomeHome/CHAP lifecycle operations are all represented. Some gaps remain, such as native area/floor/label CRUD or first-class scene management, but most can be worked around via service calls or config-file editing.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    MCP server for full Home Assistant control, enabling AI agents to manage dashboards, automations, files, apps, entities, and more via REST API, WebSocket, and SSH.
    66
    113 npm
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Connects LLM coding agents to Home Assistant instances, enabling configuration file management, service calls, template testing, and automation diagnostics via MCP tools.
    -