Typed, safety-gated MCP tools for Klipper printer host operations
Klipper Ops MCP demonstrates solid naming conventions (verb_noun pattern across all 11 tools) and comprehensive parameter schemas with type definitions. Tool descriptions are present and contextually appropriate (avg ~120 chars). However, parameter descriptions are sparse or missing entirely, most parameters lack guidance on valid ranges, formats, or constraints. Output schemas are not documented. Error handling is implicit rather than explicit. The server shows good safety-gating patterns (confirmation flags, plan hashes, state checks) but lacks LLM-facing recovery guidance.
Atomically apply a reviewed plan, restart, health-check, and auto-rollback.
Create a timestamped local backup of the current remote config.
Compare a workspace config mirror with the current remote config.
Return a bounded remote config manifest and full-tree fingerprint.
Return compact host, print, config, and allowlisted service state.
Return bounded recent logs for one service in PRINTER_SERVICES.
Back up, diff, stage, and validate config; return a time-limited plan hash.
Parameter descriptions missing or incomplete. 'service', 'minutes', 'lines', 'max_entries', 'local_config_dir', 'expanded', 'plan_hash', 'confirm', 'restart_service', 'allow_unknown_print_state' lack guidance on valid ranges, formats, or constraints. LLMs cannot infer whether 'minutes' accepts 0, negative, or unbounded values.
Output schemas not documented. Tools return dict[str, Any] with no specification of fields, types, or structure. Agents cannot plan downstream calls or extract required data (e.g., what fields does get_printer_status return? Is there a status code, timestamp, or error field?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Atomically refresh a workspace config mirror, removing stale local files.
Restart an allowlisted service after confirmation and an idle-state check.
Validate and restore a named workspace backup with atomic rollback guards.
Upload to an isolated staging directory and run Klipper check_config.py.
Error handling lacks recovery guidance. No indication of what errors are retryable, user-fixable, or fatal. No guidance on what to do if a service is not found, config validation fails, or a plan hash expires. LLMs receive no actionable next steps.
Numeric parameter constraints not specified. 'minutes' (default 15) and 'lines' (default 120) lack min/max bounds. 'max_entries' (default 500) is unbounded. LLMs may pass absurd values (0, negative, 1000000) that break the tool or timeout.
Enum constraints missing for 'service' and 'restart_service' parameters. Code references PRINTER_SERVICES allowlist but does not expose valid values to the LLM. LLMs will hallucinate service names instead of selecting from known options.