rachio-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | Python logging level (default: INFO). Logs go to stderr. | INFO |
| RACHIO_ACCESS_TOKEN | Yes | Long-lived bearer token minted by rachio-mcp-token. Valid for ~25 years unless revoked. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_devicesA | List all Rachio devices on the account. Includes sprinkler controllers (type = CONTROLLER_GEN1/2/3 or
CONTROLLER_VIRTUAL), linked sensors (SENSOR_LINKED, e.g. rain/flow
sensors wired into a controller), wireless flow sensors
(WIRELESS_FLOW_SENSOR), and virtual weather stations
(WEATHER_STATION_VIRTUAL). Filter by Returns a JSON object with |
| get_deviceA | Get full details + live state for a single device. Combines the static device info (model, serial, firmware, linked
sensors, USDA hardiness zone, Koppen climate code, etc.) with live
state (current zone run, standby, rain delay status). Linked sensors
and virtual weather stations don't have a live-state record, so the
Args: device_id: Device UUID from list_devices. |
| list_zonesA | List all zones configured on a controller. Each zone summary includes Args: device_id: Controller UUID (must be a CONTROLLER_GEN* device). include_extra: Ask the server to populate extra diagnostic fields. include_moisture: Include per-zone moisture data. |
| get_zoneA | Get full zone detail + live state. Returns a single zone's agronomic configuration (soil, nozzle, crop/plant, root depth, efficiency, etc.) and any live state. Args: zone_id: Zone UUID from list_zones. force_imperial: If true, units are returned in imperial (inches, sqft). If false, metric is used. |
| get_calendarA | Return scheduled runs and skip events for a device in a date range. Useful for 'what's going to water this week?' or 'what did Rachio
actually run last weekend?'. The response includes both Args: device_id: Controller UUID. start: Start date, ISO YYYY-MM-DD (default: today). end: End date, ISO YYYY-MM-DD (default: today + 14 days). |
| get_run_historyA | Return recent/past watering history for a controller. This is the best first tool for questions like "what ran today?",
"when did this controller water recently?", or "did anything skip?".
The response includes controller-observed Args: device_id: Controller UUID. start: Start date, ISO YYYY-MM-DD (default: today - 7 days). end: End date, ISO YYYY-MM-DD (default: tomorrow, so all of today is included). |
| get_active_alertsA | Return unresolved alerts for a device or a specific zone. Alerts include things like low flow, high current, freeze skip, rain skip, hardware faults. Exactly one of device_id or zone_id must be supplied. Args: device_id: Controller UUID to query alerts for. zone_id: Zone UUID to query alerts for. |
| get_weatherA | Return observed + forecast weather readings for a location. Each reading includes temperature range, precipitation (observed and probability of), humidity, wind, and ET (evapotranspiration). Used by Rachio's climate-skip logic. Args:
location_id: Location UUID (from a device's |
| list_schedulesA | List schedules matching exactly one filter.
Exactly one argument must be supplied. |
| get_scheduleA | Get a single schedule plus the locations/devices it runs on. Returns Args: schedule_id: Schedule UUID from list_schedules. |
| preview_scheduleA | Server-side dry-run of create_schedule. Does NOT persist anything. Returns the same Schedule that create_schedule would produce,
including the server-generated human-readable Args:
name: Schedule display name, e.g. "Summer Lawn".
zones: List of zone entries. Each must be a dict with keys:
|
| create_scheduleA | Create a new schedule. Persists to the Rachio backend. Strongly recommended: call Args: name: Schedule display name. zones: List of zone entries; see preview_schedule for shape. schedule_type: FIXED, FLEX_MONTHLY, or FLEX_DAILY. enabled: Whether the schedule starts enabled (default true). start_time: Daily start time HH:MM. start_sun: "SUNRISE" or "SUNSET". days: Days of week, e.g. ["MON", "WED", "FRI"]. annual_start: Annual window start MM-DD. annual_end: Annual window end MM-DD. smart_cycle: Let Rachio auto-calculate cycle/soak. cycle_soak: Enable manual cycle+soak. cycle_time_seconds: Cycle length in seconds. soak_time_seconds: Soak duration in seconds. zone_delay_time_seconds: Delay between zones. rain_delay_enabled: Enable rain-delay skipping. freeze_delay_enabled: Enable freeze-delay skipping. wind_delay_enabled: Enable wind-delay skipping. climate_skip: Enable climate/ET skipping. seasonal_shift: Enable seasonal runtime adjustment. |
| update_scheduleA | Partial-merge update of an existing schedule. Only the fields you pass are changed. The current schedule is read first and your changes are overlaid onto its existing timing, restrictions, and zones, then sent as a single update — so omitting an argument leaves that aspect untouched. Field meanings match create_schedule / preview_schedule. Recommended: call get_schedule first to review current values. Args: schedule_id: Schedule UUID to update. name: New display name. enabled: New enabled state. schedule_type: FIXED, FLEX_MONTHLY, or FLEX_DAILY. start_time: Daily start time HH:MM (mutually exclusive with start_sun; supplying one replaces the other). start_sun: "SUNRISE" or "SUNSET". days: Days of week, e.g. ["MON", "WED", "FRI"]. Replaces the existing day restriction. Pass [] to clear it. annual_start: Annual window start MM-DD. Pass "" to clear. annual_end: Annual window end MM-DD. Pass "" to clear. smart_cycle: Let Rachio auto-calculate cycle/soak. cycle_soak: Enable manual cycle+soak. cycle_time_seconds: Cycle length in seconds. soak_time_seconds: Soak duration in seconds. zone_delay_time_seconds: Delay between zones. rain_delay_enabled: Enable rain-delay skipping. freeze_delay_enabled: Enable freeze-delay skipping. wind_delay_enabled: Enable wind-delay skipping. climate_skip: Enable climate/ET skipping. seasonal_shift: Enable seasonal runtime adjustment. zones: Zone entries to add or update, matched on device_id + zone_id. Each dict needs device_id and zone_id; watering_time (seconds) is required for new zones and optional when updating an existing one. Optional order_id, flex_aggression_coefficient, flex_runtime_coefficient. zone_ids_to_remove: Zone UUIDs to drop from the schedule. |
| delete_scheduleA | Permanently delete a schedule. This cannot be undone. Args: schedule_id: Schedule UUID to delete. |
| copy_scheduleA | Duplicate an existing schedule. Returns the new Schedule. Useful for creating seasonal variants from an existing template — copy, then update_schedule to rename. Args: schedule_id: Schedule UUID to copy. |
| run_scheduleA | Start an immediate run of the schedule right now. Returns the list of device_ids the run was dispatched to. Args: schedule_id: Schedule UUID to run. |
| skip_scheduleA | Toggle the skip-next-run flag on a schedule.
Args: schedule_id: Schedule UUID. disabled: True to skip next run, False to re-enable it. |
| get_schedule_runsA | Return past runs + skips for a schedule in a date range. Useful for auditing 'did my Summer Lawn actually water last week?'. Args: schedule_id: Schedule UUID. start: Start date ISO YYYY-MM-DD (default: today - 30 days). end: End date ISO YYYY-MM-DD (default: today). |
| stop_wateringA | Stop all watering currently in progress on the device. If nothing is running, this is a no-op. Args: device_id: Controller UUID. |
| start_zonesA | Start a manual run of one or more zones in sequence.
Args:
device_id: Controller UUID.
zones: List of |
| set_rain_delayA | Set a rain-delay expiration for the device. The device will not run any schedules until the given time. Pass an
ISO-8601 datetime ( Args: device_id: Controller UUID. expiration: ISO-8601 datetime when the delay expires. |
| skip_current_zoneA | Skip to the next zone in the currently-running schedule. Does nothing if no schedule is running. Args: device_id: Controller UUID. |
| pause_wateringA | Pause the currently-running zone for Use resume_watering to continue before the pause expires; otherwise
the run resumes automatically after Args: device_id: Controller UUID. seconds: How long to pause (1 to 3600). |
| resume_wateringC | Resume a paused zone run. Args: device_id: Controller UUID. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rwestergren/rachio-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server