Rachio Mcp

io.github.rwestergren由 GitHub 账号 rwestergren 发布v0.1.4更新于 Oct 24, 2026

MCP server for Rachio sprinkler controllers — schedules, zones, and live watering control

已验证STDIO仅桌面位置与生活效率与工作流

概览

AI 生成的概览

面向 Rachio 洒水控制器的非官方 MCP 服务器,让助手查看设备、分区和计划,并控制实时浇水。

可以做什么
通过设备与分区工具列出控制器、传感器和气象站,查看分区配置与实时状态,并获取日历、运行历史、告警和天气等上下文。读取、预览、创建、更新、复制、删除、运行和跳过浇水计划。控制实时浇水:停止、按分区手动启动、设置雨天延迟、跳过、暂停和恢复当前运行。
适用场景
当需要让助手查看或修改 Rachio 浇水计划、查询即将执行和历史的运行记录,或在控制器上启动和停止分区时使用。适合愿意接受非官方逆向集成、以换取公共 API 所不具备的写入能力的用户。
运行要求
以 Python 包形式通过 stdio 在本机运行,通常用 uvx 启动或用 uv 安装。需要 Rachio 账户和长期有效的 RACHIO_ACCESS_TOKEN,需先用 rachio-mcp-token 命令生成一次,该命令会提示输入账户邮箱和密码。需要访问 Rachio 云端后端的网络连接。
安装前请注意
使用逆向得到的内部 API,不受 Rachio 支持,接口可能随时变化。令牌长期有效(约 25 年),在修改密码或在其他设备登出前一直可用,应视为敏感密钥。相关工具会创建、更新和永久删除计划,并启动或停止真实浇水,可能浪费水或影响草坪;提交前先预览。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Rachio Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

rachio-mcp

An MCP (Model Context Protocol) server for Rachio sprinkler controllers, built on the reverse-engineered Android-app gRPC API.

The public Rachio API exposes only read-only access to schedules and a handful of single-action endpoints. This server instead talks to the same internal gRPC backend (cloud.rach.io:443) that the official mobile app uses, giving an agent the full set of operations: listing devices and zones, inspecting schedules, creating and previewing new schedules, updating and deleting them, starting and stopping manual zone runs, setting rain delays, and more.

⚠️ Unofficial. This server uses a reverse-engineered API. It works as of Rachio Android v4.21.18 and is not supported by Rachio. The schema can change without notice.

Features

  • Devices and zones — list controllers, sensors, and weather stations; inspect zone soil/nozzle/plant configuration and live state
  • Schedules — list, read, preview (dry-run), create, update, delete, copy, run, and skip schedules
  • Live control — stop watering, run specific zones manually, set rain delays, skip/pause/resume the currently-running zone
  • Context — calendar of upcoming runs, recent/past run history, active alerts, observed/forecast weather readings

Quick Start

1. Install uv

bash
curl -LsSf https://astral.sh/uv/install.sh | sh

2. Mint a long-lived access token

The MCP server itself never sees your Rachio password. Instead you mint a long-lived (~25-year) access token once, and supply only the token to the MCP client.

bash
uvx --from rachio-mcp rachio-mcp-token

It will prompt for your Rachio email and password, then print a RACHIO_ACCESS_TOKEN value to paste into your MCP client config. The token remains valid until you change your password or explicitly log out from another device.

Or, if you'd rather have the commands on your PATH permanently, install once:

bash
uv tool install rachio-mcp

Then rachio-mcp-token (and rachio-mcp itself) are available as regular commands.

For scripting (e.g. pipe into a password manager):

bash
[email protected] RACHIO_PASSWORD=... \    uvx --from rachio-mcp rachio-mcp-token --json | jq .access_token

3. Configure your MCP client

uvx downloads and runs the server on demand — no separate install step required.

OpenCode (opencode.json)
json
{  "$schema": "https://opencode.ai/config.json",  "mcp": {    "rachio": {      "type": "local",      "command": ["uvx", "rachio-mcp"],      "environment": {        "RACHIO_ACCESS_TOKEN": "{env:RACHIO_ACCESS_TOKEN}"      },      "enabled": true    }  }}
Claude Desktop (claude_desktop_config.json)
json
{  "mcpServers": {    "rachio": {      "command": "uvx",      "args": ["rachio-mcp"],      "env": {        "RACHIO_ACCESS_TOKEN": "paste-your-token-here"      }    }  }}

If a tool call later returns a "token rejected" error, rerun rachio-mcp-token to mint a fresh one and update the config.

Available Tools

24 tools over stdio transport.

Discovery

ToolDescription
list_devicesEvery device on the account — controllers, sensors, weather stations
get_deviceFull details + live state for a single device
list_zonesZones configured on a controller, with agronomic metadata
get_zoneFull detail for a single zone
get_calendarScheduled runs + skip events for a date range
get_run_historyObserved recent/past zone-run telemetry plus calendar context
get_active_alertsUnresolved alerts on a device or zone
get_weatherObserved + forecast weather readings for a location

