--- name: "moonraker" description: "Control a Klipper 3D printer through Moonraker: print jobs, file uploads, emergency stop, smart plugs, and gated raw G-code. Trigger phrases: moonraker, klipper, mainsail, fluidd, start print, pause print, emergency stop." metadata: { "includeInPrompt": true } tagline: "Control a Klipper-based 3D printer through the Moonraker API server (the backend behind Mainsail, Fluidd and RatOS): read server and print status, list and upload gcode files, start/pause/resume/cancel prints, trigger the emergency stop, toggle smart-plug devices, and (gated) run raw G-code. Use when the user mentions Moonraker, Klipper, Mainsail, or Fluidd." catalog_auth: "no credential needed on most LAN installs (optional API key via the secure credential flow)" catalog_hosts: ["the host you pass via --host"] --- # Moonraker ## Purpose Control a Klipper-based 3D printer through the Moonraker API server (the backend behind Mainsail, Fluidd and RatOS): read server and print status, list and upload gcode files, start/pause/resume/cancel prints, trigger the emergency stop, toggle smart-plug devices, and (gated) run raw G-code. Use when the user mentions Moonraker, Klipper, Mainsail, or Fluidd. ## Tooling All commands go through `bin/moonraker.py`. `--host` points at Moonraker (default `$MOONRAKER_HOST` or `http://localhost:7125`); `--insecure` skips TLS verification for self-signed reverse proxies. `--api-key` attaches the stored `custom.moonraker` credential; omit it on the default no-auth LAN setup. ```bash bin/moonraker.py auth --host http://printer.local:7125 # server info; never needs a credential bin/moonraker.py status # print state and temperatures bin/moonraker.py files # list gcode files # MEDIUM: --confirm "" on first use per printer, then proceed bin/moonraker.py upload --path ./benchy.gcode --confirm "upload benchy.gcode to printer.local" bin/moonraker.py print-start --filename benchy.gcode --confirm "start printing benchy.gcode on printer.local" bin/moonraker.py print-pause --confirm "pause the print on printer.local" bin/moonraker.py print-resume --confirm "resume the print on printer.local" bin/moonraker.py print-cancel --confirm "cancel the print on printer.local" bin/moonraker.py emergency-stop \ --confirm "emergency stop on printer.local: halt all motion and heaters" bin/moonraker.py device-power --device enclosure --action on \ --confirm "turn smart-plug device enclosure on on printer.local" # HIGH: raw G-code needs BOTH --enable-raw-gcode AND --confirm on EVERY call bin/moonraker.py gcode-script --script "G28" --enable-raw-gcode \ --confirm "run raw G-code script: G28" ``` MEDIUM first-use confirmations are recorded locally (`~/.cache/muse-connectors/moonraker/confirmed.json`). ## Auth - Provider id: `moonraker` (credential is collected as `custom.moonraker`) - Collection: Moonraker has no auth on the LAN by default, so most installs need nothing stored at all. If the printer enables `[authorization]` API keys, store the key via the secure credential flow (`credentials.request_api_access`) as `custom.moonraker` and pass `--api-key` on each call. The key is never passed on the command line, in the environment, or in a file: `--api-key` is a flag that takes no value. - Allowed hosts: the hostname from `--host` (validated per call; the surrogate is only ever swapped on egress to that host) - Status check: `bin/moonraker.py auth` (must return `"ok": true`; also reports whether an API key is stored) - Remote access: Moonraker is LAN-first. Reach it remotely through the OctoEverywhere relay, a VPN, or a reverse proxy; the connector does not implement any relay itself. ## Operating Rules 1. **HIGH: raw G-code (`gcode-script`) can physically damage the printer.** The CLI requires both `--enable-raw-gcode` (explicit capability flag) and `--confirm "run raw G-code script: