pycentauri MCP server

pycentauri MCP server

An MCP server that enables AI agents to monitor and control an Elegoo Centauri Carbon 3D printer via local network, supporting status checks, snapshots, and print control.

Category
访问服务器

README

pycentauri

Local-network toolkit for the Elegoo Centauri Carbon 3D printer. Python library, CLI, MCP server, REST/SSE server, built-in web UI, and an RTSP bridge — all powered by the same async client.

pycentauri speaks the printer's native SDCP v3 protocol over its local WebSocket (port 3030) — no cloud account required. It exposes six surfaces:

  1. An async Python library for direct integration.
  2. A centauri CLI for quick status checks, snapshots, and control.
  3. An MCP server so AI agents (Claude Code, Claude Desktop, Cursor, any MCP-compatible client) can monitor and drive the printer as a tool.
  4. An HTTP + SSE server for dashboards, reverse-proxy integration, and anything that wants a plain REST API.
  5. A built-in web UI (industrial instrument-panel theme, mobile-friendly) served at /ui/ by the HTTP server.
  6. An RTSP bridge that re-streams the printer's MJPEG webcam as H.264/RTSP for Home Assistant, Jellyfin, VLC, Frigate, and NVRs.

Status: alpha. The protocol has been reverse-engineered from the official elegoo-link C++ SDK and the CentauriLink project. It works against the original Centauri Carbon on current firmware (tested on V1.1.46). The newer Centauri Carbon 2 (which uses MQTT) is not supported.

Install

pip install pycentauri                    # library + CLI
pip install "pycentauri[mcp]"             # + MCP server
pip install "pycentauri[server]"          # + HTTP REST/SSE server + web UI
pip install "pycentauri[mcp,server]"      # all Python surfaces

The RTSP bridge additionally requires MediaMTX and ffmpeg on $PATH — see the RTSP section below for install hints.

Quick start — CLI

# Find printers on your LAN
centauri discover

# One-shot status (pretty or JSON)
centauri status --host 192.168.1.209
centauri status --host 192.168.1.209 --json

# Stream live status updates
centauri watch --host 192.168.1.209

# Grab a webcam snapshot
centauri snapshot --host 192.168.1.209 shot.jpg

# Printer attributes (model, firmware, mainboard ID, capabilities)
centauri attributes --host 192.168.1.209

# Control actions — require --enable-control
centauri print start cube.gcode --host 192.168.1.209 --enable-control
centauri print pause            --host 192.168.1.209 --enable-control
centauri print resume           --host 192.168.1.209 --enable-control
centauri print stop             --host 192.168.1.209 --enable-control

The host can also come from the PYCENTAURI_HOST environment variable. If neither is set, every command auto-discovers via a 2.5 s UDP broadcast and bails out if it finds zero or more than one printer.

Quick start — Python

import asyncio
from pycentauri import Printer

async def main():
    async with await Printer.connect("192.168.1.209") as printer:
        status = await printer.status()
        print(status.print_status, status.progress, status.temp_nozzle)

        jpeg = await printer.snapshot()
        with open("shot.jpg", "wb") as f:
            f.write(jpeg)

        async for update in printer.watch():
            print(update.print_status, update.progress)

asyncio.run(main())

Control actions (start_print, pause, resume, stop) require Printer.connect(..., enable_control=True).

Quick start — HTTP server

# Read-only, bound to loopback so only this box can hit it:
centauri server --host 192.168.1.209 --port 8787

# Read + write + RTSP, bound to all interfaces (put a reverse proxy in front):
centauri server --host 192.168.1.209 --bind 0.0.0.0 --port 8787 \
                --enable-control --rtsp
Method Path Notes
GET / Redirects to /ui/
GET /ui/ Built-in web dashboard
GET /api/info Health + version (JSON)
GET /status Latest status push (cached; updates every ~5 s)
GET /attributes Printer attributes
GET /snapshot image/jpeg response
GET /stream MJPEG stream proxied from the printer (embeds in <img>)
GET /discover LAN scan
GET /events/status Server-Sent Events stream of pushes
GET /api/rtsp RTSP bridge state (when --rtsp is set)
POST /api/rtsp/{start,stop} Start/stop the RTSP bridge (when --rtsp is set)
GET /docs / /redoc Auto-generated OpenAPI docs
POST /print/start Body: {"filename": "cube.gcode"}. Requires --enable-control.
POST /print/{pause,resume,stop} Requires --enable-control.

