Model Context Protocol server for controlling GREE/EWPE-compatible WiFi air conditioners over their native UDP protocol
Strong tool naming (verb_noun pattern), clear descriptions (avg 150 chars), and well-structured schemas with enums. All 12 tools have descriptions and input schemas with type definitions. Device selector pattern (mac/name) is user-friendly. Error handling returns actionable messages (e.g., 'No configured device matches'). Main gaps: output schemas not documented in code, no tool annotations (readOnlyHint/destructiveHint), and swing parameters lack enum constraints. Descriptions are solid but could be more prescriptive about when to use each tool.
Return the full decoded status of one device (power, mode, temperatures, fan, swing, xFan, light, quiet/turbo, etc).
Return the calibrated current temperature in °C. If the unit lacks a real sensor and fakeSensor is enabled, the value is derived from the target temperature and flagged with "estimated": true.
List all configured GREE air conditioners with their connectivity status and last-known state.
Set the fan speed. "quiet" and "turbo" engage the dedicated modes. On 3-speed units the intermediate steps are mapped down gracefully.
Enable or disable the display light.
Set the operating mode. Also powers the unit on.
set_swing parameters (vertical, horizontal) lack enum constraints and detailed descriptions. Currently just 'Vertical swing position' and 'Horizontal swing position', LLM cannot infer valid values (e.g., 'up', 'down', 'swing', 'off'). Should declare enums matching SWING_VERTICAL and SWING_HORIZONTAL constants.
Output schemas not documented in tool definitions. LLMs cannot plan downstream calls or extract required fields (e.g., device MAC, temperature value, status object structure). All 12 tools should document their return structure.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 6 write tools (set_*) should declare destructiveHint=true; all 3 read tools (get_*, list_*) should declare readOnlyHint=true. This helps LLMs reason about side effects and retry safety.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | <=2025-11-25 | v2 |
Turn a device on or off.
Enable or disable quiet mode.
Set the swing (oscillation) position. Vertical swing is available on all units; horizontal swing only on units with louver control.
Set the target temperature in °C. Rejected (not silently clamped) if outside the device's configured min/max range.
Enable or disable turbo (powerful) mode.
Enable or disable X-Fan (blow mode): keep blowing after power-off to dry the coil.
Device selector pattern (mac/name) is user-friendly but descriptions could clarify precedence. If both mac and name are provided, which takes priority? Current error message says 'Provide either mac or name' but code may accept both. Clarify in parameter descriptions.
Error handling for unreachable devices (ensureReachable) is good, but no dry-run or confirmation pattern for destructive operations. set_power, set_mode, set_target_temperature should support a 'confirm' parameter or separate confirm_* tools to prevent accidental changes.