MCP server for Rain Bird ESP-TM2 irrigation controllers via the local LNK WiFi module (HTTP + HTTPS transport).
rainbird-mcp demonstrates solid naming conventions (verb_noun pattern: list_controllers, get_status, start_zone) and comprehensive parameter descriptions. All 13 tools have clear, actionable descriptions (avg ~120 chars). Input schemas are present with type definitions and parameter descriptions. However, output schemas are not formally documented, responses are inferred from code (e.g., get_status returns a dict with specific fields, but this is not declared in tool metadata). Error handling is minimal; no recovery guidance or actionable error messages visible. No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification (7 READ_ONLY, 6 WRITE). Parameter validation constraints (e.g., zone >= 1, minutes 1-1440, days 0-14) are enforced in code but not declared in schema descriptions, forcing LLMs to infer limits.
Skip to the next zone in the currently running program.
Model, firmware version, and serial number for a controller.
LNK WiFi module network status and parameters.
Remaining rain-delay in days (0 = no delay active).
Full program schedule: programs, run days, start times, and per-zone durations.
Current irrigation state: active zones, rain sensor, rain delay, available zones. This is the single call to make when asked "what is the sprinkler doing right now".
Output schemas not formally documented. Tools return dicts (e.g., get_status returns {irrigating, active_zones, remaining_runtime_seconds, ...}) but these fields are not declared in tool metadata. LLMs cannot plan downstream calls or validate response structure.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). 7 tools are READ_ONLY, 6 are WRITE with side effects (start_zone, stop_irrigation, set_rain_delay, run_program, sync_clock, advance_zone). Annotations enable agents to reason about safety and retry logic.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Per-zone on/off state for every available zone.
List the configured Rain Bird controllers, their addresses, and transport.
Start a stored program by number (1 = A, 2 = B, 3 = C on the ESP-TM2).
Set the rain delay in days; 0 clears it.
Manually run one zone for the given number of minutes. Starting a zone does not cancel the controller's own schedule.
Stop all irrigation immediately, whether manual or scheduled.
Set the controller's date and time to this machine's local date and time.
Parameter constraints not declared in schema descriptions. Code enforces zone >= 1, minutes 1-1440, days 0-14, program 1-4, but these are not visible in parameter descriptions. LLMs cannot self-validate and may pass invalid values.
No error handling or recovery guidance. Code raises ValueError for unknown controllers or invalid parameters, but no tool-level error messages guide LLM recovery (e.g., 'Unknown controller; try list_controllers() first').
Optional controller parameter defaults to single configured controller silently. If multiple controllers exist, error is raised. Description says 'optional; defaults to single configured controller' but does not explain multi-controller behavior or how to list available controllers.