The server holds a single long-lived WebSocket to the printer and reuses it for every request — no per-request reconnect, and it won't bump into the firmware's 5-slot limit.

Quick start — RTSP bridge

# Install system dependencies first:
#   mediamtx  https://github.com/bluenviron/mediamtx/releases  (or `brew install mediamtx`)
#   ffmpeg    `brew install ffmpeg` or `apt install ffmpeg`

# Standalone: foreground, Ctrl-C to stop
centauri rtsp --host 192.168.1.209
# → rtsp://<this-host>:8554/printer

# Or, integrated with the HTTP server + web UI
centauri server --host 192.168.1.209 --rtsp --bind 0.0.0.0
# The web UI gains a STREAM panel with a start/stop toggle, a copy-URL button,
# and live status: http://<this-host>:8787/ui/

Open that URL in VLC (Media → Open Network Stream), point Home Assistant at it via the Generic Camera integration, or feed it to Frigate / Jellyfin / Synology Surveillance for NVR recording and motion detection.

MediaMTX runs the ffmpeg transcode only while at least one client is actually connected, so idle cost is zero. Tunable flags: --fps, --bitrate, --preset, --path, --port, --bind (standalone), or --rtsp-fps, --rtsp-bitrate, --rtsp-path, --rtsp-port, --rtsp-bind (on centauri server). Run centauri rtsp --help or centauri server --help for the full list.

Quick start — MCP

Register the server with your agent. With Claude Code:

claude mcp add pycentauri --env PYCENTAURI_HOST=192.168.1.209 \
    -- python -m pycentauri.mcp

# Or, with control actions enabled (gives the agent start/pause/resume/stop):
claude mcp add pycentauri --env PYCENTAURI_HOST=192.168.1.209 \
    -- python -m pycentauri.mcp --enable-control

Setting PYCENTAURI_HOST in the MCP server's launch env means the agent can't be tricked into targeting an arbitrary IP through prompt injection — the host is pinned at spawn time. Tools exposed:

Tool Always available Description
get_status yes State, temperatures, progress, elapsed/remaining
get_attributes yes Model, firmware, mainboard ID, capabilities
get_snapshot yes Webcam frame as MCP Image content (LLMs see the picture)
discover_printers yes LAN scan
start_print only with --enable-control Starts a print from a file already on the printer
pause_print only with --enable-control Pauses the current print
resume_print only with --enable-control Resumes a paused print
stop_print only with --enable-control Stops the current print

Control tools aren't just gated — they're not registered without the flag, so an LLM that wasn't given the --enable-control launch can't see them in the tool list at all.

Safety

Printer control actions are gated behind an explicit enable_control=True (library) or --enable-control flag (CLI / MCP). Destructive MCP tools aren't registered when the flag is off, so an LLM never sees them. Still: leaving a printer running unattended with write-capable agents is your responsibility, as is securing the HTTP surface (it's unauthenticated — put a reverse proxy with auth in front if you expose it beyond loopback).

The RTSP bridge itself isn't gated by --enable-control because it only reads the webcam feed and doesn't change printer state; it's enabled per-server via the --rtsp flag.

Known firmware quirks

  • 5 concurrent WebSocket connections max. The printer's SDCP server accepts up to 5 open WebSockets on port 3030; the 6th returns HTTP 500 with body "too many client". Slots release immediately when a connection closes — the CLI each opens and closes one per invocation, the HTTP and MCP servers hold a single long-lived one, so this is almost never a problem in practice.
  • Paused / errored states don't auto-push Attributes. The printer only sends its Attributes frame spontaneously while idle or printing. In paused and errored states it stays silent until asked. Since every SDCP command needs the printer's MainboardID, the client handles this by pre-seeding the mainboard ID from a UDP discovery on every connect (as of v0.1.1). If you call Printer.connect() directly without discovery, pass mainboard_id= yourself.

Credits & licensing

  • Protocol reference: elegoo-link (Apache-2.0) and CentauriLink.
  • pycentauri is licensed under Apache-2.0. See LICENSE.
  • Not affiliated with or endorsed by Elegoo.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选