MCP server for the GL.iNet Comet (GL-RM1) KVM — screenshot, keyboard, mouse, and ATX power over the kvmd (PiKVM fork) HTTP API.
9 tools with complete schemas and descriptions. Naming is clear and action-oriented (get_, send_, mouse_, type_, power). Descriptions are adequate (50-150 chars) but lack LLM-optimized guidance on WHEN to use each tool or recovery paths. Parameter descriptions are present but sparse, many lack format/range constraints. No output schemas documented. Error handling is minimal; no recovery guidance. Audit logging is implemented but not exposed as a tool feature. Missing tool annotations (readOnlyHint, destructiveHint) despite clear risk levels.
current video frame of the target as a JPEG (optional crop)
device / HID / ATX / streamer state (compact by default)
click a mouse button, optionally moving first / holding modifiers
press, move, release — drag windows, sliders, selections
absolute mouse move (screen fractions 0..1, or pixels)
scroll the mouse wheel
DESTRUCTIVE — press the target's ATX power/reset button
No output schemas documented. LLMs cannot infer what fields get_screenshot, get_state, or other tools return, forcing them to guess at response structure and breaking downstream tool chaining.
Tool annotations missing. power() is DESTRUCTIVE and should carry destructiveHint=true; get_screenshot and get_state are READ_ONLY and should carry readOnlyHint=true. Without these, LLMs cannot reason about safety and retry semantics.
Parameter descriptions lack format/range constraints. 'x coordinate as screen fraction 0..1 or pixel count' is stated in description but not enforced in schema. No minimum/maximum bounds, no enum for button choices (left|right|middle), no pattern for keymap.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
press a key combination (web keycodes, e.g. ControlLeft+KeyC)
type literal text on the target
No error recovery guidance. If a tool call fails (e.g., device unreachable, invalid keymap), the error message does not tell the LLM what to do next. No categorization of retryable vs. fatal errors.
Descriptions lack WHEN-to-use guidance. 'type literal text on the target' does not explain when to use type_text vs. send_shortcut, or that type_text is slower and should be avoided for passwords. LLMs cannot optimize tool selection.