A local-first command-line tool for operating Reolink cameras — JSON by default, with a built-in MCP server and a cross-agent skill so AI agents drive the same core.
Control Reolink cameras over your local network — no cloud account, no app.
Script it with jq, or let an AI agent drive it in plain language.
$ reolink-cli --camera front-door info | jq '{model, firmware, name}'
{
"model": "Reolink Video Doorbell",
"firmware": "v3.0.0.6696_26062799",
"name": "Front Door"
}What this repository is. The official distribution point for the prebuilt
reolink-clibinaries (proprietary, royalty-free EULA — see License), plus the agent skill, plugin manifests and installers (Apache 2.0). The CLI source code is not published here.
It talks to Reolink devices directly over your LAN:
- IP cameras and video doorbells with a LAN address, wired or Wi-Fi
- NVRs and the Home Hub —
device expand <nvr>registers one entry per channel, which is also the only way to reach a battery camera paired to a hub - Battery cameras, on your Wi-Fi or through a Home Hub — a sleeping camera can take several seconds to answer the first command
Features differ by model. Ask the camera rather than guessing:
reolink-cli --camera porch capabilitiesAn operation the model does not implement fails with a clear "device does not support" error, never silently.
- 🔍 Discovery — LAN broadcast, plus bulk
device import - 🎥 Live media —
preview play, file/stdout capture, batch capture, JPEG snapshot - 🕹️ PTZ — pan/tilt/zoom, presets, patrol, guard, autotrack, real timed jog
- 💡 Lights — IR, spotlight (with native blink), white-LED, status LED
- 🎚️ Video encoder — resolution, frame rate, bit rate, H.264/H.265, GOP per stream
- 📢 Siren — sound / silence the built-in siren on demand
- 🧠 Detection — motion + AI (person / vehicle / dog_cat / package)
- 📼 Recording & storage — schedule, SD/HDD status, VOD search & download
- 🔔 Events — query/stream + a declarative rule engine (
events monitor) - 🗣️ Two-way audio — talkback / TTS straight to the camera speaker
- 🌐 Stream URLs — RTSP / RTMP / FLV for Frigate, Home Assistant, go2rtc, VLC
- 🤖 AI-native — built-in MCP stdio server + cross-agent operator skill
- 🧩 Fleet-aware — camera & tag selectors, local session daemon for a fast control plane
The authoritative command list comes from the binary: reolink-cli --help,
reolink-cli <command> --help, or reolink-cli features for a machine-readable
manifest.
Command overview
| Area | Commands | What you can do |
|---|---|---|
| Setup & registry | init, device, config, doctor, setup |
Scaffold config, register/import cameras, tag them, health-check the install |
| Connect & inspect | ping, login, info, capabilities, status, benchmark |
Reach a camera, read model/firmware/serial, list what the model supports, measure round-trip latency |
| Discovery | discover |
Find cameras on the LAN (broadcast) |
| Live media | preview, snapshot, stream |
Play or capture live video, grab a JPEG, print RTSP/RTMP/FLV URLs |
| Image & encoder | image, encode, osd |
Flip/mirror, encoder settings per stream, on-screen name/time overlay |
| Lights | light |
IR / night vision, spotlight (with blink), white-LED, status LED |
| Audio | audio |
Volume, alarm mute, siren, quick replies, two-way talkback / TTS |
| PTZ | ptz |
Pan / tilt / zoom, focus, presets, patrol, guard, autotrack, timed jog |
| Detection & events | detect, notify, events |
Motion + AI detection, push settings, query/stream events, rule engine |
| Recording & storage | record, vod, storage, log |
Recording schedule, VOD search & download, SD/HDD status, device logs |
| Privacy & users | privacy, users |
Privacy-mask regions, manage device accounts |
| Network | wifi |
Push a new SSID + PSK (pre-validated), auto-rediscover, update the registry |
| System | system |
Reboot |
| Gateway & tooling | gateway, mcp-server, plugin, cache, self-update |
Run the local gateway, expose MCP tools, maintain the skill cache, update the binaries |
/plugin marketplace add reolink/reolink-cli
/plugin install reolink-cli@reolink-cli
The plugin carries both the skill and the MCP server. The binary for your platform is fetched the first time you ask about a camera, and the agent starts the local gateway when it needs it. Then just talk: “show me the front door camera”, “point the back-yard camera left”, “blink the porch spotlight 3 times”.
Other agents — requires Node.js
Codex, Cursor, Gemini, Copilot, OpenCode and 70+ others:
npx skills@latest add reolink/reolink-cliPick reolink-cli and the agents to install it into; the binary is fetched on
first use, as above.
Installs reolink-cli + reolink-gateway to ~/.local/bin (no sudo) and
initializes config:
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/reolink/reolink-cli/main/install.sh | sh# Windows — works from PowerShell or the Command Prompt
powershell -NoProfile -Command "iwr https://raw.githubusercontent.com/reolink/reolink-cli/main/install.ps1 -UseBasicParsing | iex"Both installers verify the download before installing anything — see Installers for exactly what they do.
Upgrading: reolink-cli self-update --yes on macOS/Linux. On Windows,
re-run the installer (a running .exe cannot replace itself).
Prefer a downloadable archive?
Grab the archive for your platform from the latest Release, verify it, extract, and run the bundled installer:
tar -xzf reolink-cli-*.tar.gz && cd reolink-cli-*/ && ./install.sh
# Windows: extract the .zip and run .\install.ps1The archive is self-contained: binaries + the skill/plugin + installer +
THIRD-PARTY-LICENSES.txt.
Uninstall
reolink-cli setup --uninstall # add --purge to also delete config and the camera registry
npx skills remove reolink-cli # if you installed the skill with npxClaude Code users: also run /plugin uninstall reolink-cli.
1. Start the gateway. Most commands go through a small local process that keeps camera sessions open, so repeated commands are fast. Leave it running in its own terminal (or under your service manager):
reolink-cli gateway start --addr 127.0.0.1:90002. Tell the CLI where it is — for this shell, or permanently by adding
gateway-addr = "127.0.0.1:9000" to config.toml (reolink-cli doctor prints
where that file lives):
export REOLINK_GATEWAY_ADDR=127.0.0.1:9000Port 9000 already taken (Portainer, MinIO, …)? Use any free port in both places.
3. Find a camera, register it, use it:
reolink-cli discover # cameras on your LAN
reolink-cli device add porch --host 192.168.1.41 --user admin --password-stdin
reolink-cli --camera porch info
reolink-cli --camera porch snapshot --file ./porch.jpg--password-stdin prompts for the password, so it never lands in your shell
history. device list also shows a few disabled example entries the installer
wrote to illustrate the file format — device remove <name> clears them.
Many cameras at once — credentials via the environment, never --password:
export REOLINK_PASSWORD='<device-password>'
reolink-cli --user admin device import
unset REOLINK_PASSWORDpreview play needs ffplay on PATH (or pass --player, or set
REOLINK_PLAYER).
Target selection stays explicit — there is no hidden “current device” state.
| Selector | Meaning |
|---|---|
--camera <name> |
one registered device |
--cameras <a,b,c> |
several registered devices |
--tag <tag> |
every device carrying a tag |
--all-devices |
the whole registry |
--host <ip[:port]> |
an ad-hoc device by address |
reolink-cli device list
reolink-cli --tag outdoor device inventory --capabilities
reolink-cli --tag outdoor snapshot # fan out across a tag groupPrint a camera's stream URLs, read from its real port configuration:
reolink-cli --camera porch stream url --kind rtsp,rtmp,flv --stream main,subCredentials come back as separate JSON fields. --with-auth embeds
user:password@ in the URL for players that need it — treat that output as a
password.
Two ways in, both driving the same runtime as the CLI:
-
The skill — natural language. It teaches the agent the command surface and the safety rules, so you say “point the driveway cam to preset 2, then take a snapshot” or “let me know if anyone shows up at the door tonight”. The agent never guesses device state — it only reports what a command returned.
-
The MCP server — typed tool calls for tight automation loops. The Claude Code plugin already registers it. For any other MCP client:
"mcpServers": { "reolink-cli": { "command": "reolink-cli", "args": ["mcp-server"], "env": { "REOLINK_GATEWAY_ADDR": "127.0.0.1:9000" } } }
JSON-RPC 2.0 over stdio; the gateway must be running, as for the CLI.
Prebuilt binaries on each Release:
| OS | Architectures |
|---|---|
| macOS | arm64 (Apple Silicon) |
| Linux (glibc) | x86_64, arm64 |
| Linux (musl, static) | x86_64, arm64 — Alpine, Home Assistant OS, slim Docker images |
| Linux 32-bit ARM | armv7 (Pi 2/3/4 on a 32-bit OS), armv6 (Pi 1 / Zero) — glibc 2.28+ |
| Windows | x86_64 |
install.sh picks the right one for you, including on a Raspberry Pi whose
64-bit kernel runs a 32-bit userland. Choosing by hand? getconf LONG_BIT
decides arm64 vs armv7, not uname -m; and when unsure between glibc and musl,
take musl — it runs on both, while a glibc build on a musl host fails with a
confusing symbol not found. file "$(command -v reolink-cli)" says
"statically linked" for a musl build.
Home Assistant OS: the homeassistant container is aarch64 Alpine. Run the
one-line installer inside that container (it selects musl), and make sure the
gateway is reachable from there — start it in the same container, or point
REOLINK_GATEWAY_ADDR at one on the LAN.
Use this tool only on cameras you own or are authorised to administer.
discover and ping are for locating your own devices, not for sweeping
networks you were not asked to work on. Snapshots, recordings and event history
written to disk are personal data — protect them like the camera's own storage,
and delete what you no longer need.
- The gateway binds
127.0.0.1by default and refuses browser cross-origin requests.--addr 0.0.0.0:9000exposes camera control to your whole LAN — do it deliberately. - LAN-only build. Remote access via Reolink's P2P relay is not included;
reolink-cli --versionshows(external · LAN-only). - Report vulnerabilities privately — see SECURITY.md, which also documents what the tool does by design.
- Never pass
--passwordon the command line — it shows up inpsand your shell history. Use--password-stdin,REOLINK_PASSWORD, or register the camera once withdevice addand refer to it by name. - Stored passwords are encrypted at rest (AES-256-GCM) with a
credentials.keykept next to the registry. Config files are owner-only (0600) and the CLI refuses to read them otherwise. Back up the registry and itscredentials.keyas a pair — neither works without the other. Details: SECURITY.md → Stored credentials. - Credentials never go in a URL. Gateway media endpoints use a session token
that expires after 300 s of inactivity. The one exception is
stream url --with-auth, which you ask for explicitly. - Redact before sharing output — it can contain UIDs, serial numbers, LAN addresses and stream URLs.
install.sh and install.ps1 are plain text — read them before running. They:
- download the latest release from
github.comonly - verify it against
checksums/<tag>.sha256committed to this repository's default branch, never the checksum attached to the release, and abort on any mismatch or missing entry - install two binaries to
~/.local/bin(%USERPROFILE%\.local\binon Windows) — nosudo, no system directories, no services - stop a running
reolink-gatewayonly if it runs from that same prefix - overwrite previous binaries in that prefix; nothing else on disk is modified
- add the prefix to your user
PATHif it is missing (Windows)
tag=vX.Y.Z # the release you downloaded
curl -fsSL -o CHECKSUMS \
"https://raw.githubusercontent.com/reolink/reolink-cli/main/checksums/$tag.sha256"
shasum -a 256 -c CHECKSUMS --ignore-missing # sha256sum -c on LinuxUse this committed file, not the SHA256SUMS attached to the release:
whoever can replace a release asset can regenerate the checksum beside it. This
proves integrity, not who built the archive — SECURITY.md
states exactly what it does and does not cover.
"Reolink" and the Reolink logo are trademarks of Reolink Innovation Limited. The Apache 2.0 licence covers the code and docs in this repository — it grants no rights to the Reolink name or logo. If you publish a fork, rename it and remove the marks; see TRADEMARKS.md.
- This repository — the skill, plugin manifests, installers and docs — is licensed under the Apache License 2.0 (see also NOTICE).
- The prebuilt
reolink-clibinaries on the Releases page are proprietary, governed by the EULA bundled in each release archive. The CLI source is not published here. - Third-party open-source components bundled in the binaries are listed in
THIRD-PARTY-LICENSES.txtinside each release archive.