Local-network toolkit for Elegoo Centauri Carbon 3D printers: async Python client, CLI, MCP server, REST/SSE HTTP server, web UI, and RTSP bridge
The pycentauri MCP server demonstrates solid definition quality with clear tool names, consistent verb-prefix patterns, and detailed descriptions. All 13 tools are explicitly registered in src/pycentauri/mcp/server.py with FastMCP decorators. Tool names follow verb_noun convention (get_status, start_print, set_temperatures). Descriptions are comprehensive (194 chars avg, well within 10-1024 range), explain WHEN to use each tool, and correctly mark destructive/reversible operations. Input schemas are present and typed for all tools. However, there are notable gaps: (1) several tools lack parameter descriptions despite having schema definitions (e.g., set_print_speed mode parameter has description, but upload_file and several control tools lack full descriptions for all params), (2) some output schemas are partially documented in-code comments but not formally exposed as returnType metadata, (3) error handling guidance is minimal, most tools lack recovery suggestions, and (4) parameter constraints are described textually but not always enforced as enums or format validators. The server demonstrates good composition (tools are focused, single-responsibility), proper naming (distinct from each other), and appropriate security (host injected via environment, not tool params). This places it solidly in the B+ range (70-79).
Broadcast the SDCP discovery probe and return responding printers. Useful to verify the configured host matches what's actually on the LAN, or to find a newly-added printer's IP.
Return printer attributes: model, firmware, mainboard ID, capabilities.
Return Canvas multi-filament system state (CC2 only). Shows connected Canvas units, each tray's filament type/name/color, temperature ranges, loaded status, and the auto-refill toggle state. Returns an error on CC1 (which doesn't expose Canvas over SDCP).
Return a JPEG snapshot of the built-in webcam. The image is returned inline so the agent can see what the printer is currently doing (e.g. to spot layer shifts or spaghetti).
Return the current printer status. Includes state code, job filename, progress %, layer, temperatures (nozzle / bed / chamber), fan speeds, and the raw SDCP payload.
DESTRUCTIVE. Pause the current print. Ask the user before invoking.
set_print_speed mode parameter lacks enum constraint; description mentions valid values textually ('silent', 'balanced', 'sport', 'ludicrous', 50/100/130/160) but no formal enum in schema. LLM may hallucinate invalid values.
Error handling lacks recovery guidance. Most tools (get_status, get_attributes, start_print, etc.) provide no actionable error messages or suggestions. If a tool fails, the LLM has no next step.
Output schemas not formally documented. Tools return dicts (e.g., get_status returns a complex nested dict with 'host', 'state', 'temperatures', 'position', 'fans', 'raw') but no TypedDict or formal return type annotation visible in MCP registration. Clients must infer structure from usage.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Resume a paused print.
Set fan speeds (0..100% each). Pass any subset; omitted fans are untouched. ``chamber`` is the chamber/box fan. At least one of the three must be provided.
Set the print-speed mode. Only effective while a print is running. ``mode`` is one of ``"silent"``, ``"balanced"``, ``"sport"``, ``"ludicrous"``, or the corresponding ``PrintSpeedPct`` value (``50``, ``100``, ``130``, ``160``). Arbitrary intermediate values are rejected by the firmware.
Set nozzle, bed, and/or chamber temperatures (°C). Pass any subset; omitted targets are untouched.
DESTRUCTIVE. Start a print of ``filename`` (already on the printer). Requires a file that has been uploaded to the printer. ``storage`` is ``"local"`` (default) or ``"udisk"``. Ask the user for confirmation before invoking — running a print unattended is the user's risk.
DESTRUCTIVE. Stop the current print. Ask the user before invoking.
Upload a local file to the printer's internal storage (chunked HTTP). ``local_path`` is a path on this machine (where the MCP server runs). Returns the name the file has on the printer, which ``start_print`` expects. Set ``start=True`` to begin printing it immediately — DESTRUCTIVE, ask the user first if so. Transfers over HTTP, independent of the control channel.
Confirmation/dry-run pattern absent for destructive operations. start_print, stop_print are marked DESTRUCTIVE but provide no dry-run or confirmation step. Description asks for user confirmation (e.g., 'Ask the user before invoking') but tool itself cannot enforce this; relies on agent behavior.
set_fan_speed and set_temperatures lack validation that at least one parameter is provided. Description states 'At least one of the three must be provided' for set_fan_speed but no schema-level validation (e.g., minProperties) enforces this. Tool may silently accept empty call and do nothing.
discover_printers returns untyped list[dict[str, Any]]. Schema does not document the structure of each printer dict (fields: host, mainboard_id, name, machine_name, firmware_version). Clients must reverse-engineer from code.