Call Service
ha_call_serviceRun any Home Assistant service or WebSocket command not covered by a dedicated tool. Use for services like light.turn_on or climate.set_temperature, with domain, service, and data.
Instructions
Call any Home Assistant service or one-shot WebSocket command: the catch-all escape hatch.
When NOT to use: a dedicated tool that covers the job. It validates the request, reports the outcome in its own terms, and stays available where a security policy gates this tool. For example: turn an automation on or off or run it now with ha_config_set_automation (enabled / run_actions); start or stop a script with ha_config_set_script (run); activate a scene with ha_config_set_scene (activate); manage apps (add-ons) with ha_manage_app; handle updates and Repairs issues with ha_manage_updates; set an integration's log level with ha_set_integration (log_level).
When to use: a service no dedicated tool covers. Services follow the pattern domain.service (e.g., light.turn_on, climate.set_temperature); ha_list_services lists them with their fields.
EXAMPLES:
ha_call_service("light", "turn_on", entity_id="light.living_room")
ha_call_service("climate", "set_temperature", entity_id="climate.thermostat", data={"temperature": 22})
Result compaction (default ON): result is trimmed to the targeted
entity's record (drops parent-group propagation) and stripped of
context / last_* metadata and heavy attribute lists
(effect_list, hue_scenes).
For detailed service documentation, use ha_get_skill_guide.
WebSocket command escape hatch (advanced):
Some Home Assistant operations are WebSocket-only commands, not
registered services. Pass ws_command (instead of domain/service) to
send one no dedicated tool covers, with its parameters in data:
ha_call_service(ws_command="", data={...}). Only one-shot
request/response commands are supported, and the other service
parameters (entity_id, return_response, etc.) don't apply.
Unavailable in Read Only Mode, including read-like services and WebSocket commands. Use dedicated read tools while that mode is enabled.
If a Claude Desktop user gets a 4-minute timeout with no result on this call, read the target back before repeating it, and tell them to wait a few seconds before clicking the manual-approve button, as clicking it too quickly is known to cause hangs in Claude Desktop. This workaround is specific to Claude Desktop.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "ha_call_service"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Extra service-call parameters beyond entity_id (e.g. {'temperature': 22} for climate.set_temperature). Also carries the raw command payload when ws_command is set. If entity_id is also present in data, the entity_id parameter wins. | |
| wait | No | If True (default), wait for the entity state to change before returning. Applies only to state-changing services called with a single entity_id. A comma-separated multi-target does not get confirmed by this: it falls through to a legacy path that polls for the literal composite entity_id and times out after 10s. Set wait=False for multi-target calls. | |
| domain | No | Service domain (e.g. 'light', 'climate', 'automation'). Required for a service call. | |
| service | No | Service name within domain (e.g. 'turn_on', 'set_temperature', 'trigger'). Required for a service call. | |
| verbose | No | Return HA's raw changed-state records unchanged. With return_response=True the response data still surfaces once as the top-level service_response key, never nested in result. Large for nested-group targets — prefer result_fields / result_attribute_keys. | |
| entity_id | No | Entity ID(s) the service call targets — one ID ('light.living_room') or several comma-separated ('light.a,light.b'). Optional for services that don't target a specific entity. | |
| ws_command | No | Advanced escape hatch: send a raw one-shot Home Assistant WebSocket command that is NOT a registered service and that no dedicated tool covers. When set, omit domain/service and the other service params. Streaming/two-phase and service-invoking commands (call_service, execute_script) are rejected. | |
| result_fields | No | Project each record in 'result' to only these top-level keys (e.g. ['entity_id', 'state']). Setting this DISABLES default compaction — no entity-id filter, no metadata strip — and applies the explicit projection instead. | |
| return_response | No | If True, the service's response data is returned once, as the top-level 'service_response' key — never nested inside 'result'. | |
| result_attribute_keys | No | Project each record's 'attributes' dict to only these keys (e.g. ['brightness', 'rgb_color']). Setting this DISABLES default compaction. Requires 'attributes' to be present in result_fields (or result_fields=None). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||