
Company News
Free Business Plan Upgrades for Open Source Maintainers
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.
@cyanheads/pixoo-mcp-server
Advanced tools
Render and push styled pixel art, text, dashboards, and animations to Divoom Pixoo LED displays on your local network via MCP. STDIO or Streamable HTTP.
Render and push styled pixel art, text, dashboards, and animations to Divoom Pixoo LED displays on your local network via MCP. STDIO or Streamable HTTP.
Seven tools covering the full display pipeline — from quick styled text to full layered scene composition, device control, and initial setup:
| Tool | Description |
|---|---|
pixoo_display_text | Render styled text (theme, gradient, shadow, outline, auto-fit) onto the display and push it. Returns the rendered frame as an image. |
pixoo_compose_scene | Compose a full scene: layered elements (text, icons, widgets, shapes, bitmaps, images, sprites) with per-element effects and keyframes, static or animated. Returns the rendered scene as an image. |
pixoo_push_image | Load an image (absolute local path or https URL), resize it to the LED grid, and push it. Returns the downsampled result as an image. |
pixoo_overlay_text | Set or clear a device-native scrolling text overlay. Uses device-rendered fonts; overlays persist across channel switches until cleared. |
pixoo_control_device | Read or change device state: brightness, screen on/off, channel, or clock face. Call with no params for a status read. |
pixoo_discover_devices | Find Pixoo devices on the local network via Divoom's cloud discovery endpoint. Run once during setup to find device IPs. |
pixoo_design_brief | Return craft guidance and live device context for a design topic. Covers legibility rules, palette discipline, layout zones, animation budget, and pre-filled next-tool suggestions. |
pixoo_display_textThe primary tool for text-only display. Covers the 80% case — styled text with quality defaults.
midnight, ember, claude, ice, neon, forest, mono)ember, ice, neon, fire, lavender, claude, mono), drop shadow, 1px outline for legibility, integer scale multiplier for block-letter weightx: "center", y: "bottom" — no manual pixel mathlayout[]pixoo_compose_sceneFull scene composition with the complete element vocabulary.
text, icon, rect, circle, line, progress, sparkline, bitmap, pixels, image, spriteprogress bar with gradient fill and optional label; sparkline mini chart (line or bar, auto-scaled)float, scroll-left, scroll-right, pulse, blink, twinkle, drift, fade-in, fade-out) or raw keyframe arrays — 1–40 frames, configurable speedvisible flag; images at https URLs fetched server-side to a temp filepixoo_push_imagePush any image to the display with control over the downsampling.
contain (letterbox), cover (crop to fill), fill (stretch)nearest for pixel art, lanczos3 for photos, mitchell for a balancepixoo_overlay_textDevice-native scrolling text overlay — persists across channel switches.
mode: "clear" — overlays survive channel changes until explicitly removedpixoo_display_textpixoo_design_briefThe orientation tool. Run before authoring any scene to get grounded in 64px craft constraints.
text, scene, dashboard, animation, pixel-art, troubleshootingnextToolSuggestions with ready-to-use arguments based on current device state| Type | Name | Description |
|---|---|---|
| Resource | pixoo://device/status | Live snapshot of the connected Pixoo display: reachable, channel, brightness, screen state, and display size |
| Resource | pixoo://reference/themes | Theme and palette registry with background gradients, default text palettes, accent colors, and swatch values |
| Resource | pixoo://reference/icons | Built-in icon names organized by category (weather, arrows, status, media) |
| Resource | pixoo://reference/design-guide | Long-form 64px craft guide: legibility floors, palette discipline, layout zones, animation budget, and known device behaviors |
All resource data is also reachable via tools. pixoo_design_brief surfaces the design guide content per topic; pixoo_control_device returns live device state equivalent to pixoo://device/status.
Built on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1Pixoo-specific:
@cyanheads/pixoo-toolkit) — the device receives final RGB frames, never raw drawing commandsPixooResult checked — pushed: true means the device acknowledged with error_code: 0, never "I tried"sharp image processing doesn't run on Cloudflare WorkersAgent-friendly output:
layout[] so agents can inspect and refinepushed reflects the device ACK; deviceState post-push flags visibility issues (screen off, brightness ≤ 10, wrong channel) as enrichment notices rather than failuresRequirements: A Divoom Pixoo display (Pixoo-64, Pixoo-32, or Pixoo-16) on the same local network as the server. Run pixoo_discover_devices to find its IP, then set PIXOO_IP in your server configuration.
Add the following to your MCP client configuration file:
{
"mcpServers": {
"pixoo-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/pixoo-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"PIXOO_IP": "192.168.1.50"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"pixoo-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/pixoo-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"PIXOO_IP": "192.168.1.50"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"pixoo-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "PIXOO_IP=192.168.1.50",
"ghcr.io/cyanheads/pixoo-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 PIXOO_IP=192.168.1.50 bun run start:http
# Server listens at http://localhost:3010/mcp
push: false) work without a configured device.git clone https://github.com/cyanheads/pixoo-mcp-server.git
cd pixoo-mcp-server
bun install
cp .env.example .env
# edit .env and set PIXOO_IP
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
| Variable | Description | Default |
|---|---|---|
PIXOO_IP | Device IP address on the local network. Required for device tools (pixoo_display_text, pixoo_compose_scene, pixoo_push_image, pixoo_overlay_text, pixoo_control_device). Discovery and pure-render (push: false) work without it. | — |
PIXOO_SIZE | Display size in pixels: 16, 32, or 64. | 64 |
PIXOO_OUTPUT_DIR | Directory for auto-saving preview PNG and GIF files. When unset, previews are returned in-response only. | — |
PIXOO_PUSH_MIN_INTERVAL_MS | Minimum interval between device pushes in milliseconds. Prevents device freeze from rapid-fire commands. | 1000 |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation (spans, metrics, completion logs). | false |
See .env.example for the full list of optional overrides.
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against spec
docker build -t pixoo-mcp-server .
docker run --rm -e PIXOO_IP=192.168.1.50 -p 3010:3010 pixoo-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/pixoo-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Path | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools/resources and initializes the Pixoo service. |
src/config/ | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools/ | Tool definitions (*.tool.ts). |
src/mcp-server/resources/ | Resource definitions (*.resource.ts). |
src/services/pixoo/ | PixooService — wraps @cyanheads/pixoo-toolkit, handles pacing, result mapping, and device state. |
src/renderer/ | Pure rendering pipeline: element renderers, styled-text engine, themes, icons, effect compiler, preview encoding. No device dependency. |
tests/ | Unit and integration tests mirroring src/. |
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/renderer/) is pure — no device dependency, testable without hardwarePixooService; every PixooResult is checkedIssues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
FAQs
Render and push styled pixel art, text, dashboards, and animations to Divoom Pixoo LED displays on your local network via MCP. STDIO or Streamable HTTP.
The npm package @cyanheads/pixoo-mcp-server receives a total of 45 weekly downloads. As such, @cyanheads/pixoo-mcp-server popularity was classified as not popular.
We found that @cyanheads/pixoo-mcp-server demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.