Live control, the stored programs and the history sit on the same surface, so "it rained last night, hold everything for a day" and "did zone three actually run on Tuesday" are answerable in the same place.
A control surface for one OpenSprinkler irrigation controller. Fourteen tools cover the live controls, the watering programs stored on the device, and the logs. It manages a single controller at a time by design.
- Controller status — device time, whether it is enabled, and any rain delay in force — and every station with its current state (`get_controller_status`, `get_stations`)
- A station started for a set duration, one stopped, or all of them stopped at once (`run_station`, `stop_station`, `stop_all_stations`)
- A rain delay set in hours, or cleared by setting it to zero (`set_rain_delay`)
- The controller enabled, disabled or rebooted (`enable_controller`, `reboot_controller`)
- Watering history for a date range (`view_logs`)
- The stored watering programs listed, one read in full, and programs added or deleted (`get_programs`, `get_program`, `add_program`, `delete_program`)
- Controller options and settings (`get_options`)
One OpenSprinkler controller reachable by hostname or IP, set through `OPEN_SPRINKLER_HOST`, with the controller password supplied as its MD5 hash in `OPEN_SPRINKLER_PASSWORD` — the plain text will not work. It launches over stdio for a desktop client, or with `--sse` as a network service on `/mcp` at port 3000, where `MCP_AUTH_TOKEN` turns on bearer authentication. HTTPS to the controller needs a reverse proxy in front of it, because the OpenSprinkler firmware does not speak TLS itself. A Docker image and Kubernetes manifests ship with the repository.
