eero-cli

Active

Your eero mesh only bends to a phone app, so blocking a device or fencing a kid's TV means tapping through screens you cannot script. eero-cli hands the network to your shell: non-interactive SMS auth, filtered device listing, profiles and schedules, and single or bulk blocking, all runnable from a terminal or an agent.

$pipx install git+https://github.com/lidless-labs/eero-cli
Python 3.12+--json readsread-only statuswraps eero-api

See it workrepresentative session

you
I just swapped my router shelf around. Which devices are offline junk starting bc:24, and clear them out.
tool
eero devices --mac 'BC:24' --offline --json
result
[ {"name":"bc2411-old-ap","mac":"BC:24:11:AA:03:19","ip":"192.0.2.44","online":false}, {"name":"bc2411-test-plug","mac":"BC:24:11:AA:07:5C","ip":"192.0.2.61","online":false} ]
tool
eero block-cleanup '^bc24' -y
result
matched 2 offline devices, skipped 0 already blocked blocked bc2411-old-ap blocked bc2411-test-plug
agent
Two stale bc:24 devices, both offline, now blocked. Heads up: eero has no working forget-device API, so these stay listed until you tap Forget in the app or eero auto-culls them after ~30 days.

Representative session. Illustrative values, RFC 5737 addresses. Your session token stays on the box.

What it does

eero-cli is a small terminal CLI for managing devices on an eero mesh network from a real shell instead of the mobile app. It exists because eero ships no public API and no desktop control surface, so any scripted or agent-driven network task means tapping through a phone. It differs from the raw reverse-engineered libraries by adding a two-step, non-interactive SMS or email auth flow that survives across separate shell invocations, regex and MAC-prefix device filtering, profile and schedule management, single and bulk blocking, and honest documentation of the operations eero's backend silently refuses. It wraps eero-api, the most actively maintained reverse-engineered Python client, and every read command supports --json for scripting.

Capabilities11 commands across four groups

Auth

1 command

Two-step non-interactive SMS or email login; token written to ~/.config/eero/session.json at mode 0600.

Devices

3 commands

List, rename, and filter devices by regex, MAC prefix, or online/offline state, with --json output.

Blocking

2 commands

Block or unblock a single device, or bulk-block matching offline devices with block-cleanup.

Profiles

5 commands

Create profiles, assign devices, set bedtime pause schedules, and block apps at the profile level.

Status

read-only

eero status reports auth state, account, and visible networks; --json exits 1 when signed out.

Full tool reference on GitHub →

Setup

01 · install
pipx install git+https://github.com/lidless-labs/eero-cli
02 · configure

No env vars. Session token is stored at ~/.config/eero/session.json (mode 0600); re-run eero auth to reset. Requires Python 3.12+.

Safety

how it stays safe
Destructive commands refuse to guess when a name or MAC matches more than one device, so a fuzzy match never blocks the wrong host. block-cleanup defaults to offline-only, skips already-blocked devices, and prompts before acting unless you pass -y. eero status and every --json read are strictly read-only. The README documents, verified end-to-end, that eero's backend exposes no working way to delete an offline device, so the CLI never pretends to.

More in Network5 tools

librenmsctrlPipe LibreNMS devices, ports, and alerts to shells, cron, and agents. Writes gated. n8nctrlDrive n8n workflows from shells, cron, and agents: inspect, validate, run, audit. watchtowerNOC dashboard: device status, topology, and VM metrics via LibreNMS and Proxmox. cutsheetNetwork change intelligence: self-hosted config diff and risk analysis for switches, firewalls, and NetOps. portgridHigh-density port visualizer for LibreNMS, a modern replacement for the legacy SwitchMap.