shelly-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SHELLY_CLOUD_AUTH_KEY | No | Auth key for Shelly Cloud (optional, for cloud fallback) |
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
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| shelly_switch_setA | Turn a switch/relay channel on or off (optionally auto-revert after N seconds). Returns the post-action |
| shelly_switch_toggleB | Toggle a switch/relay channel. Returns the post-action |
| shelly_light_setA | Set a light/dimmer/RGB(W)/CCT channel (Gen1 /color,/light ↔ Gen2 Light/RGB/RGBW/CCT.Set). Only the provided fields are changed. |
| shelly_cover_moveA | Move a roller/cover: Returns the post-action |
| shelly_energy_liveA | Live power/energy per channel: power_w, voltage, current, pf, freq, totals.
|
| shelly_energy_historyB | Best-effort energy history: lifetime totals plus any per-minute series the device exposes in its status; notes when richer history needs a local connection. Detailed historical queries (Pro 3EM |
| shelly_rpcA | Call any read-only RPC method ( Mutating methods are refused here — use |
| shelly_rpc_writeA | Call any mutating RPC method. Requires Read methods are rejected (use |
| shelly_list_methodsA | List the RPC methods a device supports (Gen2+ Returns an actionable error on Gen1/cloud where the device can't enumerate methods. |
| shelly_kvs_listB | List KVS keys (with their etags). |
| shelly_kvs_getB | Get one KVS value (with its etag) by key. |
| shelly_kvs_setB | Set a KVS key to a JSON value. Audit-logged. |
| shelly_kvs_deleteA | Delete a KVS key. Requires |
| shelly_versionA | Return the shelly-mcp server version (health check). |
| shelly_discoverA | Discover Shelly devices on the LAN via mDNS, merged with the cloud account list.
|
| shelly_list_devicesA | List every Shelly device known to this server (configured + cloud account). Safe, read-only. Returns each device's canonical identity (id, name, generation, model, online state) — the starting point before any status or control call. |
| shelly_get_infoA | Identify one device (generation, model, firmware, online state, capabilities).
|
| shelly_get_statusA | Get a device's normalized live status (Gen1/Gen2/Cloud folded into one shape). Returns canonical channels/lights/covers plus the raw per-generation payload. Pass
|
| shelly_list_componentsA | List the component keys present on a device (e.g. ['switch:0', 'input:0']). Safe, read-only. Use this to discover what a specific device exposes before reading status or controlling it. |
| shelly_get_configA | Get a device's configuration, with credential fields masked as |
| shelly_scene_listA | List defined scenes (name, description, action count). Read-only. |
| shelly_scene_getB | Show a scene's full definition (its ordered actions). Read-only. |
| shelly_scene_createA | Define (save) a named scene from an ordered list of Every method must be a non-destructive mutating method; every device must be known.
Fails if the name already exists unless |
| shelly_scene_runA | Run a named scene: attempt every action in order, report per-action results. Best-effort and sequential — a failing action does not abort the rest. |
| shelly_scene_deleteA | Delete a named scene. Requires |
| shelly_schedule_listB | List the schedules configured on a device. Local-only (cloud can't manage schedules). |
| shelly_schedule_createA | Create a schedule:
|
| shelly_schedule_updateC | Update fields of an existing schedule by |
| shelly_schedule_deleteB | Delete a schedule by |
| shelly_script_listB | List scripts on a device (id, name, enable, running). Local-only. |
| shelly_script_get_codeA | Get a script's full source, reassembling the device's paginated |
| shelly_script_createA | Create an empty script (optionally named). Returns its Use |
| shelly_script_put_codeA | Upload code into a script (chunked). Arbitrary code on the device →
|
| shelly_script_startB | Start a script by |
| shelly_script_stopB | Stop a script by |
| shelly_script_evalA | Evaluate an expression inside a running script. Arbitrary code → Returns the stringified result. Audit-logged. |
| shelly_script_deleteA | Delete a script by |
| shelly_system_rebootB | Reboot a device. Requires |
| shelly_system_updateB | Trigger a firmware update ( |
| shelly_system_set_authA | Enable/rotate the device login password (≥12 chars). Requires The password is write-only — never returned, and redacted in the audit log. |
| shelly_virtual_listB | List the device's virtual (dynamic) components via |
| shelly_virtual_addA | Add a virtual component of Optional |
| shelly_virtual_deleteA | Delete a virtual component by |
| shelly_webhook_listB | List webhooks configured on a device. Local-only. |
| shelly_webhook_createB | Create a webhook: Optional |
| shelly_webhook_updateB | Update fields of an existing webhook by |
| shelly_webhook_deleteA | Delete a webhook by |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| shelly_evening_scene | Workflow: dim configured lights to warm-white and turn plugs off for the evening. |
| shelly_energy_report | Workflow: summarize today's power/energy across the fleet. |
| shelly_diagnose | Workflow: health-check every device (online, firmware, error fields). |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| devices_resource | The current device fleet (identities + online state) as ambient context. |
TDQS
Scored across 47 tools
Almost every tool has a distinct resource+action target, and descriptions sharply differentiate read vs. write (shelly_rpc vs shelly_rpc_write) and info vs. status vs. config. The only real overlap is shelly_list_devices vs shelly_discover (both enumerate devices), though the LAN-mDNS vs. known/cloud distinction is spelled out. Minor boundary blurring keeps it just under perfect.
Uniform shelly_ prefix and snake_case throughout, with domain-grouped names (scene_, schedule_, script_, kvs_, webhook_, virtual_) that are highly predictable. The one deviation is the control group using noun_verb (switch_set, light_set, cover_move) vs. verb_noun elsewhere (list_components, get_status), which is consistent within its group but not across the whole set.
47 tools is heavy (well above the ~15 ideal) and will burden selection, but the surface genuinely spans many independent subsystems — devices, KVS, scenes, schedules, scripts, webhooks, virtual components, energy, and system ops — each legitimately needing CRUD. It is large but not a mismatch the way a 50+ grab-bag would be.
Near-complete lifecycle coverage: CRUD for KVS, schedules, webhooks, scripts, and virtual components; create/run/delete for scenes (with overwrite covering update); device discovery, info, status, config, energy live+history, and system reboot/update/auth. The read/write RPC escape hatches (shelly_rpc, shelly_rpc_write) close any residual gaps, leaving no obvious dead ends.