Schedule CRUD

ToolDescription
list_schedulesFilter by device, location, zone, or schedule id
get_scheduleSingle schedule + its locations/devices
preview_scheduleDry-run — returns the Schedule that create_schedule would produce, including the server-generated human-readable summary. Never persists
create_scheduleCreate a new schedule
update_schedulePartial-merge edit: name, enabled, timing/criteria, day restrictions, and per-zone add/update/remove
delete_schedulePermanent, destructive
copy_scheduleDuplicate an existing schedule
run_scheduleTrigger an immediate run
skip_scheduleSkip or re-arm the next scheduled run
get_schedule_runsPast runs + skip events for a schedule

Live controller ops

ToolDescription
stop_wateringStop whatever is running
start_zonesStart one or more zones manually by zone number + duration
set_rain_delayDefer all schedules until a given time
skip_current_zoneSkip to the next zone in the active run
pause_wateringPause the current zone for N seconds
resume_wateringResume a paused run

All device_id, zone_id, schedule_id, and location_id parameters are UUIDs obtained from the list_* tools. Dates use YYYY-MM-DD (or MM-DD for annual-recurring schedules); times use HH:MM.

Recommended Workflow for Schedule Changes

  1. list_devices → pick your controller
  2. list_zones(device_id=...) → note each zone's id and zone_number
  3. list_schedules(device_id=...) and get_schedule(schedule_id=...) → understand what's already configured
  4. preview_schedule(...) → dry-run your proposed schedule. Read the returned summary string and the per-zone breakdown
  5. create_schedule(...) (same arguments) → commit
  6. get_schedule(schedule_id=<new>) → confirm
  7. delete_schedule(schedule_id=<new>) → rollback if needed

preview_schedule is safe to call repeatedly — it never writes anything.

To edit an existing schedule instead of recreating it, use update_schedule. It performs a partial merge: read the schedule with get_schedule, then pass only the fields you want to change (name, enabled, timing/criteria, days, or zones/zone_ids_to_remove). Omitted fields are left untouched.

How It Works

This server talks to cloud.rach.io:443 over TLS-protected gRPC, the same backend used by the Rachio Android app. Authentication uses the OAuth 2 password grant against oauth.rach.io/oAuth/token with the Android app's hardcoded client credentials.

The gRPC .proto definitions were recovered by decompiling the Rachio Android APK (v4.21.18) with jadx, extracting the embedded FileDescriptorProto payloads from the generated Java classes, and round-tripping them through protoc to produce clean .proto source. Pre-compiled Python stubs for the 40-odd messages/services used by the 23 MCP tools ship in src/rachio_mcp/proto/.

Regenerate those stubs any time the app's proto surface changes:

bash
scripts/build_protos.sh

The stub generator reads from reverse-engineering/protos/, which is not shipped in the wheel but is kept alongside the source for future updates.

Python API

The MCP server wraps a standalone client you can use directly:

python
from rachio_mcp import RachioClient
c = RachioClient()
# Discoveryfor d in c.list_devices():    print(d["type"], d["id"], d.get("name"))
# Preview a proposed schedulepreview = c.preview_schedule(    name="Fall Lawn",    schedule_type="FIXED",    zones=[        {"device_id": "<controller>", "zone_id": "<zone>", "watering_time": 1200},    ],    start_time="06:00",    days=["WED"],    annual_start="09-16",    annual_end="11-15",    smart_cycle=True,)print(preview["summary"])
# Commitcreated = c.create_schedule(name="Fall Lawn", ...)print("created", created["id"])
# Rollbackc.delete_schedule(created["id"])

The client reads RACHIO_ACCESS_TOKEN from the environment, derives the user's user_id lazily on first use (via LocationService.ListLocations), and keeps both in memory for the lifetime of the process. Nothing is written to disk.

Environment

VariableRequiredDescription
RACHIO_ACCESS_TOKENYesLong-lived bearer token minted by rachio-mcp-token. Valid for ~25 years unless revoked.
LOG_LEVELNoPython logging level (default: INFO). Logs go to stderr; stdio transport's stdout is reserved for the MCP protocol.

Minting a token (one-time setup)

VariableUsed byDescription
RACHIO_EMAILrachio-mcp-token onlyRachio account email. If unset, rachio-mcp-token prompts interactively.
RACHIO_PASSWORDrachio-mcp-token onlyRachio account password. If unset, rachio-mcp-token prompts interactively with a masked input.

Neither RACHIO_EMAIL nor RACHIO_PASSWORD is ever read by the MCP server itself — they exist only to feed the one-time token-mint CLI.

Transport

stdio only. Remote HTTP with OAuth 2.1 is not supported in v0.1.

License

MIT — see LICENSE.

来源:README.md,提交 be68657

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.4最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分