The Houdini MCP plugin can start a remotely reachable hrpyc listener so an external MCP server (for example the Docker-based gateway) can connect to a running Houdini session over RPyC.
This replaces the friction of manually running import hrpyc; hrpyc.start_server() in the Python shell and then discovering the listener is
unreachable because of bind/firewall ambiguity.
The manual/direct workflow still works exactly as before. The activation path described here is an additional, safer entry point — it does not change or remove the manual mode.
The Houdini MCP shelf provides:
| Tool | Action |
|---|---|
| Start Remote | Start the hrpyc listener (bind/security from environment) |
| Stop Remote | Stop the listener (idempotent) |
| Remote Status | Show bind host, actual bound port, exposure, auth |
| Remote Self-Test | Reachability + versions + loopback warning + firewall guidance |
| Variable | Default | Meaning |
|---|---|---|
HOUDINI_RPC_BIND_HOST |
127.0.0.1 |
Bind address. Loopback is local-only and safe. |
HOUDINI_RPC_BIND_PORT |
18811 |
TCP port (0 = OS-assigned). |
HOUDINI_RPC_TRUSTED_NETWORK |
0 |
Set 1 to allow a non-loopback bind (opt-in). |
HOUDINI_RPC_TOKEN |
(unset) | Shared secret; enables authenticated remote bind. |
hrpyc/RPyC SlaveService grants arbitrary remote code execution inside
Houdini. To prevent accidentally exposing that to the network, the listener
enforces this policy:
- Loopback binds (
127.0.0.1,::1,localhost) are always allowed and are reachable only from the same machine. - Any non-loopback bind (
0.0.0.0or a specific LAN IP) is refused unless the operator explicitly opts in via either:HOUDINI_RPC_TRUSTED_NETWORK=1(you attest the network is trusted), orHOUDINI_RPC_TOKEN=<secret>(clients must present the token first).
If neither is set, Start Remote returns a security error and no listener is
created — there is no code path that silently binds 0.0.0.0 without auth.
- The token authenticator is a lightweight shared-secret handshake performed before the RPyC protocol. It is not TLS and provides no encryption — use it only on trusted networks or behind an encrypted tunnel (WireGuard, SSH, Cloudflare Tunnel, etc.).
- If the installed
rpycbuild does not expose the authenticator primitives, the token cannot be enforced at the socket layer; the bind still requires the trusted-network opt-in, but you should prefer a tunnel in that case. SlaveServiceis inherently powerful; treat any reachable listener as a full remote shell into Houdini.
If the listener is bound to loopback, Remote Status / Remote Self-Test
warn that remote clients cannot reach it and explain how to re-bind. The
self-test also emits per-OS firewall commands for the bound port.
scripts/verify_remote_listener.py connects to an already-running listener and
reads the Houdini version. It is read-only and never starts/stops/restarts
Houdini. It only runs when explicitly enabled:
RUN_LIVE_REMOTE_CHECK=1 \
HOUDINI_HOST=127.0.0.1 HOUDINI_PORT=18811 \
python scripts/verify_remote_listener.pyExit codes: 0 reachable/responsive, 1 failed, 2 disabled/misconfigured.