Comprehensive Model Context Protocol server for managing Home Assistant through AI assistants.
Home Assistant is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Home Assistant and ESPHome for coding agents: states, services, automations, dashboards, flashing.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user vortitron-home-assistant-mcp '--' npx -y @vortitron/home-assistant-mcp
# 2 — ask your agent for something these tools do
# ha_list_areas, ha_list_devices, ha_get_entity_registry and 112 more
Home Assistant costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Home Assistant as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Node.js — the current LTS (24) is the safe choice; npx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user vortitron-home-assistant-mcp '--' npx -y @vortitron/home-assistant-mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
Nothing is required, but it can take HA_URL (Your Home Assistant's address, e.g. http://homeassistant.local:8123 (or use VOMEHOME_TOKEN instead)), HA_TOKEN (A Home Assistant long-lived access token), HA_ALLOW_WRITE (Set to true to allow service calls and edits; reads only without it), VOMEHOME_TOKEN (A key from the Vome app's Agent tab, to reach the home through Vome instead of HA_URL and HA_TOKEN) if you want to set them.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
115 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
List all Home Assistant areas (rooms/zones) with their ids, names and floor. Use the area_id or name to filter other tools.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| area | string | no | Area id or name to filter by. |
| search | string | no | Case-insensitive substring matched against name, manufacturer and model. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_id | string | no | Exact entity_id to look up. |
| domain | string | no | Filter to a single domain, e.g. 'light'. |
| include_disabled | boolean | no | Include disabled entities (default true). |
Report whether ESPHome is reachable and what is possible right now — listing and
No parameter schema on file.
What the ESPHome build commands (validate, compile, upload, logs) started in this session are doing:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| since | integer | no | Return only output lines newer than this sequence number (the 'seq' of an earlier call). |
List devices/configurations known to the ESPHome dashboard, including their configuration filenames (needed by the other ESPHome tools).
No parameter schema on file.
Read the YAML for an ESPHome configuration file (e.g. 'living-room.yaml').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
Report the ESPHome spellings a device's YAML still uses that have since been
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
| yaml | string | yes | Full YAML content to write. |
Change part of an ESPHome configuration file in place: each edit replaces one exact piece of
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
| edits | array | yes | Applied in order, each to the result of the one before. |
Validate (compile-check) an ESPHome configuration and return the output. The fast way to confirm a YAML edit is correct before compiling or flashing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
| timeout_seconds | integer | no | Override the command timeout. |
| full_output | boolean | no | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. |
Compile firmware for an ESPHome configuration and return the build output. Can take several minutes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
| timeout_seconds | integer | no | Override the command timeout. |
| full_output | boolean | no | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
| port | string | no | Device address (IP/hostname) or 'OTA'. Defaults to 'OTA'. |
| timeout_seconds | integer | no | Override the command timeout. |
| full_output | boolean | no | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. |
Stream the live logs from an ESPHome device and return what was captured. This is the way to
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
| port | string | no | Device address (IP/hostname) or 'OTA' for logs over the network. Defaults to 'OTA'. |
| timeout_seconds | integer | no | How long to capture logs for. Defaults to the standard command timeout. |
| full_output | boolean | no | Return every line of output. By default a long output comes back summarised: all errors and warnings, memory use, and the last lines. |
Delete the cached build files for a configuration. Use this when a compile fails for reasons
| Parameter | Type | Required | Notes |
|---|---|---|---|
| configuration | string | yes | Configuration filename, e.g. 'living-room.yaml'. |
| timeout_seconds | integer | no | Override the command timeout. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| endpoint | string | yes | Supervisor API path, e.g. /store/repositories or /addons/core_mosquitto/info |
| method | string | no | HTTP method |
| data | object | no | Optional JSON body for POST/PUT |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| repository_url | string | no | Add-on repository git URL (default: https://github.com/Vortitron/VomeSync) |
| skip_start | boolean | no | If true, install but do not start the add-on |
List all automations with their entity_id, unique id (needed to read/edit config), on/off state and last triggered time.
No parameter schema on file.
Get the full configuration (triggers, conditions, actions) of an automation. Accepts either the entity_id (automation.xxx) or the unique id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| automation | string | yes | entity_id (automation.xxx) or unique id. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| automation_id | string | yes | Unique id of the automation (existing id to update, or a new id to create). |
| config | object | yes | Automation config object: { alias, trigger, condition, action, mode, ... }. |
Delete an automation by its unique id. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| automation_id | string | yes | Unique id of the automation to delete. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| automation | string | yes | entity_id (automation.xxx) or unique id. |
| skip_condition | boolean | no | Skip the automation's conditions (default true). |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_id | string | yes | The camera entity, e.g. 'camera.front_door'. |
| width | integer | no | Width in pixels to scale the still to (default …). |
A camera's current still decoded and shrunk to at most width x height pixels, returned as RGB
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_id | string | yes | The camera entity, e.g. 'camera.front_door'. |
| width | integer | yes | Most pixels across. |
| height | integer | yes | Most pixels down. |
List a directory under Home Assistant's config directory. Omit 'path' for the root,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | no | Directory relative to the config root, e.g. 'packages'. Omit for the root. |
Read a file under Home Assistant's config directory — configuration.yaml, a package, an
| Parameter | Type | Required | Notes |
|---|---|---|---|
| path | string | yes | File relative to the config root, e.g. 'configuration.yaml'. |
| encoding | string | no | 'utf8' (default) for text; 'base64' for a binary file, which otherwise fails with 'not UTF-8 text'. |
Write a file under Home Assistant's config directory. Defaults to UTF-8 text; pass
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | 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 a |
| path | string | yes | File relative to the config root, e.g. 'configuration.yaml'. |
| content | string | yes | The complete new contents of the file (base64 if encoding='base64'). |
| encoding | string | no | 'utf8' (default) for text; 'base64' for binary content. |
| verify | boolean | 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). |
Change part of a text file under the config directory: each edit replaces one exact piece of
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | 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. |
| path | string | yes | File relative to the config root, e.g. 'automations.yaml'. |
| edits | array | yes | Applied in order, each to the result of the one before. |
| verify | boolean | no | Check the configuration afterwards and restore the file if it fails (default true). |
Delete one file under the config directory — a throwaway test file, a superseded
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | 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. |
| path | string | yes | File relative to the config root, e.g. 'packages/old.yaml'. |
List Home Assistant Lovelace dashboards (url_path, title, mode, sidebar visibility). Works in direct HA mode and VomeHome brokered mode.
No parameter schema on file.
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'.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url_path | string | no | Dashboard url_path (from ha_list_dashboards). Omit or use 'lovelace' for the default overview. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url_path | string | yes | Dashboard url_path to save (must already exist, or create it first with ha_create_dashboard). |
| config | object | yes | Lovelace dashboard configuration object (title, views, cards, …). |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url_path | string | yes | URL path slug for the new dashboard (e.g. 'sam-energy'). |
| title | string | yes | Sidebar title for the dashboard. |
| show_in_sidebar | boolean | no | Show in the sidebar (default true). |
| icon | string | no | MDI icon for the sidebar (e.g. 'mdi:home'). |
| require_admin | boolean | no | Restrict dashboard to admin users (default false). |
| allow_single_word | boolean | no | Allow a url_path without a hyphen (default false). |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| dashboard_id | string | yes | Dashboard id to delete (not url_path). |
Whether HACS is installed and its version, configured country, and whether it has pending
No parameter schema on file.
List repositories HACS knows about — both custom and default-store ones it has fetched
| Parameter | Type | Required | Notes |
|---|---|---|---|
| categories | array | no | Filter to these HACS categories (e.g. ['integration']). Omit for all. |
Add a custom repository to HACS by GitHub 'owner/repo' (or its URL) and category
| Parameter | Type | Required | Notes |
|---|---|---|---|
| repository | string | yes | GitHub 'owner/repo' or its URL, e.g. 'me/my-integration'. |
| category | string | yes | HACS category: integration, plugin, theme, python_script, appdaemon, netdaemon, or template. |
Install or update a repository HACS already knows about — this is the step that
| Parameter | Type | Required | Notes |
|---|---|---|---|
| repository | string | yes | Repository id or 'owner/repo' full name. |
| version | string | no | Specific version/tag to install. Omit for the latest. |
Uninstall a HACS-managed repository's files and stop HACS tracking it as custom.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| repository | string | yes | Repository id or 'owner/repo' full name. |
Vome's health score for this Home Assistant, out of 100, with everything its check found: each finding
No parameter schema on file.
Start a fresh Vome health check on this Home Assistant: after fixing findings, this is how the score
| Parameter | Type | Required | Notes |
|---|---|---|---|
| use_ai | boolean | no | Include Vome's written summary of the findings (default true). |
List the helpers Home Assistant stores — input_boolean, input_number, counter, timer
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | no | One helper type to list. Omit for all of them. |
Create a Home Assistant helper, or update one that exists. **This is how to add a helper
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | Helper type: …. |
| config | object | yes | The helper's fields, e.g. { name: 'Holiday mode', icon: 'mdi:palm-tree' }. |
| helper_id | string | no | Existing helper id to update. Omit to create a new one. |
Delete a stored Home Assistant helper by id (from ha_list_helpers). The entity
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | Helper type: …. |
| helper_id | string | yes | Helper id from ha_list_helpers. |
| confirm_shared_id | boolean | 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. |
List installed Home Assistant config entries (integrations). Optional domain filter, e.g. vomesync.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Optional integration domain filter (e.g. vomesync, mqtt) |
Permanently delete one config entry (integration instance) by id. This is the fix for
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entry_id | string | yes | Config entry id, from ha_list_config_entries. |
List config flows Home Assistant has started but not finished — chiefly integrations
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Optional integration domain filter (e.g. tuya_local, esphome) |
| include_user_flows | boolean | no | Include flows the user started by hand; by default only discovered flows are returned |
Add or configure an integration via Home Assistant's config flow API.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handler | string | no | Integration domain to start a new flow for (e.g. vomesync) |
| flow_id | string | no | Existing flow id to continue |
| user_input | object | no | Step answers when continuing (or defaults when starting) |
| show_advanced_options | boolean | no | — |
Open a config entry's *options* flow — the per-integration settings panel — and
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entry_id | string | no | Config entry to open the options flow for (from ha_list_config_entries). |
| flow_id | string | no | Existing options flow id to continue. |
| user_input | object | no | Answers for the current step, e.g. { allow_service_calls: true }. |
Ensure the Vome custom component is set up as a config entry: start the vomesync
| Parameter | Type | Required | Notes |
|---|---|---|---|
| uid | string | no | Optional switch UID (or uid/access_key) to subscribe on first setup |
| force | boolean | no | If true, start another flow even when a vomesync entry already exists |
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.
No parameter schema on file.
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| min_level | string | no | Minimum severity to include (default 'warning'). |
| contains | string | no | Case-insensitive substring matched against logger, message, source and traceback. |
| logger | string | no | Case-insensitive substring matched against the logger name only, e.g. 'hue'. |
| include_exception | boolean | no | Include full tracebacks (default false — large). |
| limit | integer | no | Maximum entries to return, newest first (default …). |
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.
No parameter schema on file.
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| integration | string | no | Integration or logger path to change, e.g. 'hue' or 'custom_components.vomesync'. |
| level | string | no | Level to apply to 'integration'. |
| levels | object | no | Several at once: { "hue": "debug", "custom_components.vomesync": "info" }. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| tail_lines | integer | no | Number of trailing lines to return (default …). |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| target | string | no | Which log to read (default 'core'). Use 'addon' with addon_slug. |
| addon_slug | string | no | Add-on slug when target='addon', e.g. 'core_mosquitto' or the Vome slug. |
| tail_lines | integer | no | Number of trailing lines to return (default …). |
Return human-readable logbook entries (what happened and when), optionally filtered to a single entity and time window.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_id | string | no | Restrict to a single entity_id. |
| start_time | string | no | ISO 8601 start timestamp. |
| end_time | string | no | ISO 8601 end timestamp. |
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.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Flow (tab) id, e.g. the 'id' of a tab node from nodered_get_flows. |
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.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| flow | object | yes | Flow object: { label, nodes: [...], configs?: [...] }. The new tab id is returned. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Flow (tab) id to update. |
| flow | object | yes | Full flow object for this tab: { id, label, nodes: [...], configs?: [...] }. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Flow (tab) id to delete. |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| flows | array | yes | The complete flow config: an array of Node-RED node objects (tabs, nodes and config nodes). |
| rev | string | no | Revision from nodered_get_flows, for optimistic concurrency. |
| deployment_type | string | no | How Node-RED applies the deploy. Defaults to 'full'. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Restrict to one domain, e.g. 'light'. |
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, and service_response for services that…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | Service domain, e.g. 'light', 'switch', 'climate'. |
| service | string | yes | Service name, e.g. 'turn_on', 'set_temperature'. |
| data | object | no | Service data / parameters (may include entity_id). |
| target | object | no | Service target (entity/area/device/label selectors). |
In one call, everything a dashboard view shows: the state and attributes of each entity, each
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_ids | array | no | Entities whose state to return. |
| templates | object | no | Templates to render, by a key of the caller's choosing (at most 10). |
| history | array | no | History graphs: per key, the entities, how many hours back, and points per series. |
| frames | array | no | Camera stills: per key, the camera and the most pixels across and down. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Restrict to one domain, e.g. 'light', 'sensor'. |
| search | string | no | Case-insensitive substring matched against entity_id and friendly_name. |
| area | string | no | Area id or name to filter by. |
| limit | integer | no | Maximum rows to return. |
| include_attributes | boolean | no | Include full attributes for each entity (default false, compact rows). |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_ids | array | yes | One or more entity_ids, e.g. ['light.kitchen','sensor.outside_temp']. |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_ids | array | yes | Entities to fetch history for. |
| start_time | string | no | ISO 8601 start timestamp. |
| end_time | string | no | ISO 8601 end timestamp. |
| minimal | boolean | no | Return minimal response (state + last_changed only) to reduce size. |
| max_points | integer | 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. |
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.
No parameter schema on file.
Fire a custom event on the Home Assistant event bus (advanced). Useful for triggering event-based automations during testing. Requires writes to be enabled.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| event_type | string | yes | Event type, e.g. 'my_custom_event'. |
| event_data | object | no | Optional event data payload. |
Reload automations from configuration without restarting Home Assistant (calls automation.reload). Requires writes to be enabled.
No parameter schema on file.
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 }}".
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | The Jinja2 template to render. |
| variables | object | no | Optional variables made available to the template. |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | no | Which kind of item to list traces for (default 'automation'). |
| item | string | no | entity_id or unique id (automation.x / the unique id; script.y / y). Omit for all. |
| limit | integer | no | Maximum runs to return, newest first (default …). |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| item | string | no | entity_id or unique id (automation.x / the unique id; script.y / y). Required unless run_id is given. |
| domain | string | no | Item kind (default 'automation'). |
| run_id | string | no | Specific run to fetch (default: the latest). |
| include_variables | boolean | no | Include each step's changed variables (default false — verbose). |
| full | boolean | no | Return the raw, unsummarised trace including the item's config (default false). |
List every user on this Home Assistant instance: id, name, username (if they have a
No parameter schema on file.
Create a new Home Assistant user with no login yet — call ha_set_user_credentials
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Display name for the new user. |
| role | string | 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 | boolean | no | Restrict this user to local-network sign-in only (no remote/cloud access). |
Change a user's name, role, active state, or local-only restriction. Omit a field to
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | User id from ha_list_users. |
| name | string | no | — |
| role | string | no | 'admin' (system-admin, full access), 'user' (system-users, normal dashboard access, no settings), or 'read_only' (system-read-only, cannot change anything). |
| is_active | boolean | no | false disables sign-in without deleting the account. |
| local_only | boolean | no | — |
Permanently delete a user and any login credentials attached to it. Cannot delete the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | User id from ha_list_users. |
Create a local username/password login and attach it to an existing user that has none
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | User id from ha_list_users or ha_create_user. |
| username | string | yes | Login username; stored trimmed and in lower case. |
| password | string | yes | Login password, chosen by the caller. |
Reset the password for a user that already has a local login (created via
| Parameter | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | User id from ha_list_users. |
| password | string | yes | New password. |
Remove the local username/password login from a user, without deleting the user record
| Parameter | Type | Required | Notes |
|---|---|---|---|
| username | string | yes | The username to remove (not the user id). |
List the Home Assistant instances on your VomeHome account, with status, tier, HA URL and (where available) live health. Requires VOMEHOME_TOKEN.
No parameter schema on file.
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id to make active, as returned by vomehome_list_instances. |
Get one VomeHome instance by id, including live status and the Home Assistant URL. Requires VOMEHOME_TOKEN.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID), as returned by vomehome_list_instances. |
Which Home Assistant setup-wizard steps are still outstanding on a VomeHome instance.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID). |
Finish the outstanding setup-wizard steps on a VomeHome instance, so it opens on a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID). |
| core_config | object | no | Optional location/unit settings applied before the step is marked done. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID) to reboot. |
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…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Human-friendly name for the new instance. |
| timezone | string | no | Optional IANA time zone, e.g. 'Europe/London'. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID) to open. |
Create a non-admin (unless admin=true) Home Assistant user for this instance, plus a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID) to create the guest user on. |
| admin | boolean | no | Grant full admin access instead of a restricted account. Default false — choose true deliberately. |
| dashboard | string | no | Lovelace url_path to land the guest on after sign-in, instead of the default dashboard. |
| expires_in | integer | no | Seconds until this link is auto-revoked. Default 24h (86400), capped at 30 days. |
List guest links created for this instance, including already-revoked ones (with
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID). |
Revoke a guest link immediately: deletes its Home Assistant user, which invalidates
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id (UUID). |
| link_id | string | yes | Guest link id, from vomehome_create_guest_link or vomehome_list_guest_links. |
How CHAP stands for an instance: whether it is enrolled, its pair (main install, standby,
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
The user's other house installs, connected to Vome and not in a pair, that could be this
| Parameter | Type | Required | Notes |
|---|---|---|---|
| instance_id | string | yes | VomeHome instance id of the home's main install (from vomehome_list_instances). |
Turn on CHAP for an instance: heartbeats and outage alerts. Needed before a standby can be linked.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
Wait up to wait_seconds for any of these entities to change, and return what changed: for a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entity_ids | array | yes | The entities to watch. |
| wait_seconds | integer | no | How long to wait for a change (default 20). |
| cursor | integer | no | The cursor from the last call: only changes after it. |
Create a non-admin Home Assistant login for a program (an MQTT client such as
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Home Assistant or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | critical | capability blast radius (critical) — client exposure if the model is manipulated | −10 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (104 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. critical is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| ha_supervisor_api | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_addon_install_vome | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_list_automations | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_automation | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_set_automation | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_delete_automation | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_trigger_automation | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| ha_camera_image | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_camera_frame | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_list_config_files | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_read_config_file | sensitive-sourceuntrusted-input | sensitive-source: keyword "read_config"; untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_write_config_file | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_edit_config_file | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_delete_config_file | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_list_dashboards | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_dashboard | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_save_dashboard | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_create_dashboard | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| ha_delete_dashboard | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| esphome_dashboard_info | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| esphome_activity | no tags | |
| esphome_list_devices | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| esphome_get_config | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| esphome_list_migrations | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| esphome_save_config | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| esphome_edit_config | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| esphome_validate | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| esphome_compile | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| esphome_upload | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| esphome_logs | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| esphome_clean | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_hacs_info | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_hacs_list_repositories | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_hacs_add_repository | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_hacs_download_repository | untrusted-inputexternal-sink | untrusted-input: keyword "download"; external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_hacs_remove_repository | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| vome_health_report | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| vome_health_check | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| ha_list_helpers | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_set_helper | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_delete_helper | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_list_config_entries | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_delete_config_entry | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true, handler sends an HTTP DELETE (ctx.rest.request(/api${haApiPath}) at dist/tools/integrations.js:46, handler sends an HTTP DELETE (fetch(url) at dist/tools/integrations.js:51 |
| ha_list_discovery_flows | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_config_flow | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true, handler sends an HTTP POST (ctx.rest.request(/api${haApiPath}) at dist/tools/integrations.js:26, handler sends an HTTP POST (fetch(url) at dist/tools/integrations.js:31 |
| ha_config_entry_options | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true, handler sends an HTTP POST (ctx.rest.request(/api${haApiPath}) at dist/tools/integrations.js:26, handler sends an HTTP POST (fetch(url) at dist/tools/integrations.js:31 |
| ha_integration_setup_vome | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_check_config | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_system_log | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_clear_system_log | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_set_log_level | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| ha_get_error_log | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_supervisor_log | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_logbook | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| nodered_get_flows | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| nodered_get_flow | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| nodered_list_nodes | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| nodered_create_flow | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| nodered_update_flow | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| nodered_delete_flow | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| nodered_set_flows | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_list_areas | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_list_devices | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_entity_registry | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_update_entity | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_remove_entity | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_matter_reinterview | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| ha_get_script | code-execuntrusted-input | code-exec: parameter "script"; untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_set_script | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_delete_script | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_provision_service_login | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_list_services | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_call_service | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_view_snapshot | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_list_entities | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_state | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_history | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_config | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_fire_event | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| ha_reload_automations | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| ha_render_template | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_list_traces | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_get_trace | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_list_users | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_create_user | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_update_user | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_delete_user | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_set_user_credentials | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_change_user_password | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| ha_remove_user_credentials | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| vomehome_list_instances | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| vomehome_use_instance | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| vomehome_get_instance | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| vomehome_get_onboarding | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| vomehome_complete_onboarding | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| vomehome_reboot_instance | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| vomehome_create_instance | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| vomehome_get_login_url | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| vomehome_create_guest_link | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| vomehome_list_guest_links | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| vomehome_revoke_guest_link | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| vomehome_chap_status | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| vomehome_chap_standby_candidates | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| ha_watch_states | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 0.11.0. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
- The version this listing was on when mcprush began following its releases. The registry was not asked when it shipped, so this row carries no date.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Home Assistant can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.