Home Assistant MCP server
io.github.Vortitron/home-assistant-mcp·v0.11.0Home Assistant and ESPHome for coding agents: states, services, automations, dashboards, flashing.
0 stars114 downloads/wk
Reviews
Write oneNobody has reviewed Home Assistant yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Home Assistant tools (100, 28 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
esphome_activityWhat the ESPHome build commands (validate, compile, upload, logs) started in this session are doing:
esphome_cleanwrite actionDelete the cached build files for a configuration. Use this when a compile fails for reasons
esphome_compileCompile firmware for an ESPHome configuration and return the build output. Can take several minutes.
esphome_dashboard_infoReport whether ESPHome is reachable and what is possible right now — listing and
esphome_edit_configChange part of an ESPHome configuration file in place: each edit replaces one exact piece of
esphome_get_configRead the YAML for an ESPHome configuration file (e.g. 'living-room.yaml').
esphome_list_devicesList devices/configurations known to the ESPHome dashboard, including their configuration filenames (needed by the other ESPHome tools).
esphome_list_migrationsReport the ESPHome spellings a device's YAML still uses that have since been
esphome_logsStream the live logs from an ESPHome device and return what was captured. This is the way to
esphome_save_configwrite actionWrite 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.
esphome_uploadwrite actionCompile 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.
esphome_validateValidate (compile-check) an ESPHome configuration and return the output. The fast way to confirm a YAML edit is correct before compiling or flashing.
ha_addon_install_vomeDeveloper 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.
ha_call_serviceCall 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 return data.
ha_camera_frameA camera's current still decoded and shrunk to at most width x height pixels, returned as RGB
ha_camera_imageReturn 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.
ha_change_user_passwordReset the password for a user that already has a local login (created via
ha_check_configValidate 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.
ha_clear_system_logEmpty 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.
ha_config_entry_optionsOpen a config entry's *options* flow — the per-integration settings panel — and
ha_config_flowAdd or configure an integration via Home Assistant's config flow API.
ha_create_dashboardwrite actionRegister 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.
ha_create_userwrite actionCreate a new Home Assistant user with no login yet — call ha_set_user_credentials
ha_delete_automationwrite actionDelete an automation by its unique id. Requires HA_ALLOW_WRITE=true and HA_ALLOW_CONFIG_WRITE=true.
ha_delete_config_entrywrite actionPermanently delete one config entry (integration instance) by id. This is the fix for
ha_delete_config_filewrite actionDelete one file under the config directory — a throwaway test file, a superseded
ha_delete_dashboardwrite actionDelete 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.
ha_delete_helperwrite actionDelete a stored Home Assistant helper by id (from ha_list_helpers). The entity
ha_delete_scriptwrite actionDelete a script by id. Automations that call it will fail at that step, so remove those
ha_delete_userwrite actionPermanently delete a user and any login credentials attached to it. Cannot delete the
ha_edit_config_fileChange part of a text file under the config directory: each edit replaces one exact piece of
ha_fire_eventFire a custom event on the Home Assistant event bus (advanced). Useful for triggering event-based automations during testing. Requires writes to be enabled.
ha_get_automationGet the full configuration (triggers, conditions, actions) of an automation. Accepts either the entity_id (automation.xxx) or the unique id.
ha_get_configReturn 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.
ha_get_dashboardGet 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'.
ha_get_entity_registryInspect 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.
ha_get_error_logReturn 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.
ha_get_historyGet 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).
ha_get_logbookReturn human-readable logbook entries (what happened and when), optionally filtered to a single entity and time window.
ha_get_scriptGet a script's full configuration (alias, sequence, fields, mode). List scripts with
ha_get_stateGet 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.
ha_get_supervisor_logTail 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).
ha_get_system_logHome 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
ha_get_traceStep-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 option
ha_hacs_add_repositoryAdd a custom repository to HACS by GitHub 'owner/repo' (or its URL) and category
ha_hacs_download_repositoryInstall or update a repository HACS already knows about — this is the step that
ha_hacs_infoWhether HACS is installed and its version, configured country, and whether it has pending
ha_hacs_list_repositoriesList repositories HACS knows about — both custom and default-store ones it has fetched
ha_hacs_remove_repositorywrite actionUninstall a HACS-managed repository's files and stop HACS tracking it as custom.
ha_integration_setup_vomeEnsure the Vome custom component is set up as a config entry: start the vomesync
ha_list_areasList all Home Assistant areas (rooms/zones) with their ids, names and floor. Use the area_id or name to filter other tools.
ha_list_automationsList all automations with their entity_id, unique id (needed to read/edit config), on/off state and last triggered time.
ha_list_config_entriesList installed Home Assistant config entries (integrations). Optional domain filter, e.g. vomesync.
ha_list_config_filesList a directory under Home Assistant's config directory. Omit 'path' for the root,
ha_list_dashboardsList Home Assistant Lovelace dashboards (url_path, title, mode, sidebar visibility). Works in direct HA mode and VomeHome brokered mode.
ha_list_devicesList Home Assistant devices from the device registry. Optionally filter by area (id or name) and/or a search string matching name, manufacturer or model.
ha_list_discovery_flowsList config flows Home Assistant has started but not finished — chiefly integrations
ha_list_entitiesList 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.
ha_list_helpersList the helpers Home Assistant stores — input_boolean, input_number, counter, timer
ha_list_servicesList 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.
ha_list_tracesList 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.
ha_list_usersList every user on this Home Assistant instance: id, name, username (if they have a
ha_matter_reinterviewAsk a Matter device to describe itself again — the device page's Re-interview button. Do this
ha_provision_service_loginwrite actionCreate a non-admin Home Assistant login for a program (an MQTT client such as
ha_read_config_fileRead a file under Home Assistant's config directory — configuration.yaml, a package, an
ha_reload_automationsReload automations from configuration without restarting Home Assistant (calls automation.reload). Requires writes to be enabled.
ha_remove_entitywrite actionRemove an entity's registry entry, for cleaning up orphans: an entity whose integration no
ha_remove_user_credentialswrite actionRemove the local username/password login from a user, without deleting the user record
ha_render_templateRender 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 }}".
ha_save_dashboardSave (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.
ha_set_automationwrite actionCreate 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.
ha_set_helperwrite actionCreate a Home Assistant helper, or update one that exists. **This is how to add a helper
ha_set_log_levelRaise 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_ALLO
ha_set_scriptwrite actionCreate or update a script by id. 'config' is the script body ({ alias, sequence, fields,
ha_set_user_credentialswrite actionCreate a local username/password login and attach it to an existing user that has none
ha_supervisor_apiCall 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.
ha_trigger_automationManually 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.
ha_update_entitywrite actionChange an entity's registry entry: its display name, its entity_id, its area, its icon, or
ha_update_userwrite actionChange a user's name, role, active state, or local-only restriction. Omit a field to
ha_view_snapshotIn one call, everything a dashboard view shows: the state and attributes of each entity, each
ha_write_config_filewrite actionWrite a file under Home Assistant's config directory. Defaults to UTF-8 text; pass
nodered_create_flowwrite actionAdd 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.
nodered_delete_flowwrite actionDelete 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.
nodered_get_flowGet 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.
nodered_get_flowsGet 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.
nodered_list_nodesList 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.
nodered_set_flowsReplace 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 f
nodered_update_flowwrite actionReplace 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.
vome_health_checkStart a fresh Vome health check on this Home Assistant: after fixing findings, this is how the score
vome_health_reportVome's health score for this Home Assistant, out of 100, with everything its check found: each finding
vomehome_complete_onboardingFinish the outstanding setup-wizard steps on a VomeHome instance, so it opens on a
vomehome_create_guest_linkwrite actionCreate a non-admin (unless admin=true) Home Assistant user for this instance, plus a
vomehome_create_instancewrite actionCreate 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 bec
vomehome_get_instanceGet one VomeHome instance by id, including live status and the Home Assistant URL. Requires VOMEHOME_TOKEN.
vomehome_get_login_urlGet 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.
vomehome_get_onboardingWhich Home Assistant setup-wizard steps are still outstanding on a VomeHome instance.
vomehome_list_guest_linksList guest links created for this instance, including already-revoked ones (with
vomehome_list_instancesList the Home Assistant instances on your VomeHome account, with status, tier, HA URL and (where available) live health. Requires VOMEHOME_TOKEN.
vomehome_reboot_instanceReboot 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.
vomehome_use_instanceSwitch 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 mo
Public scan report
scanner v0.1.10 · 2026-10-14 · same rubric, same numbers if you re-run it
- Code scan105 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitystatic API keys via environment variables6/15
- Maintenancelast push 0 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Home Assistant compares
Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 83/100
- higher than 65% of 48,273 servers
- Tools
- 100
- the typical server has 7
- Tools that change things
- 28%
- typical: 0%. Fewer write tools means less an agent can break
- Downloads a week
- 114
- more than 66% of 11,915 servers with a package
What its tools let an agent do: 72 read · 28 change
Release history: 2 versions in the registry since 2026-10-04, latest 2026-10-14, typically one every 10 days.
Install Home Assistant in Claude Code, Cursor or VS Code
Runs npx -y @vortitron/home-assistant-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add home-assistant-mcp -- npx -y @vortitron/home-assistant-mcp
What the publisher says
From the Home Assistant repository's README, as published. We do not edit it. Read it on GitHub
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:
history and the logbook.
- See — list entities/areas/devices, read exact states and attributes, pull
read the error log.
- Experiment — render Jinja templates against live state, check configuration,
ESPHome) edit, validate, compile and flash device firmware.
- Change — call services, create/update/delete/trigger automations, and (for
All write operations are off by default and gated behind an explicit safety policy (see Safety).
Tools
Home Assistant — read
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Home Assistant: common questions
- Is Home Assistant MCP server safe?
- Mostly: it is graded B (83/100). Read the Home Assistant safety report
- How do I install Home Assistant?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Home Assistant need an API key?
- Yes. The registry entry asks for
HA_TOKEN,VOMEHOME_TOKEN. - Is Home Assistant maintained?
- The last commit was 19 days ago (2026-10-14). The latest release is v0.11.0.
- What can I use instead of Home Assistant?
- Servers from other publishers that do the same job: Concord MCP server.
- How does Home Assistant compare with other MCP servers?
- safety score 83/100 (higher than 65% of 48,273 servers); tools 100 (the typical server has 7); tools that change things 28% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Home Assistant
Same job from other publishers: the closest match first, then the best rated.
- Concord MCPCross-harness communication and shared work-state for AI coding agents.not reviewedEstablishedA