deConz MCP Server
Allows control of Zigbee lights, sensors, groups, scenes, rules, and schedules through a deCONZ gateway.
deConz MCP Server
An MCP (Model Context Protocol) server that exposes the deCONZ REST API to AI assistants. Control Zigbee lights, sensors, groups, scenes, rules, and schedules through natural language.
Supports stdio, SSE, and Streamable HTTP transports. HTTP transports are protected by a configurable bearer token.
Requirements
Python ≥ 3.10
uv (recommended) or pip
A running deCONZ / Phoscon gateway with a ConBee or RaspBee adapter
A valid deCONZ REST API key (see Obtaining an API key)
Related MCP server: Homey-Wan-Kenobi-MCP
Installation
# Clone the repository
git clone https://github.com/marcinn2/deconz-mcp.git
cd deconz-mcp
# Install with uv (creates an isolated virtual environment)
uv sync
# Or install with pip into your environment
pip install -e .Obtaining an API key
Open the Phoscon App in your browser (usually
http://<gateway-ip>/pwa).Go to Menu → Settings → Gateway → Advanced.
Click Authenticate app — this opens the network for 60 seconds.
Within those 60 seconds, run:
curl -s -X POST http://<gateway-ip>/api \
-H "Content-Type: application/json" \
-d '{"devicetype": "deconz-mcp"}'The response contains your API key:
[{"success": {"username": "YOUR-API-KEY-HERE"}}]Store it as DECONZ_API_KEY.
Quick start
stdio (Claude Desktop)
DECONZ_HOST=192.168.1.10 DECONZ_API_KEY=abc123def deconz-mcpStreamable HTTP with bearer auth
DECONZ_HOST=192.168.1.10 \
DECONZ_API_KEY=abc123def \
MCP_AUTH_TOKEN=my-mcp-secret \
deconz-mcp --transport streamable-http --host 0.0.0.0 --port 8080Combined SSE + Streamable HTTP
DECONZ_HOST=192.168.1.10 \
DECONZ_API_KEY=abc123def \
MCP_AUTH_TOKEN=my-mcp-secret \
deconz-mcp --transport server --host 0.0.0.0 --port 8080Environment variables
Variable | Required | Default | Description |
| Yes* | — | IP or hostname of the deCONZ gateway |
| No |
| HTTP port of the deCONZ gateway |
| Yes* | — | deCONZ REST API key |
| No |
| Set |
| No |
|
|
| No | see‡ | Set |
| No† | — | Bearer token clients must send to this MCP server |
| No |
| Public base URL (used as OAuth issuer URL) |
* Not required when using stdio and calling configure_deconz at runtime.
† Strongly recommended for HTTP transports exposed beyond localhost.
‡ Defaults to enabled only when DECONZ_HOST / DECONZ_API_KEY are absent. Once the gateway
is configured from the environment, the tool is withheld so that a client cannot repoint this
server at another host.
CLI reference
usage: deconz-mcp [--transport {stdio,sse,streamable-http,server}]
[--host HOST] [--port PORT]
[--log-level {DEBUG,INFO,WARNING,ERROR}]
[--auth-token TOKEN] [--base-url URL]Flag | Default | Description |
|
| Transport mode |
|
| Bind address (HTTP transports) |
|
| Listen port (HTTP transports) |
|
| Logging verbosity |
|
| MCP bearer token |
|
| OAuth issuer URL |
Transport modes
Mode | Endpoint(s) | Description |
| stdin/stdout | Pipe-based — for Claude Desktop and local use |
|
| Legacy SSE (MCP pre-2025-03-26) |
|
| Modern Streamable HTTP (MCP 2025-03-26) |
| all of the above | SSE + Streamable HTTP on one port |
Authentication
deCONZ API key
The deCONZ REST API key is a gateway credential that travels as part of the URL path (/api/<apikey>/...). It is configured server-side via DECONZ_API_KEY and is never exposed to MCP clients: request URLs are kept out of tool errors, and the HTTP client's request logging is silenced because it would otherwise write the key to stderr on every call.
Resource IDs supplied by a client (light, group, scene, sensor, rule, schedule, and Touchlink IDs) are validated before they are placed in a request path, so a crafted ID cannot escape its resource and reach, for example, the gateway's configuration or its list of API keys.
MCP bearer token
The MCP_AUTH_TOKEN / --auth-token option protects the MCP server itself. Every HTTP request from an MCP client must include:
Authorization: Bearer <token>The token is verified with a constant-time comparison to prevent timing attacks. When running over localhost only (default bind 127.0.0.1), bearer auth is optional but recommended.
Tools
Connection / configuration
Tool | Description |
| Point the server at a deCONZ gateway at runtime (host, port, API key). Registered only when the gateway is not configured from the environment, or when |
| Read gateway name, firmware, Zigbee channel, IP, WebSocket port |
| Open the Zigbee network for new device pairing (0–255 seconds) |
Lights
Tool | Description |
| List all lights with on/off, brightness, and reachability |
| Full JSON details for a single light |
| Control power, brightness, hue, saturation, colour temp, xy, effect, alert |
| Rename a light |
| Remove a light from the gateway |
Groups
Tool | Description |
| List all groups with member count and action state |
| Full JSON details for a single group |
| Create a new group (optionally pre-populate with lights) |
| Control all lights in a group simultaneously |
| Rename a group or change its member lights |
| Delete a group (lights remain) |
Scenes
Tool | Description |
| List all scenes for a group |
| Full JSON details for a scene |
| Create a scene (captures current group state) |
| Activate a scene |
| Overwrite a scene with the current group state |
| Rename a scene |
| Delete a scene |
Sensors
Tool | Description |
| List all sensors with latest readings and battery levels |
| Full JSON details for a single sensor |
| Rename a sensor |
| Update sensor config (enabled, battery level, sensitivity) |
| Remove a sensor from the gateway |
Rules (automations)
Tool | Description |
| List all automation rules with status and trigger counts |
| Full JSON details (conditions + actions) for a rule |
| Create a new rule with conditions and actions |
| Enable or disable a rule |
| Delete a rule |
Schedules
Tool | Description |
| List all timed schedules |
| Full JSON details for a schedule |
| Create a new schedule with ISO 8601 time expression |
| Enable or disable a schedule |
| Delete a schedule |
Touchlink
Tool | Description |
| Start a Touchlink scan (~10 s) to find nearby Zigbee devices |
| Return results from the last Touchlink scan |
| Make a Touchlink device blink for identification |
| Factory-reset a Touchlink device |
Resources
Resources are read-only, cacheable snapshots that MCP clients can fetch without issuing tool calls.
URI | Description |
| Gateway configuration JSON |
| All lights with state JSON |
| All groups with action state JSON |
| All sensors with state JSON |
| All automation rules JSON |
| All schedules JSON |
| Complete gateway state (all resources combined) |
Prompts
Prompts are pre-built conversation starters that guide the AI through common workflows.
Prompt | Arguments | Description |
| — | Full status report: all lights, sensors, reachability, anomalies |
|
| Turn lights on/off, set brightness or colour |
|
| Create, recall, update, or delete scenes |
| — | Step-by-step guide to pair a new Zigbee device |
| — | Create a rule triggered by a sensor event |
|
| Diagnose unreachable or misbehaving devices |
|
| Activate an evening scene and schedule lights off |
Claude Desktop configuration
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"deconz": {
"command": "deconz-mcp",
"env": {
"DECONZ_HOST": "192.168.1.10",
"DECONZ_API_KEY": "your-api-key-here"
}
}
}
}Or if installed in a virtual environment:
{
"mcpServers": {
"deconz": {
"command": "/path/to/deconz-mcp/.venv/bin/deconz-mcp",
"env": {
"DECONZ_HOST": "192.168.1.10",
"DECONZ_API_KEY": "your-api-key-here"
}
}
}
}HTTP client configuration
For Streamable HTTP transport:
{
"mcpServers": {
"deconz": {
"url": "http://localhost:8080/mcp",
"headers": {
"Authorization": "Bearer my-mcp-secret"
}
}
}
}For legacy SSE transport:
{
"mcpServers": {
"deconz": {
"url": "http://localhost:8080/sse",
"headers": {
"Authorization": "Bearer my-mcp-secret"
}
}
}
}Docker
A multi-platform image (linux/amd64 + linux/arm64) is published to GitHub Container Registry by the release workflow whenever a version tag is pushed:
ghcr.io/marcinn2/deconz-mcp:latest
ghcr.io/marcinn2/deconz-mcp:0.2
ghcr.io/marcinn2/deconz-mcp:0.2.1A multi-stage Dockerfile is also included if you prefer to build locally. The builder stage uses the official uv image to install dependencies and compile the package as a wheel; the runtime stage is python:3.14-slim and runs as the unprivileged user app (uid 1000).
Pull
docker pull ghcr.io/marcinn2/deconz-mcp:latestBuild locally
# Single-platform (current machine)
docker build -t deconz-mcp:latest .
# Multi-platform push (requires a buildx builder with multi-platform support).
# Releases do this automatically; this is for pushing to another registry by hand.
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag registry.mne.pl/deconz-mcp:latest \
--tag registry.mne.pl/deconz-mcp:0.2.1 \
--push .Run — HTTP server (SSE + Streamable HTTP)
docker run -p 8000:8000 \
-e DECONZ_HOST=192.168.1.10 \
-e DECONZ_API_KEY=abc123def \
-e MCP_AUTH_TOKEN=my-mcp-secret \
ghcr.io/marcinn2/deconz-mcp:latestRun — stdio
docker run -i \
-e DECONZ_HOST=192.168.1.10 \
-e DECONZ_API_KEY=abc123def \
ghcr.io/marcinn2/deconz-mcp:latest --transport stdioDocker Compose
A ready-to-use Compose file is in docs/docker-compose.yml. It defines two services:
Service | Transport | Started by default |
|
| Yes |
|
| No — requires |
# Copy and edit the environment file
cp .env.example .env # set DECONZ_HOST, DECONZ_API_KEY, MCP_AUTH_TOKEN
# Start the HTTP server (--env-file is required: the compose file lives in docs/,
# so a repository-root .env is not picked up automatically)
docker compose --env-file .env -f docs/docker-compose.yml up
# Run a one-shot stdio session
docker compose --env-file .env -f docs/docker-compose.yml --profile stdio run --rm deconz-mcp-stdioUse the stdio service in Claude Desktop:
{
"mcpServers": {
"deconz": {
"command": "docker",
"args": ["compose", "-f", "/path/to/docs/docker-compose.yml",
"--profile", "stdio", "run", "--rm", "deconz-mcp-stdio"],
"env": {
"DECONZ_HOST": "192.168.1.10",
"DECONZ_API_KEY": "your-api-key-here"
}
}
}
}Kubernetes
The manifest at docs/k8s-deployment.yaml contains all resources needed to run the server in a cluster:
Resource | Purpose |
|
|
|
|
|
|
| 1 replica, non-root, read-only root FS, resource limits |
|
|
| Commented-out template for nginx / cert-manager |
Deploy
# 1. Encode your secrets
echo -n 'your-api-key' | base64 # → paste into Secret.DECONZ_API_KEY
echo -n 'your-mcp-token' | base64 # → paste into Secret.MCP_AUTH_TOKEN
# 2. Edit the ConfigMap (DECONZ_HOST, MCP_BASE_URL) in docs/k8s-deployment.yaml
# 3. Apply
kubectl apply -f docs/k8s-deployment.yaml
# 4. Verify
kubectl -n deconz-mcp get pods
kubectl -n deconz-mcp logs -f deploy/deconz-mcpHealth check
kubectl -n deconz-mcp port-forward svc/deconz-mcp 8000:80
curl http://localhost:8000/health
# {"status": "ok", "deconz_configured": true}The Deployment configures both a liveness probe and a readiness probe against /health, so Kubernetes automatically restarts the pod if the server becomes unresponsive.
Ingress (optional)
Uncomment the Ingress section at the bottom of docs/k8s-deployment.yaml and set your hostname. Do not add a rewrite-target annotation: the endpoints live at /mcp, /sse and /messages/ and must reach the pod with their paths intact. TLS termination happens at the ingress controller; the pod always speaks plain HTTP internally.
Health check
HTTP transports expose a liveness probe:
curl http://localhost:8080/health
# {"status": "ok", "deconz_configured": true}Project structure
deConz-mcp/
├── Dockerfile # Multi-stage image build (runs as uid 1000)
├── pyproject.toml # Package metadata and dependencies
├── uv.lock # Locked dependency versions (committed)
├── .env.example # Template for docker compose
├── README.md
├── docs/
│ ├── docker-compose.yml # Compose services (HTTP + stdio)
│ └── k8s-deployment.yaml # Kubernetes: Namespace, Secret, ConfigMap,
│ # Deployment, Service, Ingress (template)
├── tests/
│ └── test_smoke.py # Client, credential-handling and MCP surface tests
└── src/
└── deconz_mcp/
├── __init__.py
├── __main__.py # CLI entrypoint and transport wiring
├── client.py # Async deCONZ REST API HTTP client
└── server.py # FastMCP server: tools, resources, promptsdeCONZ API overview
The server covers these API categories:
Category | Endpoints |
Config |
|
Lights |
|
Groups |
|
Scenes | Full CRUD under |
Sensors |
|
Rules | Full CRUD under |
Schedules | Full CRUD under |
Touchlink |
|
For the full API reference, see the deCONZ REST API documentation.
Data & Privacy
Preliminary assessment only — not legal advice. See full notes below.
Personal home use
When this server runs in a private household and is accessed only by the residents, processing of smart-home device data is likely covered by the household exemption (GDPR Recital 18). In that scenario the GDPR does not apply and no additional compliance steps are required.
Commercial or shared deployments
Deploying this server in offices, rental properties, hotels, co-working spaces, or any environment where you process data on behalf of other people takes you outside the household exemption. In those cases:
Presence and motion sensor data constitutes personal behavioral data (Art. 4(1) GDPR). Establish a documented lawful basis (Art. 6) before processing it.
Conduct a Data Protection Impact Assessment (Art. 35) if the deployment involves systematic monitoring of occupants on a large scale.
Provide a privacy notice to data subjects describing what is collected, for how long, and under what legal basis.
Security recommendations
Risk | Recommendation |
API key travels in URL paths, so the gateway's own access logs record it | Rotate the deCONZ API key periodically; restrict access to gateway logs. This server keeps the key out of its own logs and out of the errors it returns to clients |
Unencrypted transport | Enable TLS for any network-facing deployment ( |
MCP endpoint publicly accessible | Always set |
What this software does NOT do
No data is sent to third parties, analytics services, or cloud providers.
No telemetry, tracking pixels, or consent libraries are present in this codebase.
All communication stays between the MCP client, this server, and the local deCONZ gateway.
Legal notice
This GDPR assessment was generated as a preliminary, exploratory evaluation. It does not constitute legal advice and does not replace a legal audit. For binding guidance, consult a qualified data protection lawyer in your jurisdiction.
Releasing
Releases are cut by pushing a version tag. .github/workflows/release.yml then:
Checks that the tag matches the
versioninpyproject.tomland fails early if it does not.Runs the full CI workflow (lint, format, type-check, tests on Python 3.10–3.12).
Builds the image for linux/amd64 and linux/arm64, with an SBOM and build provenance, and pushes it to
ghcr.io/marcinn2/deconz-mcp.Creates the GitHub release with generated notes, the image digest, and the built wheel and sdist attached.
# bump version = "0.3.0" in pyproject.toml first, then:
git tag -a v0.3.0 -m "v0.3.0"
git push origin v0.3.0A tag containing a hyphen, such as v0.3.0-rc.1, is published as a pre-release and does not move the latest image tag.
Image tags produced for v0.3.0: 0.3.0, 0.3, and latest.
No secrets need to be configured: the workflow authenticates to GHCR with the built-in GITHUB_TOKEN. After the first release, set the package visibility under Packages → deconz-mcp → Package settings if the image should be pullable anonymously.
License
Apache 2.0 — see LICENSE.
Disclaimer
This software is not affiliated with or endorsed by Dresden Elektronik. Use at your own risk. It does not come with any warranty of any kind. There is no liability for the developer. This software is a personal project that I maintain in my free time. Refer to the licence for more information.
Available Tools
39 toolscreate_groupA
Create a new light group.
Args: name: Display name for the group. light_ids: Optional list of light IDs to add initially (e.g. ["1", "3", "5"]).
Inputs: name (required), light_ids. Returns: result
create_ruleA
Create an automation rule triggered by sensor conditions.
Args: name: Rule display name. conditions: List of condition objects, e.g.: [{"address": "/sensors/1/state/buttonevent", "operator": "eq", "value": "1002"}] actions: List of action objects, e.g.: [{"address": "/groups/1/action", "method": "PUT", "body": {"on": true}}] status: "enabled" or "disabled".
Condition operators: eq, gt, lt, dx (changed), ddx (stable for duration), stable, not stable.
Inputs: name (required), actions (required), conditions (required), status. Returns: result
create_sceneC
Create a new scene that captures the current state of all lights in the group.
Args: group_id: Numeric group ID. name: Display name for the scene.
Inputs: name (required), group_id (required). Returns: result
create_scheduleA
Create a timed schedule that sends a command to the gateway.
Args: name: Schedule display name. time: ISO 8601 time expression. Examples: "2025-12-31T23:00:00" — absolute UTC datetime "W127/T08:00:00" — weekly (Mon+Tue+Wed, 08:00) "PT01:00:00" — timer (1 hour from now) "R/PT01:00:00" — recurring timer every hour command_address: API path the schedule calls, e.g. "/api//groups/1/action". command_method: HTTP method: "PUT", "POST", or "DELETE". command_body: JSON body for the command, e.g. {"on": true}. description: Optional human-readable description. status: "enabled" or "disabled". autodelete: If true, the schedule is deleted after it fires once.
Inputs: name (required), time (required), command_body (required), command_method (required), +4 more. Returns: result
delete_groupA
Delete a light group (lights remain, only the group is removed).
Args: group_id: Numeric group ID to delete.
Inputs: group_id (required). Returns: result
delete_lightB
Remove a light from the gateway.
Args: light_id: Numeric light ID to remove.
Inputs: light_id (required). Returns: result
delete_ruleA
Delete an automation rule.
Args: rule_id: Numeric rule ID to delete.
Inputs: rule_id (required). Returns: result
delete_sceneC
Delete a scene.
Args: group_id: Numeric group ID. scene_id: Scene ID to delete.
Inputs: group_id (required), scene_id (required). Returns: result
delete_scheduleC
Delete a schedule.
Args: schedule_id: Numeric schedule ID to delete.
Inputs: schedule_id (required). Returns: result
delete_sensorA
Remove a sensor from the gateway.
Args: sensor_id: Numeric sensor ID to remove.
Inputs: sensor_id (required). Returns: result
get_gateway_configA
Return the deCONZ gateway configuration (firmware, network, Zigbee channel, etc.).
Inputs: no named parameters. Returns: result
get_groupA
Get full details of a light group including member lights and scenes.
Args: group_id: Numeric group ID (use list_groups to discover IDs).
Inputs: group_id (required). Returns: result
get_lightA
Get full details of a specific light including state, attributes, and capabilities.
Args: light_id: Numeric light ID (use list_lights to discover IDs).
Inputs: light_id (required). Returns: result
get_ruleA
Get full details of an automation rule including conditions and actions.
Args: rule_id: Numeric rule ID (use list_rules to discover IDs).
Inputs: rule_id (required). Returns: result
get_sceneB
Get details of a specific scene.
Args: group_id: Numeric group ID. scene_id: Scene ID (use list_scenes to discover IDs).
Inputs: group_id (required), scene_id (required). Returns: result
get_scheduleA
Get full details of a schedule including its command and timing.
Args: schedule_id: Numeric schedule ID (use list_schedules to discover IDs).
Inputs: schedule_id (required). Returns: result
get_sensorA
Get full details of a specific sensor including state, config, and capabilities.
Args: sensor_id: Numeric sensor ID (use list_sensors to discover IDs).
Inputs: sensor_id (required). Returns: result
get_touchlink_resultsA
Return results from the last Touchlink scan.
Inputs: no named parameters. Returns: result
list_groupsA
List all light groups with their current action state.
Inputs: no named parameters. Returns: result
list_lightsA
List all lights known to the deCONZ gateway with their current state.
Inputs: no named parameters. Returns: result
list_rulesA
List all automation rules with their status and trigger conditions.
Inputs: no named parameters. Returns: result
list_scenesA
List all scenes defined for a group.
Args: group_id: Numeric group ID (use list_groups to discover IDs).
Inputs: group_id (required). Returns: result
list_schedulesA
List all timed schedules with their next trigger time and status.
Inputs: no named parameters. Returns: result
list_sensorsA
List all sensors (temperature, humidity, presence, switches, etc.) with current state.
Inputs: no named parameters. Returns: result
modify_groupB
Rename a group or change its member lights.
Args: group_id: Numeric group ID. name: New display name. light_ids: Complete new list of light IDs for this group.
Inputs: group_id (required), name, light_ids. Returns: result
recall_sceneA
Activate (recall) a scene — all lights in the group transition to the saved state.
Args: group_id: Numeric group ID. scene_id: Scene ID to activate.
Inputs: group_id (required), scene_id (required). Returns: result
rename_lightA
Rename a light.
Args: light_id: Numeric light ID. name: New display name (max 32 characters).
Inputs: name (required), light_id (required). Returns: result
rename_sceneC
Rename a scene.
Args: group_id: Numeric group ID. scene_id: Scene ID to rename. name: New display name.
Inputs: name (required), group_id (required), scene_id (required). Returns: result
rename_sensorB
Rename a sensor.
Args: sensor_id: Numeric sensor ID. name: New display name.
Inputs: name (required), sensor_id (required). Returns: result
set_group_actionA
Control all lights in a group simultaneously.
Args: group_id: Numeric group ID. on: True to turn on, False to turn off. brightness: Brightness 1–254. hue: Hue 0–65535. saturation: Saturation 0–254. color_temp: Colour temperature in mireds (153–500). xy: CIE xy colour as [x, y]. transition_time: Transition duration in 1/10ths of a second. alert: "none", "select", or "lselect". effect: "none" or "colorloop". scene: Scene ID to recall (within this group).
Inputs: group_id (required), on, xy, hue, +7 more. Returns: result
set_light_stateA
Control a light's power, brightness, colour, or effect.
Args: light_id: Numeric light ID. on: True to turn on, False to turn off. brightness: Brightness 1–254 (only when on=true). hue: Hue 0–65535. saturation: Saturation 0–254. color_temp: Colour temperature in mireds (153–500; lower=cooler). xy: CIE xy colour as [x, y] (each 0.0–1.0). transition_time: Transition duration in 1/10ths of a second (default 4 = 0.4 s). alert: "none", "select" (single blink), or "lselect" (15-second blink cycle). effect: "none" or "colorloop".
Inputs: light_id (required), on, xy, hue, +6 more. Returns: result
set_permit_joinA
Open the Zigbee network so new devices can join.
Args: duration: Seconds to allow joining (0–255). Use 0 to close immediately. Default is 60 seconds.
Inputs: duration. Returns: result
set_rule_statusA
Enable or disable an automation rule.
Args: rule_id: Numeric rule ID. status: "enabled" or "disabled".
Inputs: status (required), rule_id (required). Returns: result
set_schedule_statusB
Enable or disable a schedule.
Args: schedule_id: Numeric schedule ID. status: "enabled" or "disabled".
Inputs: status (required), schedule_id (required). Returns: result
set_sensor_configA
Update a sensor's configuration.
Args: sensor_id: Numeric sensor ID. on: Enable or disable the sensor. reachable: Mark the sensor as reachable (admin override). battery: Battery level 0–100 (admin override for CLIP sensors). sensitivity: Motion sensitivity level (where supported).
Inputs: sensor_id (required), on, battery, reachable, +1 more. Returns: result
store_sceneA
Overwrite a scene with the current state of all lights in the group.
Args: group_id: Numeric group ID. scene_id: Scene ID to overwrite.
Inputs: group_id (required), scene_id (required). Returns: result
touchlink_identifyA
Make a Touchlink device blink to identify itself.
Args: touchlink_id: Device ID from get_touchlink_results.
Inputs: touchlink_id (required). Returns: result
touchlink_resetA
Factory-reset a Touchlink device (removes it from its current network).
Args: touchlink_id: Device ID from get_touchlink_results.
Warning: This resets the device to factory defaults and removes it from the gateway.
Inputs: touchlink_id (required). Returns: result
touchlink_scanA
Start a Touchlink scan to discover nearby Zigbee devices (takes ~10 seconds).
After scanning, call get_touchlink_results to see discovered devices.
Inputs: no named parameters. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 39 tools
Tools are mostly organized by resource and action, so purposes are generally clear. A few overlaps exist: set_group_action can recall a scene via its scene parameter, duplicating recall_scene, and create_scene versus store_scene both capture current group state.
The naming mostly follows a predictable list_/get_/create_/set_/rename_/delete_ pattern across resource types. Minor deviations like modify_group, store_scene, and recall_scene break the strict verb_noun convention but remain readable.
39 tools is a large surface and exceeds the 25+ threshold. The set could be consolidated into generic state/action endpoints or grouped more tightly without losing capability, though the organization by resource does provide some structure.
The set covers most lifecycle operations for lights, groups, sensors, scenes, rules, schedules, and touchlink discovery. Obvious gaps are limited to gateway configuration updates and some sensor/device creation paths, but common workflows can be completed.
Maintenance
Related MCP Connectors
MCP Server for an Agent Task Marketplace
MCP server for Translation Services
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Sinum smarthome system, enabling device and scene management, and light toggling via natural language.43MIT
- AlicenseAqualityDmaintenanceMCP server for controlling Homey Pro smart home systems, offering 60+ tools for device control, flow authoring, automation, monitoring, and network diagnostics.601MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that enables LLMs to list, inspect, and control Zigbee devices via the Zigbee2MQTT frontend websocket API, eliminating the need for direct MQTT broker access.4MIT
- AlicenseAqualityBmaintenanceMCP server for the entire Shelly smart-home ecosystem, enabling local-first control, automation, and energy monitoring of Shelly devices with cloud fallback.4737 PyPIMIT