Install the CLI
Detects your OS, drops espctl into your PATH. macOS and Linux share the same script.
$curl -fsSL https://esphome.cloud/espctl/install.sh | shFrom zero to working: one command installs the CLI, one logs in with your preview token, one verifies the environment. Everything after is your agent driving ESP32 builds.
Detects your OS, drops espctl into your PATH. macOS and Linux share the same script.
$curl -fsSL https://esphome.cloud/espctl/install.sh | shSaves to ~/.config/espctl/credentials.json. espctl build picks it up automatically.
$espctl login --token <your-preview-token>doctor surfaces env, project config, and login status in one pass.
$espctl doctor[ok] default-idf-version: DEFAULT_IDF_VERSION=v5.3.1[ok] project-config: .espctl.toml is valid[ok] login: logged in to https://esphome.cloudAll checks passed.
Each client gets four things: install, MCP config, a copy-ready prompt, and honest capability boundaries.
Codex, Claude Code, and OpenCode share one capability boundary but keep distinct entry paths.
Install commands, MCP config, and starter prompts live in the same operating zone.
Available capabilities and preview-only paths stay split so users do not have to infer risk.
Terminal native
Install + first command
curl -fsSL https://esphome.cloud/espctl/install.sh | sh
espctl doctorCodex MCP config
[mcp_servers.espctl]
command = "espctl"
args = ["mcp", "serve"]
cwd = "/path/to/your/esp-idf/project"
[mcp_servers.espctl.env]
CONTROL_BASE_URL = "https://esphome.cloud"
MCP_AUTH_SECRET = "<preview-token>"Starter prompt
Use espctl to initialize an ESP32-S3 project, pin ESP-IDF v5.3.1, run doctor, then prepare a remote build. If preview access is not configured, stop at the next concrete command I should run.Current status
What works today
Preview lane
The page has to stay honest. What works today should be stated plainly, and preview features should stay labeled as preview.
Skills, doctor, ports, flash, and monitor remain the stable operating surface.
Remote build still needs preview access and should not blur into the public baseline.