Myro:Home Helper MCP server
Lets an AI assistant (Claude Desktop, Claude Code, ChatGPT desktop, anything that speaks MCP) read and control an HAI/Leviton Omni controller through Myro:Home Helper, using the Helper's HTTP API. The assistant sees typed tools with descriptions instead of guessing URL shapes.
What you need
- Myro:Home Helper 4.06 or later on a Mac on your network (4.07 or later for
the read tools:
list_objects,get_object,helper_log). - An API key for your controller: Helper → API tab → Generate.
uvon the machine running the assistant (brew install uvor the one-line installer).uvxfetches and runs this server on demand and keeps it updated.
Configure
Claude Desktop (claude_desktop_config.json) or any client that takes the
standard MCP config:
{
"mcpServers": {
"myrohome-helper": {
"command": "uvx",
"args": ["myrohome-helper-mcp"],
"env": {
"MHH_URL": "http://192.168.1.76:9393",
"MHH_API_KEY": "your-api-key"
}
}
}
}
Claude Code:
claude mcp add myrohome-helper -e MHH_URL=http://192.168.1.76:9393 -e MHH_API_KEY=your-api-key -- uvx myrohome-helper-mcp
The controller ID is fetched from the Helper automatically. Set
MHH_CONTROLLER_ID only if you want to pin it.
Tools
Read:
| Tool | What it returns |
|---|---|
helper_info |
Helper version and identity, and which controller the key is for |
controller_status |
Name, model, firmware, connection, power, battery, phone line, energy cost, troubles |
controller_property(name) |
One controller property |
list_objects(type?) |
Every object with decoded state; filter by Zone, Unit, Flag, Output, Thermostat, Auxiliary Sensor, … |
get_object(type, number) |
One object |
helper_log(lines) |
The Helper's recent log lines |
ethernet_quality |
The controller connection's health record |
list_logged_sensors |
Which sensors record history, with the type and number |
sensor_history(type, number, points) |
Logged readings for one sensor or thermostat |
Write (each changes the physical home; tool descriptions tell the assistant to confirm first):
| Tool | Effect |
|---|---|
set_unit(number, value) |
0 off, 1 or 100 on, 2–99 dimmer level |
set_flag(number, value) |
Flag to 0–255 |
set_output(number, on) |
Output relay on or off |
set_energy_cost(level) |
low / medium / high / critical |
send_notification(message) |
Push to the Myro:Home apps |
speak(message) |
Speak on the Mac |
log_message(message) |
Write to the Helper log |
sync_now |
Re-sync from the controller |
Scripts (save, enable and reload need a key with remote script management enabled; listing, reading and validating do not):
| Tool | What it does |
|---|---|
list_scripts |
Every script: name, id, enabled, schedule |
get_script(identifier) |
One script's full source |
scripting_reference(compact) |
The live scripting API, with your real device names |
validate_script(code) |
Syntax and warnings, without running it |
save_script(name, code, script_id, enabled) |
Create or replace; disabled by default |
set_script_enabled(identifier, enabled) |
Enabling runs the script immediately |
reload_scripts |
Re-runs every enabled script |
Audio, Lutron and displays:
| Tool | What it does |
|---|---|
list_audio_sources |
Sources and their cached metadata |
audio_source_metadata(source, refresh) |
What one source is playing |
set_audio_zone(zone, power, volume, mute, source) |
Control a zone |
list_lutron |
Bridges, devices and Picos |
set_lutron_level(bridge_id, level, ...) |
Set a Lutron device 0-100 |
activate_lutron_scene(bridge_id, scene_href) |
Activate a scene |
press_lutron_button(bridge_id, integration_id, component) |
Press a keypad or Pico button |
list_displays |
Vestaboards and LaMetric clocks |
| `send_to_vestaboard(text | lines |
send_to_lametric(text, ...) |
Show a notification on a LaMetric |
sync_clock |
Set the controller's clock from this Mac |
Security (all four need an API key with arm/disarm enabled; arm and disarm also need a panel code stored locally):
| Tool | Effect |
|---|---|
arm(mode, area) |
day, night, away, vacation, day_instant, night_delayed |
disarm(area) |
Disarms the system |
bypass_zone(zone, bypassed, area) |
Bypass or restore one zone |
restore_all_zones(area) |
Restore every bypassed zone |
arm and disarm stay disabled until the owner stores a panel code on the machine
running this server. bypass_zone and restore_all_zones work without one on
Helper 4.13 or later, running as the panel's Programmed user; with a stored code
they run as that user instead. To store or remove the code:
uvx myrohome-helper-mcp security-code set # prompts; nothing is echoed
uvx myrohome-helper-mcp security-code delete
The code goes into the operating system credential store (macOS Keychain, Windows Credential Locker, Linux Secret Service) under the controller's identity. It is never placed in the MCP config, an environment variable, or a conversation, and it is read only when a security tool is actually called. Helper validates it against the panel itself.
Security
This server runs on your LAN like every other Myro:Home client and holds one controller's API key. Anyone who can run the assistant with this config can do what the key allows. Keep it on trusted machines. The Helper's HTTP API is plain HTTP on the local network; do not expose port 9393 to the internet.
Developing
uv sync
MHH_URL=http://192.168.1.76:9393 MHH_API_KEY=... uv run myrohome-helper-mcp # stdio server
uv run mcp dev src/myrohome_helper_mcp/server.py # MCP inspector
Releasing
Bump version in pyproject.toml and __init__.py, commit, then tag and
push: git tag v0.1.0 && git push origin v0.1.0. The GitLab CI job builds
and publishes to PyPI through trusted publishing (one-time setup: PyPI
project -> Publishing -> add GitLab publisher MyroControl/myrohome-helper-mcp,
environment pypi).
MIT licensed. Myro Control, LLC.
Metadata
Release files for myrohome-helper-mcp 0.3.3
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 | Actions |
|---|---|---|---|---|
| myrohome_helper_mcp-0.3.3.tar.gz | 72.9 kB | Without provenance | Details for myrohome_helper_mcp-0.3.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| myrohome_helper_mcp-0.3.3-py3-none-any.whl | Python 3 | none | any | Details for myrohome_helper_mcp-0.3.3-py3-none-any.whl |
Total release size: 87.2 kB
Release files / myrohome_helper_mcp-0.3.3.tar.gz
| Download URL | myrohome_helper_mcp-0.3.3.tar.gz |
|---|---|
| Size | 72.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8f3961244e0df05d7204bf00b6c31d24521c12b93b77702523cb3b769135e196
|
|
BLAKE2b-256 checksum How to use checksums |
9237a622ba28e7ca87235ac113d3bbb2d635ab7907745abcff9d382de1a555ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / myrohome_helper_mcp-0.3.3-py3-none-any.whl
| Download URL | myrohome_helper_mcp-0.3.3-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b2b0da91e2e87f1b0bdbd3d3b06a18cedc8d9850757312226c92c6a413a7a15c
|
|
BLAKE2b-256 checksum How to use checksums |
0f788a457a90c279a427576aef657260ed9b95fa1eadd927bd8ea4df564f4a7e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for myrohome-helper-mcp 0.3.3
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A 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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.