homeassistant-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOMEASSISTANT_URL | Yes | Base URL of your Home Assistant instance, e.g. http://homeassistant.local:8123. Use http:// and the port the instance runs on (8123 unless changed; 80 on Home Assistant OS). No trailing slash needed. The alias HA_URL is also accepted. | |
| HOMEASSISTANT_TOKEN | Yes | A Home Assistant long-lived access token (profile → Long-Lived Access Tokens → Create Token). The alias HA_TOKEN is also accepted. |
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": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ha_get_configA | Instance configuration: location, time zone, unit system, version, loaded components. Best first call to confirm the connection works. |
| ha_list_statesA | All entity states (entity_id, state, attributes). Args: domain (optional, e.g. "light"), limit (default 50), offset. Always pass a domain on a real install — the full list is huge. |
| ha_get_stateB | Current state and attributes of a single entity. Args: entityId (e.g. sensor.kitchen_temperature). |
| ha_list_servicesA | Services that can be called. Without domain: domain -> [service names] map (small). With domain: full definitions for that domain, including the fields each service accepts. Use this before ha_call_service when unsure about a service name or its data fields. |
| ha_get_historyA | State changes for one or more entities. Args: entityIds (required), start (default: 1 day ago), end, minimalResponse (default true — only state + last_changed, much smaller), noAttributes. Returns: one array per entity. Requires the recorder integration. |
| ha_get_logbookA | Human-readable history entries ("Light turned on by automation"). Args: start (default: 1 day ago), entity (optional), end. Returns entries with when, name, message, entity_id. |
| ha_get_error_logA | Errors logged during the current Home Assistant session, as plain text. Useful when something misbehaves. |
| ha_render_templateA | Render a Home Assistant Jinja2 template server-side. Args: template, variables (optional). The cheapest way to read or compute many values at once, e.g. "{{ states('sensor.kitchen_temperature') }}" or "{% for s in states.light %}{{ s.entity_id }}: {{ s.state }}\n{% endfor %}". Returns: the rendered string. |
| ha_list_calendarsB | Calendar entities available in this instance. Args: none. Returns entity_id and name. |
| ha_get_calendar_eventsC | Events of one calendar between two timestamps. Args: entityId (required), start, end (both required). |
| ha_call_serviceA | Control Home Assistant: run a service in a domain. POST /api/services/{domain}/{service}. Args: domain (e.g. "light"), service (e.g. "turn_on"), data (service payload — usually {"entity_id": "..."}); extra keys go in data, e.g. {"entity_id":"light.study","brightness_pct":40}. Common: light.turn_on/turn_off/toggle, switch.toggle, cover.open_cover/close_cover/set_cover_position, climate.set_temperature/set_hvac_mode, media_player.media_play_pause/volume_set, fan.turn_on, lock.lock/unlock, vacuum.start, script.turn_on, automation.trigger, scene.turn_on, notify.send_message, homeassistant.turn_off (whole domain or entity). Returns: the states that changed while the service ran, plus the service response when the service supports it. |
| ha_fire_eventB | Fire a custom event on the event bus (automations can listen for it). Args: eventType, eventData. Args: eventType (e.g. "my_custom_event"), eventData (optional JSON object). |
| ha_set_stateA | Overwrite an entity's state and attributes. This only changes the representation inside Home Assistant — it does NOT talk to the physical device. To control a device, use ha_call_service instead. Args: entityId (required), state (required), attributes (optional). Creates the entity when it does not exist yet. |
| ha_delete_stateA | Remove an entity created through ha_set_state. Irreversible: the entity and its attributes are gone. Args: entityId. Only works on entities that are not backed by an integration. |
| ha_call_apiA | Call any REST endpoint under /api for cases without a dedicated tool, e.g. GET /api/components, GET /api/events, POST /api/config/core/check_config, GET /api/calendars/... . Args: method (GET|POST|DELETE), path (must start with /api and may include a query string), body (optional JSON). Prefer the dedicated tools when one exists; this one cannot bypass their guards. |
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 15 tools
Each tool targets a clearly distinct resource or action, and the descriptions explicitly distinguish similar tools such as ha_set_state vs ha_call_service and ha_get_history vs ha_get_logbook. ha_call_api is also clearly positioned as a fallback rather than an overlapping alternative.
All tools use a consistent ha_ prefix followed by snake_case verb_noun naming (e.g. ha_get_state, ha_list_services, ha_call_service, ha_delete_state). The naming convention is predictable throughout the set.
Fifteen tools is well scoped for a Home Assistant API client, covering core read, control, and fallback operations without excessive fragmentation. Each tool has a clear purpose and earns its place.
The set covers essential Home Assistant workflows: configuration, states, services, history, logbook, templates, calendars, events, and direct state manipulation. Some dedicated management operations (e.g. automations, scripts, deeper config flows) are not surfaced directly, though ha_call_api provides a workaround.