home-assistant-mcp
Provides tools for working with the ESPHome dashboard: listing devices and pending config renames/migrations, reading, saving and doing in-place find-and-replace edits of device YAML configurations, validating and compiling firmware, flashing a device over the air, reading live device logs (boot, wifi, sensors, crashes), and cleaning stale build caches. Reached through the VomeHome relay rather than a directly exposed dashboard.
Provides direct tools for talking to a Home Assistant instance: discovering entities, areas, devices and services, reading live states/attributes, history and the logbook, rendering Jinja templates against live state, checking configuration, inspecting deduplicated structured errors and traces, calling services, creating/updating/deleting/triggering automations and scripts, managing helpers and entity registry entries, editing config files, and reading/writing Lovelace dashboards. Write operations are off by default and gated behind an explicit safety policy/scopes.
Allows an agent to read and write the flow JSON of a Node-RED instance (typically the Home Assistant add-on), so flows can be edited by the agent instead of by hand.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@home-assistant-mcpset the living room lights to 40% and turn on the coffee maker"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.

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 |
| Core config: version, location, time zone, loaded components. |
| List entities (filter by domain, free-text search, area). |
| Full state + attributes for one or more entities. |
| 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); |
| Available services (and their fields for a given domain). |
| Areas (rooms/zones). |
| Device registry (filter by area / search). |
| Registry metadata: platform, area, device, disabled/hidden. |
| Render a Jinja2 template against live state. |
| List stored helpers (input_boolean, input_number, counter, timer, …). |
| Automations with entity_id, unique id, state, last-triggered. |
| Full automation config (triggers/conditions/actions). |
| Validate the configuration (Check configuration). |
| Deduplicated, structured errors — level, logger, source, count, first/last seen. Start here. |
| Tail of the raw Home Assistant error log. |
| Add-on / Core / Supervisor / host logs (HAOS or Supervised). |
| A camera's current still, as an image the agent can see. Via VomeHome the key needs Cameras ticked. |
| A camera still decoded and shrunk to a small grid of RGB pixels, for clients that draw pictures in text. |
| Everything a dashboard view shows in one call: states, rendered templates, history in few points, camera frames. For dashboard clients. |
| Wait for state changes instead of polling: the home's Vome component sends them as they happen (through VomeHome). |
| Human-readable logbook entries. |
| Recent automation/script runs and how each one stopped. |
| Step-by-step detail for one run, with |
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-instanceha:write/ha:configscopes and the server enforces them, so the client flags are optional local-only restrictions.
Tool | Description |
| Call any service (turn_on, set_temperature, …). |
| Empty the structured error store (only needs |
| Change logging for one integration at runtime (only needs |
| Create or update an automation (also needs |
| Create or update a helper — no |
| Read a file under the config directory — text by default, or |
| Replace a file under the config directory — text by default, or |
| Delete one file under the config directory. Never a directory, and never |
| 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 |
| List a directory under the config directory (needs |
| Delete a stored helper. Refuses when the id looks shared with a |
| Delete an automation (also needs |
| Scripts by id, the same way as automations: put a step several automations share in one script. Writes need |
| Rename, re-id, move, re-icon, disable or hide an entity in the registry (needs |
| Remove an orphaned registry entry (needs |
| The Matter device page's Re-interview, for a device whose endpoints changed after a firmware update (needs |
| Manually run an automation now. |
| Reload automations without restarting. |
Lovelace dashboards (direct HA or VomeHome brokered)
Tool | What it does |
| List dashboards ( |
| Read one dashboard's full config (views, cards, …). |
| Save/replace a dashboard config (needs |
| Register a new storage-mode dashboard (needs |
| Delete a dashboard by id (needs |
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 |
| How ESPHome is reached, and whether flashing/logs are available right now. |
| List dashboard configurations/devices; flags configs needing renames. |
| ESPHome spellings a config still uses that have been renamed. |
| Read a configuration's YAML. |
| Write a configuration's YAML, whole: for a new file (write-gated). |
| Change part of a configuration in place with exact find-and-replace edits, so a long file is not resent (write-gated). |
| Vome's health score for the home and every finding, with severity, evidence, a recommendation and the entities involved. |
| Run a fresh health check, to re-score after fixes (write-gated). |
| Validate a configuration. |
| Compile firmware. |
| Compile + flash a device over the air; validates first (write-gated). |
| Read a device's live logs — boot, wifi, sensors, crashes. |
| 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 |
| Get the full flow config (all tabs) plus the current revision. |
| Get one flow (tab) and its nodes by id. |
| List installed node modules/types (the palette). |
| Add a new tab without disturbing existing flows (write-gated). |
| Replace one tab by id, leaving others untouched (write-gated). |
| Delete a tab and its nodes (write-gated). |
| 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 |
| List your HA instances with status, tier, URL, live health, the active instance and per-instance client write/config access. |
| Details + live status for one instance. |
| Switch which instance the |
| Reboot an instance's VM (write-gated). |
| 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). |
| Mint a one-click HA login URL to open in a new tab. |
| Create a non-admin HA user + one-click login URL for sharing (needs |
| List guest links for an instance, revoked ones included. |
| 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 |
| List installed integrations (config entries). Optional domain filter. |
| 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 |
| List integrations Home Assistant has discovered on the network but not yet added. |
| Start ( |
| Read or set an integration's options — including ESPHome's |
| Add the Vome ( |
Supervisor / Vome add-on (HAOS / Supervised)
Tool | Description |
| Call a Supervisor endpoint via |
| Add |
HACS (Home Assistant Community Store)
Tool | Description |
| HACS version, stage, and whether it has pending background tasks. |
| List repositories HACS knows about (optionally filtered by category). |
| Add a custom repository by |
| Install (or update) a tracked repository — the step that actually writes its files. Needs |
| Uninstall a repository's files and stop tracking it. Needs |
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 |
| List every user: id, name, username, role, active/owner status. |
| Create a user with a role ( |
| Change a user's name, role, active state, or local-only restriction. Needs |
| Permanently delete a user and its login. Needs |
| Give a user with no login yet a username/password. Needs |
| Reset the password for a user that already has a login. Needs |
| Remove a login without deleting the user. Needs |
| 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 |
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)
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 buildLAN TCP tunnels (RDP, etc.)
npx -y @vortitron/home-assistant-mcp tunnel --token <jwt> --local-port 3390Opens 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 |
| — (required) | Base URL, e.g. |
| — (required) | Long-lived access token (Profile → Security). |
| off (direct) / permissive (brokered) | Local write guard. In brokered mode the API key's per-instance scope decides (server-enforced); setting |
|
| 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. |
| (any) | If set, only these domains may be written. |
| off (direct) / permissive (brokered) | Local guard for editing automation config. Same semantics as |
| (disabled) | Node-RED editor/admin base URL, e.g. |
| — | Bearer token if Node-RED |
| — | Credentials exchanged for a token via |
|
| VomeHome portal base URL. |
| (disabled) | VomeHome personal access token; enables the |
| (direct mode) | The active/default instance to broker HA calls to. With a token and no |
| (none) | Optional JSON registry to make multiple instances known at startup, e.g. |
| (defer to key) | Optional local guard for creating an instance. The real authority is the account-wide create scope on your API key; set |
|
| HTTP/WebSocket request timeout. |
|
| Max items a list tool returns before truncating. |
|
|
|
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-mcpThe first connects your home (it asks for the key), the second installs all four panes. Or pick them one at a time:

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-mcpThat 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-mcpFor 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-mcpFor 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-mcpAnd 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-mcpTo 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-mcpMultiple 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_IDis the active/default instance theha_*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_INSTANCESdeclares 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-instancewrite/confighere is an optional local-only restriction: omit it to defer to the server, or setfalseto keep an instance read-only on this machine regardless of what the key allows (the example locks the house locally).vomehome_use_instanceswitches the active instance for subsequentha_*calls;vomehome_list_instancesshows 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) soha_*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 toVOMEHOME_INSTANCESto 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 doctordoctor 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:
Read-only by default (direct mode). With a raw
HA_TOKENthe MCP is the only guard, so every state-changing tool refuses untilHA_ALLOW_WRITE=true. In brokered mode permissions instead live on your VomeHome API key and are enforced server-side per instance (see Brokered mode).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.Optional allow-list. Set
HA_ALLOW_DOMAINSto permit only specific domains.Cross-domain guard.
ha_call_servicechecks the domain of every target entity — including entity ids nested anywhere insidedata— 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.Separate config-write scope. Editing automation YAML needs its own
ha:configscope (brokered) orHA_ALLOW_CONFIG_WRITE=true(direct).VomeHome guards. Rebooting or creating an instance is gated by the matching scope on your API key (server-enforced); the optional
VOMEHOME_ALLOW_CREATEclient 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:writefor 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_oncan'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 theinstances:readscope, andvomehome_create_instanceneedsinstances: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 get403 … missing required scope(s): instances:readfrom the instance tools. If you want the agent to spin up sandboxes, mint the token withinstances:write. Creating an instance grants that key fullha:*access (ha:read,ha:write,ha:config,ha:files) on the new instance automatically — existing homes keep the grants you ticked. No localVOMEHOME_ALLOW_CREATEenv flag is required in brokered mode (setfalseonly if you want a local block). A default (read-only) token already includesinstances: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(domainlight, arealiving 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(oresphome_save_configfor 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") → readexception_summary→ha_get_system_logagain withinclude_exception: truefor the full stack."Why didn't my morning automation run?" →
ha_get_trace(item: "automation.morning") → readfailed_at.
Debugging with logs
Four surfaces, roughly in the order to reach for them:
Question | Tool |
What is broken right now? |
|
Why didn't this automation do anything? |
|
What did the add-on / host do? |
|
What happened to this entity, and when? |
|
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:
ha_set_log_level(integration: "hue", level: "debug") — debug on the one integration, not globally.ha_clear_system_log.Reproduce it (
ha_call_service,ha_trigger_automation, …).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,logsandcleanrun over the dashboard's multiplexed/wsAPI. 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/editREST endpoint with a single/wssocket; the remaining legacy endpoints are documented upstream as deprecated. The component translates/wsinto 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. Callesphome_dashboard_infoto 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_uploadvalidates 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; passskip_validate: trueto bypass it.
Node-RED notes
The HA Node-RED add-on exposes the editor on port
1880(http://homeassistant.local:1880). PointNODERED_URLat it.If the add-on has a credential secret /
adminAuthset, supplyNODERED_TOKEN(orNODERED_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_flowsrewrites everything — prefernodered_create_flow/nodered_update_flowfor day-to-day edits. Pass therevfromnodered_get_flowsso 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 --noEmitLayout:
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 testsRoadmap
VomeHome‑brokered HA access (the real boundary) — shipped (MVP). HA reads/writes can be proxied through VomeHome with a revocable
VOMEHOME_TOKENso 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: pointHA_URL/HA_TOKENat 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 inproject_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 toolsesphome_activityESPHome build activityARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Return only output lines newer than this sequence number (the 'seq' of an earlier call). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 filesADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. | |
| timeout_seconds | No | Override the command timeout. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| full_output | No | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. | |
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. | |
| timeout_seconds | No | Override the command timeout. |
TDQS
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.
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.
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.
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.
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.
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 capabilityARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 configADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | Applied in order, each to the result of the one before. | |
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. |
TDQS
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.
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.
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.
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.
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.
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 configBRead-only
Read the YAML for an ESPHome configuration file (e.g. 'living-room.yaml').
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. |
TDQS
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.
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.
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.
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.
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.
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 devicesARead-only
List devices/configurations known to the ESPHome dashboard, including their configuration filenames (needed by the other ESPHome tools).
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 renamesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. |
TDQS
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.
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.
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.
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.
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.
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 logsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | Device address (IP/hostname) or 'OTA' for logs over the network. Defaults to 'OTA'. | |
| full_output | No | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. | |
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. | |
| timeout_seconds | No | How long to capture logs for. Defaults to the standard command timeout. |
TDQS
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.
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.
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.
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.
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.
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 configADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| yaml | Yes | Full YAML content to write. | |
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. |
TDQS
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.
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.
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.
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.
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.
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)ADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | Device address (IP/hostname) or 'OTA'. Defaults to 'OTA'. | |
| full_output | No | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. | |
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. | |
| timeout_seconds | No | Override the command timeout. |
TDQS
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| full_output | No | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. | |
| instance_id | No | Optional: 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. | |
| configuration | Yes | Configuration filename, e.g. 'living-room.yaml'. | |
| timeout_seconds | No | Override the command timeout. |
TDQS
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.
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.
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.
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.
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.
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-onADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| skip_start | No | If true, install but do not start the add-on | |
| instance_id | No | Optional: 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_url | No | Add-on repository git URL (default: https://github.com/Vortitron/VomeSync) | https://github.com/Vortitron/VomeSync |
TDQS
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.
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.
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.
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.
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.
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 serviceADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Service data / parameters (may include entity_id). | |
| domain | Yes | Service domain, e.g. 'light', 'switch', 'climate'. | |
| target | No | Service target (entity/area/device/label selectors). | |
| service | Yes | Service name, e.g. 'turn_on', 'set_temperature'. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 pixelsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Most pixels across. | |
| height | Yes | Most pixels down. | |
| entity_id | Yes | The camera entity, e.g. 'camera.front_door'. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 cameraARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Width in pixels to scale the still to (default 1024). | |
| entity_id | Yes | The camera entity, e.g. 'camera.front_door'. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 passwordADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | User id from ha_list_users. | |
| password | Yes | New password. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 configurationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 logADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 optionsADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | No | Existing options flow id to continue. | |
| entry_id | No | Config entry to open the options flow for (from ha_list_config_entries). | |
| user_input | No | Answers for the current step, e.g. { allow_service_calls: true }. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 flowADestructive
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).
| Name | Required | Description | Default |
|---|---|---|---|
| flow_id | No | Existing flow id to continue | |
| handler | No | Integration domain to start a new flow for (e.g. vomesync) | |
| user_input | No | Step answers when continuing (or defaults when starting) | |
| instance_id | No | Optional: 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_options | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | MDI icon for the sidebar (e.g. 'mdi:home'). | |
| title | Yes | Sidebar title for the dashboard. | |
| url_path | Yes | URL path slug for the new dashboard (e.g. 'sam-energy'). | |
| instance_id | No | Optional: 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_admin | No | Restrict dashboard to admin users (default false). | |
| show_in_sidebar | No | Show in the sidebar (default true). | |
| allow_single_word | No | Allow a url_path without a hyphen (default false). |
TDQS
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.
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.
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.
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.
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.
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 userADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the new user. | |
| role | Yes | 'admin' (system-admin, full access), 'user' (system-users, normal dashboard access, no settings), or 'read_only' (system-read-only, cannot change anything). | |
| local_only | No | Restrict this user to local-network sign-in only (no remote/cloud access). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 automationADestructive
Delete an automation by its unique id. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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_id | Yes | Unique id of the automation to delete. |
TDQS
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.
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.
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.
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.
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.
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)ADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes | Config entry id, from ha_list_config_entries. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 directoryADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File relative to the config root, e.g. 'packages/old.yaml'. | |
| instance_id | Yes | The 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
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.
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.
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.
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.
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.
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 dashboardADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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_id | Yes | Dashboard id to delete (not url_path). |
TDQS
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.
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.
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.
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.
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.
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 helperADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Helper type: input_boolean, input_number, input_text, input_select, input_datetime, input_button, counter, timer, schedule. | |
| helper_id | Yes | Helper id from ha_list_helpers. | |
| instance_id | No | Optional: 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_id | No | Delete 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
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.
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.
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.
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.
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.
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 scriptADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| script_id | Yes | Script id: the key in scripts.yaml and the object id of script.<id>, e.g. 'raise_heat'. 'script.raise_heat' also works. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 userADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | User id from ha_list_users. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 placeADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File relative to the config root, e.g. 'automations.yaml'. | |
| edits | Yes | Applied in order, each to the result of the one before. | |
| verify | No | Check the configuration afterwards and restore the file if it fails (default true). | |
| instance_id | Yes | The 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| event_data | No | Optional event data payload. | |
| event_type | Yes | Event type, e.g. 'my_custom_event'. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 configBRead-only
Get the full configuration (triggers, conditions, actions) of an automation. Accepts either the entity_id (automation.xxx) or the unique id.
| Name | Required | Description | Default |
|---|---|---|---|
| automation | Yes | entity_id (automation.xxx) or unique id. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 configARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 configARead-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'.
| Name | Required | Description | Default |
|---|---|---|---|
| url_path | No | Dashboard url_path (from ha_list_dashboards). Omit or use 'lovelace' for the default overview. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 registryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Filter to a single domain, e.g. 'light'. | |
| entity_id | No | Exact entity_id to look up. | |
| instance_id | No | Optional: 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_disabled | No | Include disabled entities (default true). |
TDQS
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.
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.
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.
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.
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.
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 logARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tail_lines | No | Number of trailing lines to return (default 200). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 historyARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| minimal | No | Return minimal response (state + last_changed only) to reduce size. | |
| end_time | No | ISO 8601 end timestamp. | |
| entity_ids | Yes | Entities to fetch history for. | |
| max_points | No | Return 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_time | No | ISO 8601 start timestamp. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 logbookARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| end_time | No | ISO 8601 end timestamp. | |
| entity_id | No | Restrict to a single entity_id. | |
| start_time | No | ISO 8601 start timestamp. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 configARead-only
Get a script's full configuration (alias, sequence, fields, mode). List scripts with ha_list_entities domain='script'.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | Script id: the key in scripts.yaml and the object id of script.<id>, e.g. 'raise_heat'. 'script.raise_heat' also works. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 stateARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_ids | Yes | One or more entity_ids, e.g. ['light.kitchen','sensor.outside_temp']. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 logARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Which log to read (default 'core'). Use 'addon' with addon_slug. | |
| addon_slug | No | Add-on slug when target='addon', e.g. 'core_mosquitto' or the Vome slug. | |
| tail_lines | No | Number of trailing lines to return (default 200). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum entries to return, newest first (default 25). | |
| logger | No | Case-insensitive substring matched against the logger name only, e.g. 'hue'. | |
| contains | No | Case-insensitive substring matched against logger, message, source and traceback. | |
| min_level | No | Minimum severity to include (default 'warning'). | |
| instance_id | No | Optional: 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_exception | No | Include full tracebacks (default false — large). |
TDQS
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.
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.
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.
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.
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.
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 traceARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Return the raw, unsummarised trace including the item's config (default false). | |
| item | No | entity_id or unique id (automation.x / the unique id; script.y / y). Required unless run_id is given. | |
| domain | No | Item kind (default 'automation'). | |
| run_id | No | Specific run to fetch (default: the latest). | |
| instance_id | No | Optional: 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_variables | No | Include each step's changed variables (default false — verbose). |
TDQS
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.
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.
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.
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.
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.
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 repositoryADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | HACS category: integration, plugin, theme, python_script, appdaemon, netdaemon, or template. | |
| repository | Yes | GitHub 'owner/repo' or its URL, e.g. 'me/my-integration'. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 repositoryADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Specific version/tag to install. Omit for the latest. | |
| repository | Yes | Repository id or 'owner/repo' full name. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 repositoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| categories | No | Filter to these HACS categories (e.g. ['integration']). Omit for all. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 repositoryADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repository | Yes | Repository id or 'owner/repo' full name. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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) integrationADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | No | Optional switch UID (or uid/access_key) to subscribe on first setup | |
| force | No | If true, start another flow even when a vomesync entry already exists | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 areasARead-only
List all Home Assistant areas (rooms/zones) with their ids, names and floor. Use the area_id or name to filter other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 automationsARead-only
List all automations with their entity_id, unique id (needed to read/edit config), on/off state and last triggered time.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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)BRead-only
List installed Home Assistant config entries (integrations). Optional domain filter, e.g. vomesync.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Optional integration domain filter (e.g. vomesync, mqtt) | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 directoryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Directory relative to the config root, e.g. 'packages'. Omit for the root. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 dashboardsARead-only
List Home Assistant Lovelace dashboards (url_path, title, mode, sidebar visibility). Works in direct HA mode and VomeHome brokered mode.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 devicesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Area id or name to filter by. | |
| search | No | Case-insensitive substring matched against name, manufacturer and model. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 flowsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Optional integration domain filter (e.g. tuya_local, esphome) | |
| instance_id | No | Optional: 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_flows | No | Include flows the user started by hand; by default only discovered flows are returned |
TDQS
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.
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.
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.
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.
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.
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 entitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Area id or name to filter by. | |
| limit | No | Maximum rows to return. | |
| domain | No | Restrict to one domain, e.g. 'light', 'sensor'. | |
| search | No | Case-insensitive substring matched against entity_id and friendly_name. | |
| instance_id | No | Optional: 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_attributes | No | Include full attributes for each entity (default false, compact rows). |
TDQS
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.
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.
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.
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.
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.
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 helpersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | One helper type to list. Omit for all of them. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 servicesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Restrict to one domain, e.g. 'light'. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 tracesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | entity_id or unique id (automation.x / the unique id; script.y / y). Omit for all. | |
| limit | No | Maximum runs to return, newest first (default 20). | |
| domain | No | Which kind of item to list traces for (default 'automation'). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 usersARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes | Home Assistant device id (ha_list_devices), not the Matter node id. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 passwordADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the login is for, e.g. 'Zigbee2MQTT'. | |
| role | No | 'read_only' (default) is enough for MQTT; 'user' if the program drives HA itself. | |
| rotate | No | Re-issue the password of an existing login this tool created, and redeliver it. | |
| username | Yes | Login name: lowercase, e.g. 'zigbee2mqtt'. | |
| deliver_to | Yes | Where the program reads its login. At least one. | |
| local_only | No | Accept sign-in from the local network only (default true). | |
| instance_id | Yes | The instance this login is for (as listed by vomehome_list_instances). Checked against the one this session is targeting; refused if they differ. |
TDQS
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.
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.
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.
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.
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.
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 fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File relative to the config root, e.g. 'configuration.yaml'. | |
| encoding | No | 'utf8' (default) for text; 'base64' for a binary file, which otherwise fails with 'not UTF-8 text'. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 registryADestructive
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).
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | The entity to remove. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 userADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | The username to remove (not the user id). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 templateARead-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 }}".
| Name | Required | Description | Default |
|---|---|---|---|
| template | Yes | The Jinja2 template to render. | |
| variables | No | Optional variables made available to the template. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 configADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Lovelace dashboard configuration object (title, views, cards, …). | |
| url_path | Yes | Dashboard url_path to save (must already exist, or create it first with ha_create_dashboard). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 automationADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Automation config object: { alias, trigger, condition, action, mode, ... }. | |
| instance_id | No | Optional: 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_id | Yes | Unique id of the automation (existing id to update, or a new id to create). |
TDQS
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.
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.
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.
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.
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.
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 helperADestructive
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
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Helper type: input_boolean, input_number, input_text, input_select, input_datetime, input_button, counter, timer, schedule. | |
| config | Yes | The helper's fields, e.g. { name: 'Holiday mode', icon: 'mdi:palm-tree' }. | |
| helper_id | No | Existing helper id to update. Omit to create a new one. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Level to apply to 'integration'. | |
| levels | No | Several at once: { "hue": "debug", "custom_components.vomesync": "info" }. | |
| instance_id | No | Optional: 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. | |
| integration | No | Integration or logger path to change, e.g. 'hue' or 'custom_components.vomesync'. |
TDQS
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.
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.
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.
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.
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.
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 scriptADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | Script config object: { alias, sequence, fields, mode, ... }. | |
| script_id | Yes | Script id: the key in scripts.yaml and the object id of script.<id>, e.g. 'raise_heat'. 'script.raise_heat' also works. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 passwordADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | User id from ha_list_users or ha_create_user. | |
| password | Yes | Login password, chosen by the caller. | |
| username | Yes | Login username. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 APIADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Optional JSON body for POST/PUT | |
| method | No | HTTP method | get |
| endpoint | Yes | Supervisor API path, e.g. /store/repositories or /addons/core_mosquitto/info | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| automation | Yes | entity_id (automation.xxx) or unique id. | |
| instance_id | No | Optional: 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_condition | No | Skip the automation's conditions (default true). |
TDQS
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.
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.
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.
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.
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.
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 entityADestructive
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).
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | e.g. 'mdi:radiator'; null resets it. | |
| name | No | Display name; null resets it to the integration's. | |
| hidden | No | true hides it (by the user); false shows it again. | |
| area_id | No | Area id from ha_list_areas; null removes it. | |
| disabled | No | true disables it (by the user); false enables it again. | |
| entity_id | Yes | The entity to change, e.g. 'sensor.kitchen_temp'. | |
| instance_id | No | Optional: 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_id | No | A new entity_id in the same domain. |
TDQS
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.
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.
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.
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.
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.
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 userADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| role | No | 'admin' (system-admin, full access), 'user' (system-users, normal dashboard access, no settings), or 'read_only' (system-read-only, cannot change anything). | |
| user_id | Yes | User id from ha_list_users. | |
| is_active | No | false disables sign-in without deleting the account. | |
| local_only | No | ||
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 viewARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| frames | No | Camera stills: per key, the camera and the most pixels across and down. | |
| history | No | History graphs: per key, the entities, how many hours back, and points per series. | |
| templates | No | Templates to render, by a key of the caller's choosing (at most 10). | |
| entity_ids | No | Entities whose state to return. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 changesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | The cursor from the last call: only changes after it. | |
| entity_ids | Yes | The entities to watch. | |
| instance_id | No | Optional: 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_seconds | No | How long to wait for a change (default 20). |
TDQS
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.
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.
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.
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.
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.
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 fileADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File relative to the config root, e.g. 'configuration.yaml'. | |
| verify | No | Check the configuration afterwards and restore the file if it fails. Default true for utf8, false for base64 (check_config can't validate binary content). | |
| content | Yes | The complete new contents of the file (base64 if encoding='base64'). | |
| encoding | No | 'utf8' (default) for text; 'base64' for binary content. | |
| instance_id | Yes | The 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| flow | Yes | Flow object: { label, nodes: [...], configs?: [...] }. The new tab id is returned. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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)ADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Flow (tab) id to delete. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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)ARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Flow (tab) id, e.g. the 'id' of a tab node from nodered_get_flows. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 flowsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 nodesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 flowsADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rev | No | Revision from nodered_get_flows, for optimistic concurrency. | |
| flows | Yes | The complete flow config: an array of Node-RED node objects (tabs, nodes and config nodes). | |
| instance_id | No | Optional: 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_type | No | How Node-RED applies the deploy. Defaults to 'full'. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Flow (tab) id to update. | |
| flow | Yes | Full flow object for this tab: { id, label, nodes: [...], configs?: [...] }. | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| use_ai | No | Include Vome's written summary of the findings (default true). | |
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 scoreARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | No | Optional: 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
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.
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.
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.
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.
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.
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 monitoringADestructive
Turn on CHAP for an instance: heartbeats and outage alerts. Needed before a standby can be linked.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
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.
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.
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.
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.
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.
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_link_standbyCHAP: link a standbyADestructive
Make another of the user's house installs this home's standby (for a home hosted by Vome: its local fallback). Then call vomehome_chap_pair to pair both and fill the standby. The standby must already be connected to Vome and running the Vome CHAP add-on.
| Name | Required | Description | Default |
|---|---|---|---|
| install_id | Yes | The install to use, from vomehome_chap_standby_candidates. | |
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=true. The description adds value beyond that by disclosing required preconditions and the mandatory follow-up call to vomehome_chap_pair, though it never says what 'linking' overwrites on the target install. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, followed by the follow-up step and the precondition. No filler, though the parenthetical definition slightly interrupts the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two fully-documented parameters, an output schema absent and annotations covering the safety profile, the description supplies the operational context an agent needs: preconditions and the required next call. It is essentially complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both install_id and instance_id are already documented in the schema (including the source tool for the id). The description adds no format, syntax, or constraint detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Make another of the user's house installs this home's standby') and clarifies the domain term with a parenthetical definition ('its local fallback'). It is distinguishable from most siblings, though it doesn't explicitly contrast with vomehome_chap_unlink_standby or the pairing tool it references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit sequencing ('Then call vomehome_chap_pair to pair both and fill the standby') and preconditions ('The standby must already be connected to Vome and running the Vome CHAP add-on'). What's missing is an explicit when-not-to-use or a named alternative, 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.
vomehome_chap_pairCHAP: pair both installsADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
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.
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.
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.
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.
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.
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 homeBDestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | An address on the house network, or null. | |
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
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.
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.
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.
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.
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.
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 candidatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
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.
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.
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.
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.
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.
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 statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
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.
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.
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.
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.
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.
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 standbyADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| cancel | No | Call off a switch in progress instead. | |
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
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.
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.
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.
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.
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.
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 backADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| now | No | Switch back without syncing first (emergency). | |
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
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.
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.
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.
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.
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.
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_chap_unlink_standbyCHAP: stop using the standbyADestructive
Stop using the linked house standby or local fallback. Refused while it is running the home. Its Home Assistant stays stopped until the user starts it.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as destructive and open-world, but the description adds material context beyond them: it can be refused while the standby is running the home, and the Home Assistant stays stopped until the user starts it. This is useful behavioral disclosure for a destructive unlink operation. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the refusal condition, then the side effect. Every sentence adds information and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive CHAP tool with annotations and no output schema, the description covers the key operational facts: what it stops, when it will be refused, and the resulting HA state. A little more detail on reversibility or reinstatement would make it fully complete, but no critical gap prevents correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single instance_id parameter is fully documented in the schema as coming from vomehome_list_instances. The description adds no parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (stop using) and resource (linked house standby or local fallback), and the tool name/title make the opposite of vomehome_chap_link_standby clear. It is specific enough that an agent can distinguish it from the link/switch CHAP siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a refusal condition ('Refused while it is running the home') but does not say when to choose this tool over alternatives such as vomehome_chap_switch_back or vomehome_chap_link_standby. No explicit when-to-use or when-not-to-use guidance is provided.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| core_config | No | Optional location/unit settings applied before the step is marked done. | |
| instance_id | Yes | VomeHome instance id (UUID). |
TDQS
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.
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.
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.
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.
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.
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_guest_linkCreate a guest linkADestructive
Create a non-admin (unless admin=true) Home Assistant user for this instance, plus a one-click login URL for it — self-serve, revocable sharing without handing out the owner's own login. Only works for Vome-hosted instances (not self-hosted/relay ones): minting a token for someone other than the owner needs direct network access to the VM.
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. This 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 — do not point a guest link at one.
The link expires automatically (default 24h, max 30 days) and can be revoked early with vomehome_revoke_guest_link. Treat the returned URL as a secret; do not log it.
| Name | Required | Description | Default |
|---|---|---|---|
| admin | No | Grant full admin access instead of a restricted account. Default false — choose true deliberately. | |
| dashboard | No | Lovelace url_path to land the guest on after sign-in, instead of the default dashboard. | |
| expires_in | No | Seconds until this link is auto-revoked. Default 24h (86400), capped at 30 days. | |
| instance_id | Yes | VomeHome instance id (UUID) to create the guest user on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, so the mutation/side-effect profile is covered. The description goes beyond that with genuinely useful context: the permission model of the created user, default/max expiry, revocability, and secret-handling of the returned URL. Return format beyond 'the URL' is not described, and no output schema exists, but the safety-relevant behavior is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then caveats in a clearly separated emphasis block. Every sentence carries information, though the permission-model paragraph is dense enough that it borders on over-length for a create tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the missing pieces: what is created, instance-type restriction, expiry/revocation lifecycle, and the need to treat the returned URL as a secret. Nothing an agent needs to call it safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters. The description restates the admin flag and the 24h default / 30-day cap, but adds no syntax or format detail beyond what the schema provides. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb+resource: creates a non-admin Home Assistant user plus a one-click login URL, and clarifies admin=true is the exception. An agent can distinguish this from ha_create_user (no guest link) and vomehome_get_login_url (owner login URL) without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the precondition (only works for Vome-hosted instances; minting a token for a non-owner needs direct VM network access), names the alternative for early termination (vomehome_revoke_guest_link), and gives an explicit when-not-to-use (do not point at somebody's actual house).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-friendly name for the new instance. | |
| timezone | No | Optional IANA time zone, e.g. 'Europe/London'. |
TDQS
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.
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.
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.
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.
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.
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 instanceARead-only
Get one VomeHome instance by id, including live status and the Home Assistant URL. Requires VOMEHOME_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id (UUID), as returned by vomehome_list_instances. |
TDQS
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.
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.
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.
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.
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.
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 URLARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id (UUID) to open. |
TDQS
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.
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.
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.
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.
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.
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 stateARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id (UUID). |
TDQS
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.
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.
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.
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.
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.
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_guest_linksList guest linksARead-only
List guest links created for this instance, including already-revoked ones (with revoked_at set). Never returns the login URL again — only enough to identify and manage each link.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id (UUID). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds substantive behavior beyond that: it includes revoked links (with revoked_at set) and explicitly states the login URL is never returned again. That is exactly the kind of non-obvious return-content disclosure that helps an agent reason about output, though pagination/ordering are unmentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the scoping constraint front-loaded. Every clause earns its place: what is listed, what is included, and what is deliberately withheld.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it does so by explaining links are returned with identity/management info but never the login URL, plus the revoked_at marker. This is nearly complete for a simple single-param read tool, missing only finer output details like ordering or fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one required parameter (instance_id), which the schema already documents. The description's 'for this instance' reiterates the schema without adding format or constraint detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (List) and resource (guest links) scoped explicitly to 'this instance', and the mention of revoked links distinguishes it from the create/revoke siblings. An agent can tell it is a read-only enumeration tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'only enough to identify and manage each link', which hints at a management/inspection context, and the revoked-inclusion note clarifies when this is the right listing tool. However, it never explicitly names an alternative or states a when-not condition, so it stops short of real routing guidance.
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 instancesARead-only
List the Home Assistant instances on your VomeHome account, with status, tier, HA URL and (where available) live health. Requires VOMEHOME_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 instanceADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id (UUID) to reboot. |
TDQS
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.
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.
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.
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.
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.
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_revoke_guest_linkRevoke a guest linkADestructive
Revoke a guest link immediately: deletes its Home Assistant user, which invalidates every credential and token attached to it in one step. Safe to call on an already-revoked link (no-op).
| Name | Required | Description | Default |
|---|---|---|---|
| link_id | Yes | Guest link id, from vomehome_create_guest_link or vomehome_list_guest_links. | |
| instance_id | Yes | VomeHome instance id (UUID). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint and openWorldHint already declared, the description still adds meaningful value: it specifies exactly what is destroyed (the HA user, invalidating all credentials and tokens) and that repeated calls are a no-op. This is the context an agent needs before firing a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and consequence, followed by the idempotency note. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description covers the mutation's effect, its blast radius, and its retry safety — everything an agent needs to invoke a destructive two-parameter tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds no parameter detail beyond the schema, which already documents both link_id and instance_id with their sources. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Revoke a guest link') and goes further by explaining the mechanism — deleting the underlying Home Assistant user — which distinguishes it cleanly from sibling user-management tools like 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context: 'Safe to call on an already-revoked link (no-op)', which tells the agent idempotency behavior and removes hesitation about retries. It does not explicitly name an alternative tool or state when *not* to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| instance_id | Yes | VomeHome instance id to make active, as returned by vomehome_list_instances. |
TDQS
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.
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.
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.
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.
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.
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.
111 tool updates
v0.10.0- First observed
esphome_activity - First observed
esphome_clean - First observed
esphome_compile - First observed
esphome_dashboard_info - First observed
esphome_edit_config - First observed
esphome_get_config - First observed
esphome_list_devices - First observed
esphome_list_migrations - First observed
esphome_logs - First observed
esphome_save_config - First observed
esphome_upload - First observed
esphome_validate - First observed
ha_addon_install_vome - First observed
ha_call_service - First observed
ha_camera_frame - First observed
ha_camera_image - First observed
ha_change_user_password - First observed
ha_check_config - First observed
ha_clear_system_log - First observed
ha_config_entry_options - First observed
ha_config_flow - First observed
ha_create_dashboard - First observed
ha_create_user - First observed
ha_delete_automation - First observed
ha_delete_config_entry - First observed
ha_delete_config_file - First observed
ha_delete_dashboard - First observed
ha_delete_helper - First observed
ha_delete_script - First observed
ha_delete_user - First observed
ha_edit_config_file - First observed
ha_fire_event - First observed
ha_get_automation - First observed
ha_get_config - First observed
ha_get_dashboard - First observed
ha_get_entity_registry - First observed
ha_get_error_log - First observed
ha_get_history - First observed
ha_get_logbook - First observed
ha_get_script - First observed
ha_get_state - First observed
ha_get_supervisor_log - First observed
ha_get_system_log - First observed
ha_get_trace - First observed
ha_hacs_add_repository - First observed
ha_hacs_download_repository - First observed
ha_hacs_info - First observed
ha_hacs_list_repositories - First observed
ha_hacs_remove_repository - First observed
ha_integration_setup_vome - First observed
ha_list_areas - First observed
ha_list_automations - First observed
ha_list_config_entries - First observed
ha_list_config_files - First observed
ha_list_dashboards - First observed
ha_list_devices - First observed
ha_list_discovery_flows - First observed
ha_list_entities - First observed
ha_list_helpers - First observed
ha_list_services - First observed
ha_list_traces - First observed
ha_list_users - First observed
ha_matter_reinterview - First observed
ha_provision_service_login - First observed
ha_read_config_file - First observed
ha_reload_automations - First observed
ha_remove_entity - First observed
ha_remove_user_credentials - First observed
ha_render_template - First observed
ha_save_dashboard - First observed
ha_set_automation - First observed
ha_set_helper - First observed
ha_set_log_level - First observed
ha_set_script - First observed
ha_set_user_credentials - First observed
ha_supervisor_api - First observed
ha_trigger_automation - First observed
ha_update_entity - First observed
ha_update_user - First observed
ha_view_snapshot - First observed
ha_watch_states - First observed
ha_write_config_file - First observed
nodered_create_flow - First observed
nodered_delete_flow - First observed
nodered_get_flow - First observed
nodered_get_flows - First observed
nodered_list_nodes - First observed
nodered_set_flows - First observed
nodered_update_flow - First observed
vome_health_check - First observed
vome_health_report - First observed
vomehome_chap_enrol - First observed
vomehome_chap_link_standby - First observed
vomehome_chap_pair - First observed
vomehome_chap_set_home_address - First observed
vomehome_chap_standby_candidates - First observed
vomehome_chap_status - First observed
vomehome_chap_switch - First observed
vomehome_chap_switch_back - First observed
vomehome_chap_unlink_standby - First observed
vomehome_complete_onboarding - First observed
vomehome_create_guest_link - First observed
vomehome_create_instance - First observed
vomehome_get_instance - First observed
vomehome_get_login_url - First observed
vomehome_get_onboarding - First observed
vomehome_list_guest_links - First observed
vomehome_list_instances - First observed
vomehome_reboot_instance - First observed
vomehome_revoke_guest_link - First observed
vomehome_use_instance
TDQS
Scored across 111 tools
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.
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.
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.
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
Related MCP Connectors
A TypeScript MCP server for Home Assistant, enabling programmatic management of entities, automati…
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control and monitor Home Assistant smart home devices through natural language interactions. Supports device control, entity state monitoring, history access, and automation generation with both MCP protocol and standalone HTTP REST API modes.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control Home Assistant smart home devices via MCP, with zero external dependencies. Supports calling services, getting states, and looking up service parameters.51 npmMIT
- AlicenseBqualityCmaintenanceMCP server for full Home Assistant control, enabling AI agents to manage dashboards, automations, files, apps, entities, and more via REST API, WebSocket, and SSH.66113 npmMIT
- FlicenseNot gradedqualityBmaintenanceConnects LLM coding agents to Home Assistant instances, enabling configuration file management, service calls, template testing, and automation diagnostics via MCP tools.-