mcp-server-zwave-js-ui
An MCP server for managing a Z-Wave network
through Z-Wave JS UI. It connects to
the zwave-js-server WebSocket that Z-Wave JS UI exposes and surfaces the mesh
— controller, nodes, values, and configuration parameters — as tools an MCP
client (e.g. Claude) can call.
Status: early / read + write + lifecycle. Read-only introspection, write control (values, config parameters, node name/location, associations), and admin/lifecycle operations (re-interview, route rebuild, inclusion/exclusion, remove failed node) are available. Set
ZWAVE_JS_READ_ONLYto hide every mutating tool and expose only the read tools. Triggering an OTA firmware update is still on the roadmap.
Quickstart
-
In Z-Wave JS UI, make sure the Z-Wave JS Server WebSocket is enabled (Settings → Home Assistant → WS Server; default port
3000). See What it connects to. -
Add the server to Claude Code, pointing
ZWAVE_JS_URLat that WebSocket. No manual install needed —uvxfetches and runs the published package:claude mcp add zwave-js-ui \ --env ZWAVE_JS_URL=ws://<host>:3000 \ -- uvx mcp-server-zwave-js-ui
-
Ask Claude about your mesh — it calls the read-only tools to answer:
"Which Z-Wave controller am I running, and how many nodes are on the network?"
"List my Z-Wave nodes and flag any that are dead or asleep."
For other MCP clients, isolated installs, and configuration details, see the sections below.
What it connects to
Z-Wave JS UI runs two servers: the web UI (default port 8091) and the
Z-Wave JS Server WebSocket (default port 3000) that Home Assistant and
this MCP server talk to. Point ZWAVE_JS_URL at the WebSocket, not the UI.
Install
Requires Python 3.12+.
pip install mcp-server-zwave-js-ui
# or, isolated:
pipx install mcp-server-zwave-js-ui
# or, no install:
uvx mcp-server-zwave-js-ui
Configure
| Variable | Default | Description |
|---|---|---|
ZWAVE_JS_URL |
ws://localhost:3000 |
WebSocket URL of the Z-Wave JS Server. |
ZWAVE_JS_READ_ONLY |
(unset) | Set to 1/true/yes/on to hide all write and admin tools (only the read tools are registered). |
Use with Claude Code
claude mcp add zwave-js-ui \
--env ZWAVE_JS_URL=ws://<host>:3000 \
-- uvx mcp-server-zwave-js-ui
Or add it to an MCP client config directly:
{
"mcpServers": {
"zwave-js-ui": {
"command": "uvx",
"args": ["mcp-server-zwave-js-ui"],
"env": { "ZWAVE_JS_URL": "ws://<host>:3000" }
}
}
}
Tools
Write and admin tools (everything below the read-only rows) are hidden from the
registry when ZWAVE_JS_READ_ONLY is set.
Read-only
| Tool | Description |
|---|---|
zwave_controller_info |
Controller and network summary (home id, versions, RF region, node counts). |
zwave_list_nodes |
One-line summary of every node (status, readiness, security, device). |
zwave_node_info |
Full detail for a node (device class, command classes, endpoints, signal). |
zwave_node_values |
A node's current values, excluding configuration parameters. |
zwave_node_config |
A node's configuration parameters with current values and metadata. |
zwave_association_groups |
A node's association groups and their capabilities. |
zwave_associations |
A node's current associations, keyed by group. |
zwave_rebuild_routes_status |
Whether a network-wide route rebuild (heal) is in progress. |
zwave_firmware_update_status |
Whether an OTA firmware update is in progress. |
Write control (level 2)
| Tool | Description |
|---|---|
zwave_set_value |
Set a value by id (on/off/dim/etc.); validated against live metadata. |
zwave_set_config_parameter |
Set a manufacturer configuration parameter (optional bit mask). |
zwave_set_node_name |
Set a node's friendly name. |
zwave_set_node_location |
Set a node's location label. |
zwave_add_association |
Associate a target node into a source node's group. |
zwave_remove_association |
Remove a target node from a source node's group. |
Admin / lifecycle (level 3)
| Tool | Description |
|---|---|
zwave_reinterview_node |
Re-run a node's interview to refresh capabilities and values. |
zwave_rebuild_node_routes |
Rebuild mesh routes for a single node. |
zwave_begin_rebuilding_routes / zwave_stop_rebuilding_routes |
Start/stop a network-wide route rebuild (heal). |
zwave_remove_failed_node |
Remove a controller-flagged failed node from the network. |
zwave_begin_inclusion / zwave_stop_inclusion |
Enter/leave inclusion mode to add a node. |
zwave_begin_exclusion / zwave_stop_exclusion |
Enter/leave exclusion mode to remove a node. |
Note on secure inclusion: interactive S2 security bootstrap (DSK/PIN grant) can't complete through this stateless server — use the Z-Wave JS UI for secure inclusion.
Roadmap
- Trigger OTA firmware updates. Reporting update status is available
(
zwave_firmware_update_status), but starting a flash streams progress events over minutes, which the per-call connection model can't observe within a single tool call; delivering it needs a persistent-connection design.
Development
git clone https://github.com/cacack/mcp-server-zwave-js-ui
cd mcp-server-zwave-js-ui
uv sync --extra dev # create .venv from the checked-in uv.lock
uv run pytest
uv run ruff check . && uv run ruff format --check .
See CLAUDE.md for architecture and design notes.
License
Metadata
Release files for mcp-server-zwave-js-ui 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| mcp_server_zwave_js_ui-0.4.0.tar.gz | 112.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mcp_server_zwave_js_ui-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 127.7 kB
Release files / mcp_server_zwave_js_ui-0.4.0.tar.gz
| Download URL | mcp_server_zwave_js_ui-0.4.0.tar.gz |
|---|---|
| Size | 112.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
910dda4a657f7bcd37f88ce87e6311ea30fabd235277a5234f49276259e19c45
|
|
BLAKE2b-256 checksum How to use checksums |
d81da0c589123e6676ca99e91c7095e02a9f5238e0d97342395982a6bf7c6a42
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 11, 2026.
Transparency logRelease files / mcp_server_zwave_js_ui-0.4.0-py3-none-any.whl
| Download URL | mcp_server_zwave_js_ui-0.4.0-py3-none-any.whl |
|---|---|
| Size | 15.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fb53c73aea8203f25621452533d65838bd1aff5a45f85b03c96265f6896d79e9
|
|
BLAKE2b-256 checksum How to use checksums |
7b8cce2fbbf02ae5738bdf2606c515963d459b50a22b7ae65f2e970ac86e0e64
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 11, 2026.
Transparency logSecurity for mcp-server-zwave-js-ui 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for mcp_server_zwave_js_ui-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.