ha-automation-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HA_URL | Yes | Base URL, e.g. http://homeassistant.local:8123 | |
| HA_TOKEN | Yes | Long-lived access token of an administrator, used for every call |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_automationsA | List every automation known to Home Assistant. Returns the entity_id, slug id, friendly name, current state, and last trigger timestamp for each automation (as reported by the state machine). |
| get_automationA | Get a single automation by id (e.g. 'solaredge_power_notify'). Returns live state + attributes. Use |
| get_automation_yamlA | Return raw YAML config from automations.yaml. Pass |
| create_or_update_automationB | Create or update an automation (written to automations.yaml + reloaded). Args: id: Stable slug (no 'automation.' prefix), e.g. 'living_room_lights_on'. name: Friendly name shown in the UI. trigger: List of HA trigger dicts. action: List of HA action dicts. condition: Optional list of HA condition dicts. description: Free-form description. mode: HA mode — 'single', 'restart', 'queued', or 'parallel'. |
| delete_automationB | Delete an automation by id (removes it from automations.yaml). |
| trigger_automationA | Manually fire an automation's actions, bypassing triggers + conditions. Accepts either the slug ('my_auto') or the full entity_id ('automation.my_auto'). |
| list_areasA | List every area (room) defined in Home Assistant. |
| list_entitiesB | List Home Assistant entities with optional filters. Args: domain: Filter by domain, e.g. 'light', 'switch', 'sensor'. area: Filter by area name (case-insensitive), e.g. 'Woonkamer'. search: Substring match against entity_id or friendly name. |
| get_automation_api_logB | Return the Automation API log file (automation_api.log). Contains a record of every create/update/delete/trigger the integration has performed via REST, WebSocket, or service calls. |
| get_managed_packageB | Return the full managed package file as JSON (helpers, templates, etc.). |
| overwrite_managed_packageA | Overwrite the entire managed package file (expert / bulk migration use). Triggers homeassistant.reload_all afterwards. Prefer the targeted upsert_* tools for day-to-day changes. |
| upsert_helperA | Create or update a helper (reloads the domain automatically). Args: domain: One of input_boolean / input_datetime / input_number / input_select / input_text / input_button. helper_id: Slug used as the helper id, e.g. 'moestuin_startdatum'. config: Full YAML config dict for the helper. Examples: input_boolean → {"name": "...", "initial": true, "icon": "mdi:bell"} input_datetime → {"name": "...", "has_date": true, "has_time": false} input_number → {"name": "...", "min": 0, "max": 100, "step": 1} |
| delete_helperC | Delete a helper from the managed package and reload the domain. |
| list_helpersC | List helpers of the given domain in the managed package. |
| get_helperC | Return the config of a single helper in the managed package. |
| upsert_template_entityB | Create or update a template entity (reloads the template domain). Args: template_type: One of sensor / binary_sensor / switch / button / number / select. name: Display name; also the unique key used for upsert. config: Template config (e.g. {"state": "{{ ... }}", "unit_of_measurement": "d", "icon": "mdi:sprout", "unique_id": "...", ...}). |
| delete_template_entityB | Delete a template entity by type + name (reloads template domain). |
| list_template_entitiesC | List all template entities of the given type in the managed package. |
| get_template_entityC | Return the config of a single template entity by type + name. |
| upsert_history_stats_sensorA | Create or update a history_stats sensor entry. A HA restart is required for it to take effect (response includes restart_required=true). Example config: {"entity_id": "binary_sensor.moestuin_regent", "state": "on", "type": "time", "end": "{{ now() }}", "duration": {"hours": 2}} |
| delete_history_stats_sensorB | Delete a history_stats sensor (HA restart required). |
| list_history_stats_sensorsB | List all history_stats sensors in the managed package. |
| get_history_stats_sensorC | Return the config of a single history_stats sensor. |
| upsert_notify_groupA | Create or update a notify platform:group entry. After writing, HA must be restarted before Args:
name: Group name; service becomes |
| delete_notify_groupB | Delete a notify group (HA restart required). |
| list_notify_groupsA | List all notify groups in the managed package. |
| get_notify_groupC | Return the config of a single notify group. |
| reload_configA | Reload HA config. With no arguments → calls homeassistant.reload_all. With a list of domains → reloads each individually (input_boolean, input_datetime, template, automation, script, scene, ...). |
| restart_home_assistantA | Schedule a Home Assistant restart (fire-and-forget). Use after creating/updating/deleting notify groups or history_stats sensors, which have no reload service. |
| list_dashboardsA | List every Lovelace dashboard (url_path, title, mode, icon). |
| create_dashboardA | Create a new storage-mode Lovelace dashboard. The dashboard is immediately visible under Settings → Dashboards and at
Args: url_path: URL slug — e.g. 'moestuin' yields /lovelace-moestuin. title: Sidebar title. icon: MDI icon, e.g. 'mdi:sprout'. show_in_sidebar: Whether to show in the left sidebar. require_admin: Admin‑only access. |
| update_dashboard_metadataB | Update dashboard metadata (title, icon, show_in_sidebar, require_admin). Cannot modify the default/Overview dashboard's metadata. |
| delete_dashboardA | Delete a custom dashboard. The default Overview cannot be deleted. |
| get_dashboard_configB | Return the full Lovelace config of a dashboard. Structure: {"title": ..., "views": [{"title": ..., "cards": [...]}, ...]}. |
| set_dashboard_configA | Overwrite the entire Lovelace config of a dashboard.
|
| append_dashboard_viewC | Append a view to a dashboard. A view looks like:: {"title": "Moestuin", "path": "moestuin", "icon": "mdi:sprout", "cards": [ ... ]} |
| replace_dashboard_viewC | Replace the view at the given index. |
| delete_dashboard_viewC | Delete the view at the given index. |
| append_dashboard_cardC | Append a card to the given view.
|
| replace_dashboard_cardC | Replace a specific card within a view. |
| delete_dashboard_cardC | Delete a specific card from a view. |
| list_registry_entitiesB | List entries from HA's entity_registry with full details. Returns each entity with |
| get_registry_entityC | Get full registry details for a single entity_id. |
| update_registry_entityB | Mutate a registry entity. Supported keys in |
| delete_registry_entityA | Remove an entity from the registry. Active integrations may re-add
it on reload — use |
| list_devicesB | List devices from HA's device_registry. Each item has |
| get_deviceC | Get full registry details for a single device id. |
| update_deviceC | Mutate a device. Supported keys: |
| delete_deviceA | Remove a device from the registry. Cascades to all entities of that device. The owning integration may re-add it on next discovery. |
| list_config_entriesA | List installed integrations (config entries). Each item has |
| get_config_entryC | Get full details for a single config entry. |
| reload_config_entryB | Reload an integration without restarting HA. |
| disable_config_entryA | Soft-disable an integration (its devices/entities go unavailable but registry entries remain). |
| enable_config_entryC | Re-enable a previously disabled integration. |
| remove_config_entryA | Fully remove an integration. Cascades: all its devices and entities are removed from the registries. Irreversible — to restore, re-add the integration via Settings → Devices & services. |
| get_historyA | Fetch state-change history for one or more entities from HA's recorder. Default window: last 24 hours. Use this to diagnose flapping sensors (count of changes) or to inspect when an automation last ran. Args:
entity_id: A single entity id, or comma-separated list for multiple
(e.g. 'sensor.x,sensor.y').
hours: Window length in hours, ending at Returns: {start, end, counts: {entity_id: n}, items: {entity_id: [...]}}.
|
| get_stateC | Get the current state of any HA entity via the native REST API. |
| call_serviceC | Call any Home Assistant service via the native REST API. Example: domain='light', service='turn_on', data={'entity_id': 'light.kitchen', 'brightness': 200}. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 58 tools
Tools are largely grouped into clear CRUD families by resource (automations, helpers, dashboards, registry, etc.), but some overlaps exist: list_entities vs list_registry_entities, get_state vs get_history, and multiple upsert_* families can be confused without consulting descriptions. Descriptions help distinguish intent, so an agent can usually pick correctly.
Names are predominantly snake_case with a verb_noun pattern (list_*, get_*, delete_*, etc.), making the set readable. However, there is an inconsistent mix of create_or_update_automation versus the upsert_* convention used for other resources, plus varied verbs like set, append, replace, and overwrite.
With 58 tools, the server far exceeds the recommended 3–15 range and spans many disparate Home Assistant admin domains beyond automations (dashboards, registry, devices, config entries). The large number of CRUD groups multiplies the surface and makes the server heavy and harder to navigate.
The tool surface thoroughly covers automations, helpers, template entities, notify groups, history stats sensors, dashboards (down to view/card level), registry entities, devices, and config entries. Gaps remain for script and scene management, and there is no area creation/deletion, but core automation workflows are complete.