centauri-mcp

centauri-mcp

MCP server for the Elegoo Centauri Carbon 3D printer that enables monitoring, control, and notifications via the SDCP 3.0 protocol over the local network.

Category
Visit Server

README

centauri-mcp

MCP server for the Elegoo Centauri Carbon 3D printer, built on the SDCP 3.0 protocol as documented by the OpenCentauri project (docs/software/api.md). Works over the local network — no cloud.

Features

Read-only (no approval needed)

Tool Description
discover_printers UDP broadcast discovery (port 3000)
get_status Temps, position, fans, lights, live print progress
get_attributes Firmware, build volume, capabilities, storage
list_files Files on /local/ or /usb/ storage
get_print_history Past jobs with decoded failure reasons + fixes
get_print_stats Success rate, print hours, failure-cause breakdown
get_timelapse Per-job timelapse video URL / MP4 download
get_recent_events Errors/notices pushed by the printer
decode_error SDCP error code → cause + suggested fix
get_monitor_status Monitor state and log

Control (annotated so MCP clients require approval)

Tool Description
start_print Start a file; start_layer resumes a failed print mid-way
pause_print / resume_print Pause/resume the active job
stop_print Cancel (irreversible; requires confirm=true)
skip_preheating / stop_material_feeding Phase controls
set_speed_profile silent/balanced/sport/ludicrous or a raw %
set_fan_speeds Part-cooling / auxiliary / chamber fans individually
set_timelapse Enable/disable timelapse recording
set_printer_name Rename the printer
upload_gcode / send_and_print MD5-verified HTTP upload (± auto-start)
delete_files Permanent delete (requires confirm=true)
get_snapshot Chamber-camera JPEG (toggles the single video stream slot)
start_monitor / stop_monitor Start/stop the detached watcher (stop_after_print for one-shot)
set_pushover_credentials Save Pushover keys for the watcher
set_notification_settings Global priority and sound for all alerts
get_notification_settings Current settings + all valid options (read-only)
send_test_notification Verify the notification path end to end

Notification priority and sound

One global setting covers every alert the watcher sends — there is no per-event configuration:

set_notification_settings(priority=1, sound="cosmic")

Either argument may be given alone; the other is left unchanged. Settings are re-read on every send, so a running watcher picks up changes without a restart.

Priority Behavior
-2 Lowest — no notification, badge only
-1 Low — no sound or vibration
0 Normal — default alert
1 High — bypasses quiet hours
2 Emergency — repeats until acknowledged (retry/expire added automatically)

Sounds: pushover, bike, bugle, cashregister, classical, cosmic, falling, gamelan, incoming, intermission, magic, mechanical, pianobar, siren, spacealarm, tugboat, alien, climb, persistent, echo, updown, vibrate, none.

With nothing set, priority falls back to per-event defaults (pause and printer errors high, stop and complete normal) and the sound is your Pushover account default. Setting a global priority overrides those defaults everywhere.

Environment equivalents: PUSHOVER_PRIORITY, PUSHOVER_SOUND (the config file wins if both are present).

The watcher

start_monitor spawns centauri_mcp.watcher as a detached process. It outlives the MCP server and your client session, so alerts still arrive hours into a print with nothing open.

It holds a WebSocket to the printer and reacts to every pushed status message rather than polling a cache — a brief Complete -> Idle transition cannot slip between samples. Notifications fire on:

Event Pushover priority
Print paused (with reason when the printer reports one) 1
Print stopped 0
Print complete 0
Printer error pushed on sdcp/error 1

Each carries filename, layer, percent complete, and a camera snapshot unless started with with_snapshots=false.

Continuous vs one-shot

By default the watcher is continuous: after notifying you it keeps running, so subsequent prints are covered too. It stops only on stop_monitor, the stop flag, a kill, or a reboot.

Pass stop_after_print=true for one-shot mode — it shuts itself down once the print reaches Complete or Stopped, after the notification has been sent. A pause does not end it, since the print can still resume.

start_monitor(stop_after_print=True)

Run it standalone (e.g. from Task Scheduler at logon, so it covers prints started from the printer's own screen):

python -m centauri_mcp.watcher --ip 192.168.1.50
python -m centauri_mcp.watcher --ip 192.168.1.50 --exit-on-complete

State lives in ~/.centauri-mcp/:

File Purpose
watcher_state.json Live state + heartbeat, read by get_monitor_status
watcher.log Human-readable event log
watcher.pid Liveness check / stop target
watcher.stop Touch to request a graceful exit
pushover.json Credentials, when not supplied via env

Override the directory with CENTAURI_MCP_HOME. It deliberately avoids %LOCALAPPDATA%: the Microsoft Store build of Python virtualizes AppData into a per-package sandbox, which hides these files from you and from any other interpreter.

Install

git clone https://github.com/blanders2/centauri-mcp.git
cd centauri-mcp
pip install -e .

Register with Claude Code:

claude mcp add centauri-carbon -- python -m centauri_mcp.server

Configuration (environment variables, all optional)

  • CENTAURI_IP — printer IP; skips discovery (recommended if your printer has a DHCP reservation). Without it, the first discovered printer is used.
  • PUSHOVER_TOKEN / PUSHOVER_USER — enables phone notifications from the watcher (print complete / paused / stopped / errors, with camera snapshot attached). The detached watcher inherits these from the MCP server; to run it independently at boot, use set_pushover_credentials instead, which writes ~/.centauri-mcp/pushover.json.
  • CENTAURI_MCP_HOME — override the watcher's state directory.

Example registration with env vars:

claude mcp add centauri-carbon -e CENTAURI_IP=192.168.1.50 -e PUSHOVER_TOKEN=xxx -e PUSHOVER_USER=yyy -- python -m centauri_mcp.server

Safety design

  • Tools that can affect a running print carry MCP annotations (readOnlyHint: false, and destructiveHint: true for stop/delete), so clients prompt for approval before running them.
  • stop_print and delete_files additionally require an explicit confirm=true argument — a bare call refuses and explains why.
  • The dangerous reverse-engineered config G-codes (M8803/M8807, which can brick the printer) are deliberately not exposed.
  • The printer allows only one concurrent MJPEG stream; get_snapshot enables the stream, grabs one frame, and releases it.

Protocol notes

  • WebSocket JSON on ws://<ip>:3030/websocket; UDP discovery M99999 on port 3000; MJPEG camera on port 3031; HTTP multipart upload with MD5 check.
  • Several SDCP field names are misspelled in the protocol itself (CurrenCoord, RelaseFilmState, ...) — the client handles both spellings.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured