CLI, MCP server, and web dashboard for the Roborock Saros 10R robot vacuum
Server has 15 tools with complete input schemas and descriptions. Naming follows verb_noun convention (vacuum_status, start_cleaning, etc.). Descriptions are present but brief (avg ~80 chars, below the 194-char baseline). Parameters are typed and mostly described, but lack constraints (enums, ranges, patterns). No output schemas documented. Error handling is minimal, tools raise RuntimeError or ValueError with generic messages, no recovery guidance. Missing tool annotations (readOnlyHint, destructiveHint). Composition is sound: each tool has one responsibility, and outputs include IDs for chaining (e.g., room names returned by get_map). Security: no secrets exposed as parameters; client authentication happens server-side.
Get the full cleaning schedule status for all rooms, including last cleaned times, overdue ratios, and configured intervals.
Get room names and segment IDs from the vacuum's map.
List rooms that are past their cleaning interval. Args: mode: 'vacuum' or 'mop' (default: 'vacuum').
Play a sound on the vacuum to help locate it.
Pause cleaning in place without returning to dock.
Recommend rooms to clean given an optional time budget. Args: max_minutes: Time budget in minutes. If omitted, returns all overdue rooms. mode: 'vacuum' or 'mop' (default: 'vacuum').
No output schemas documented. LLMs cannot predict response structure for downstream planning. E.g., room_clean returns {result: string} but LLMs need to know if segment_ids or room_ids are included for chaining.
Descriptions are too brief (avg 80 chars vs 194-char baseline). Missing WHEN to use each tool and prerequisites. E.g., 'Start a full home clean' does not explain if the vacuum must be docked first or what happens if already cleaning.
No parameter constraints (enums, ranges, patterns). 'mode' parameter in get_overdue_rooms and set_room_interval accepts 'vacuum' or 'mop' but is free-form string, LLM may hallucinate 'sweep' or 'both'. Should be enum.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Stop cleaning and return the vacuum to its charging dock.
Clean specific rooms by name. Args: rooms: List of room names to clean (e.g. ["Kitchen", "Office"]). repeat: Number of times to clean each room (default: 1).
Trigger a named routine configured in the Roborock app. Args: name: Name of the routine to run.
Set or clear a room's cleaning interval. Args: room: Room name (e.g. 'Kitchen'). mode: 'vacuum' or 'mop'. days: Interval in days (e.g. 3.0), or null to clear.
Attach or clear free-text notes for a room's schedule entry. Args: room: Room name (e.g. 'Bedroom'). notes: Notes text, or null to clear.
Start a full home clean.
Stop the current cleaning session.
Get current vacuum state, battery level, and dock status.
Clean rectangular zones defined by coordinates. Args: zones: List of rectangles, each as [x1, y1, x2, y2]. repeat: Times to clean each zone (default: 1).
Error handling lacks recovery guidance. room_clean raises ValueError('Unknown room(s)...') with available rooms listed, which is good. But stop_cleaning, pause_cleaning, and locate_vacuum raise generic RuntimeError with no context. LLM cannot self-correct.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes without parsing descriptions. start_cleaning, stop_cleaning, pause_cleaning, return_to_dock, locate_vacuum, room_clean, zone_clean, run_routine, set_room_interval, set_room_notes are all WRITE but unmarked.