Skip to main content
Glama

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

  1. Open the Phoscon App in your browser (usually http://<gateway-ip>/pwa).

  2. Go to Menu → Settings → Gateway → Advanced.

  3. Click Authenticate app — this opens the network for 60 seconds.

  4. 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-mcp

Streamable 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 8080

Combined 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 8080

Environment variables

Variable

Required

Default

Description

DECONZ_HOST

Yes*

—

IP or hostname of the deCONZ gateway

DECONZ_PORT

No

80

HTTP port of the deCONZ gateway

DECONZ_API_KEY

Yes*

—

deCONZ REST API key

DECONZ_TLS

No

false

Set true to use HTTPS

DECONZ_TLS_VERIFY

No

true

false accepts a self-signed gateway certificate; any other value is a path to a CA bundle

DECONZ_ALLOW_RUNTIME_CONFIG

No

see‡

Set true to expose configure_deconz even when the gateway comes from the environment

MCP_AUTH_TOKEN

No†

—

Bearer token clients must send to this MCP server

MCP_BASE_URL

No

http://<host>:<port>

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

stdio

Transport mode

--host

127.0.0.1

Bind address (HTTP transports)

--port

8000

Listen port (HTTP transports)

--log-level

INFO

Logging verbosity

--auth-token

$MCP_AUTH_TOKEN

MCP bearer token

--base-url

$MCP_BASE_URL

OAuth issuer URL

Transport modes

Mode

Endpoint(s)

Description

stdio

stdin/stdout

Pipe-based — for Claude Desktop and local use

sse

/sse, /messages/

Legacy SSE (MCP pre-2025-03-26)

streamable-http

/mcp

Modern Streamable HTTP (MCP 2025-03-26)

server

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

configure_deconz

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 DECONZ_ALLOW_RUNTIME_CONFIG=true

get_gateway_config

Read gateway name, firmware, Zigbee channel, IP, WebSocket port

set_permit_join

Open the Zigbee network for new device pairing (0–255 seconds)

Lights

Tool

Description

list_lights

List all lights with on/off, brightness, and reachability

get_light

Full JSON details for a single light

set_light_state

Control power, brightness, hue, saturation, colour temp, xy, effect, alert

rename_light

Rename a light

delete_light

Remove a light from the gateway

Groups

Tool

Description

list_groups

List all groups with member count and action state

get_group

Full JSON details for a single group

create_group

Create a new group (optionally pre-populate with lights)

set_group_action

Control all lights in a group simultaneously

modify_group

Rename a group or change its member lights

delete_group

Delete a group (lights remain)

Scenes

Tool

Description

list_scenes

List all scenes for a group

get_scene

Full JSON details for a scene

create_scene

Create a scene (captures current group state)

recall_scene

Activate a scene

store_scene

Overwrite a scene with the current group state

rename_scene

Rename a scene

delete_scene

Delete a scene

Sensors

Tool

Description

list_sensors

List all sensors with latest readings and battery levels

get_sensor

Full JSON details for a single sensor

rename_sensor

Rename a sensor

set_sensor_config

Update sensor config (enabled, battery level, sensitivity)

delete_sensor

Remove a sensor from the gateway

Rules (automations)

Tool

Description

list_rules

List all automation rules with status and trigger counts

get_rule

Full JSON details (conditions + actions) for a rule

create_rule

Create a new rule with conditions and actions

set_rule_status

Enable or disable a rule

delete_rule

Delete a rule

Schedules

Tool

Description

list_schedules

List all timed schedules

get_schedule

Full JSON details for a schedule

create_schedule

Create a new schedule with ISO 8601 time expression

set_schedule_status

Enable or disable a schedule

delete_schedule

Delete a schedule

Tool

Description

touchlink_scan

Start a Touchlink scan (~10 s) to find nearby Zigbee devices

get_touchlink_results

Return results from the last Touchlink scan

touchlink_identify

Make a Touchlink device blink for identification

touchlink_reset

Factory-reset a Touchlink device


Resources

Resources are read-only, cacheable snapshots that MCP clients can fetch without issuing tool calls.

URI

Description

deconz://config

Gateway configuration JSON

deconz://lights

All lights with state JSON

deconz://groups

All groups with action state JSON

deconz://sensors

All sensors with state JSON

deconz://rules

All automation rules JSON

deconz://schedules

All schedules JSON

deconz://state

Complete gateway state (all resources combined)


Prompts

Prompts are pre-built conversation starters that guide the AI through common workflows.

Prompt

Arguments

Description

home_overview

—

Full status report: all lights, sensors, reachability, anomalies

control_lights

room (optional)

Turn lights on/off, set brightness or colour

manage_scenes

group_id (optional)

Create, recall, update, or delete scenes

add_device

—

Step-by-step guide to pair a new Zigbee device

setup_automation

—

Create a rule triggered by a sensor event

diagnose_device

device_name (optional)

Diagnose unreachable or misbehaving devices

evening_routine

bedtime (default 23:00)

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.1

A 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:latest

Build 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:latest

Run — stdio

docker run -i \
  -e DECONZ_HOST=192.168.1.10 \
  -e DECONZ_API_KEY=abc123def \
  ghcr.io/marcinn2/deconz-mcp:latest --transport stdio

Docker Compose

A ready-to-use Compose file is in docs/docker-compose.yml. It defines two services:

Service

Transport

Started by default

deconz-mcp

server (SSE + Streamable HTTP) on port 8000

Yes

deconz-mcp-stdio

stdio

No — requires --profile stdio

# 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-stdio

Use 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

Namespace

deconz-mcp — isolates all resources

Secret

DECONZ_API_KEY and MCP_AUTH_TOKEN (base64-encoded)

ConfigMap

DECONZ_HOST, DECONZ_PORT, DECONZ_TLS, MCP_BASE_URL

Deployment

1 replica, non-root, read-only root FS, resource limits

Service

ClusterIP on port 80 → pod 8000

Ingress

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-mcp

Health 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, prompts

deCONZ API overview

The server covers these API categories:

Category

Endpoints

Config

GET /config, PUT /config (permit join)

Lights

GET /lights, GET /lights/<id>, PUT /lights/<id>/state, DELETE /lights/<id>

Groups

GET /groups, POST /groups, PUT /groups/<id>/action, DELETE /groups/<id>

Scenes

Full CRUD under /groups/<id>/scenes/<sid> incl. recall and store

Sensors

GET /sensors, PUT /sensors/<id>/config, DELETE /sensors/<id>

Rules

Full CRUD under /rules/<id>

Schedules

Full CRUD under /schedules/<id>

Touchlink

POST /touchlink/scan, identify, reset

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 (DECONZ_TLS=true); use a reverse proxy with a valid certificate. Set DECONZ_TLS_VERIFY=false only for a self-signed gateway certificate on a trusted network

MCP endpoint publicly accessible

Always set MCP_AUTH_TOKEN when binding to a non-loopback address

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.

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:

  1. Checks that the tag matches the version in pyproject.toml and fails early if it does not.

  2. Runs the full CI workflow (lint, format, type-check, tests on Python 3.10–3.12).

  3. Builds the image for linux/amd64 and linux/arm64, with an SBOM and build provenance, and pushes it to ghcr.io/marcinn2/deconz-mcp.

  4. 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.0

A 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 tools
create_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

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 39 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityStale
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      MCP server for Sinum smarthome system, enabling device and scene management, and light toggling via natural language.
      4
      3
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      MCP server for the entire Shelly smart-home ecosystem, enabling local-first control, automation, and energy monitoring of Shelly devices with cloud fallback.
      47
      37 PyPI
      MIT