pixoo-mcp-server について
pixoo-mcp-serverは、ローカルネットワーク上のDivoom Pixoo LEDディスプレイにテキスト、シーン、画像、HTML、アニメーションを送信し、デバイス状態も読み取り・変更できます。ピクセルアートや小型ダッシュボードの作成に向いています。
主な機能
- 01テーマ付きテキストとアニメーションの描画
- 02レイヤー付きシーンと図形の合成
- 03画像とアニメーションファイルの送信
- 04ディスプレイ向けHTMLページの描画
- 05デバイス状態の確認と制御
活用シーン
- 01Pixooディスプレイへの情報表示
- 02ピクセルアートのダッシュボードやアニメーション制作
- 03明るさ、チャンネル、画面状態の調整
MCP 対応
STDIOまたはStreamable HTTP経由で、MCPクライアントに8つのツールと4つのリソースを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @cyanheads/pixoo-mcp-serverPIXOO_IPDevice IP address on the local network (e.g. 192.168.1.50). Required for device tools; discovery and pure-render (push: false) work without it.PIXOO_SIZEDisplay size in pixels: 16, 32, or 64. Must match the physical device.PIXOO_OUTPUT_DIRDirectory for auto-saving preview PNG and GIF files. When unset, previews are returned in-response only.PIXOO_PUSH_MIN_INTERVAL_MSMinimum interval between device pushes in milliseconds. Prevents device freeze from rapid-fire commands.PIXOO_SERVE_HOSTHost advertised in the URL the device downloads an animation of more than 40 frames from, for NAT or a DNS name. When unset, the local address the OS routes to PIXOO_IP; the listener binds that address either way.PIXOO_SERVE_PORTFixed port for the listener the device downloads an animation of more than 40 frames from, for firewall rules. When unset, a free port.PIXOO_BROWSER_PATHBrowser executable for HTML rendering, such as the chrome-headless-shell that `npx @puppeteer/browsers install chrome-headless-shell@stable --path <dir>` installs. When set, the only browser tried: a path that is not an executable file fails rather than falling back. When unset, the newest chrome-headless-shell in Puppeteer's cache (~/.cache/puppeteer).PIXOO_HTML_ENABLEDOffer pixoo_render_html. false (or 0, no, off) disables it, removing it from tools/list; unset or true keeps it. A value that is not one of those boolean spellings fails startup.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEシークレットAuthentication mode to use: 'none', 'jwt', or 'oauth'.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
8掲載時のツール一覧 · 4 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| font | enum | いいえ | フォントのバリエーション。指定されたものをそのまま使用します。テキストが幅を超える場合、フォントは切り替わらず、はみ出します。standard(5×7)または compact(3×5)は、印字可能な ASCII と ° ← ↑ → ↓ ▲ ▼ ♥ · … に対応します。または numerals(時計や読み取り表示用の 11×18 数字)を指定できます。描画できるのは 0–9、空白、: . - + / % ° ? のみのため、それ以外の文字を含むテキストは拒否されます。省略した場合、1 行テキストでは standard を試し、幅を超えると compact に切り替えます。複数行テキストでは standard を使用します。standard | compact | numerals |
| push | boolean | いいえ | 描画したフレームをデバイスに送信します(デフォルト:true)。 |
| text | any | はい | 表示するテキスト。文字列または行の配列です。 |
| align | enum | いいえ | 複数行テキスト:最も幅の広い行に合わせて各行を整列し、そのブロックを position.x に配置します。省略すると、各行をそれぞれの position.x に配置します。left | center | right |
| style | object | いいえ | テキストスタイル:パレット、影、アウトライン、拡大率。 |
| style.color | string | いいえ | パレットを使用しない場合の単色。 |
| style.scale | integer | いいえ | 整数のピクセル拡大率(1 = 通常、2 = 太いブロック体)。 |
| style.shadow | boolean | いいえ | テキストの背後に付けるドロップシャドウ。 |
| style.outline | boolean | いいえ | 読みやすさを高める 1px のコントラストのあるアウトライン。 |
| style.palette | any | いいえ | 垂直方向のカラ―ランプに使用する名前付きパレットまたはカスタムグラデーションの停止点。 |
| theme | enum | いいえ | 名前付きシーンテーマ — 背景グラデーションとデフォルトのテキストパレットを設定します。midnight | ember | claude | ice | neon | forest | mono |
| effect | enum | いいえ | アニメーション効果。scroll は最大 40 フレームでテキストをディスプレイ上に 1 回スクロールします。auto はテキストが表示範囲に収まらない場合にのみスクロールします。float(ゆるやかな上下動)と pulse(明るさの呼吸)は 20 フレームでループします。アニメーション結果はアニメーションとしてプッシュされ、各フレームのグリッドでプレビューされます。none を指定するか省略すると、静止フレームを 1 枚レンダリングします。none | auto | scroll | float | pulse |
| position | object | いいえ | ディスプレイ上のテキストの位置。 |
| position.x | any | いいえ | X 位置または配置(デフォルト:中央)。 |
| position.y | any | いいえ | Y 位置または配置(デフォルト:中央)。 |
| background | any | いいえ | 背景色またはグラデーション。設定するとテーマの背景を上書きします。 |
| brightness | integer | いいえ | プッシュ前にデバイスの明るさを設定します(0–100)。失敗してもエラーではなく警告になります。 |
詳細
@cyanheads/pixoo-mcp-server
MCP を介して、ローカルネットワーク上の Divoom Pixoo LED ディスプレイに、スタイル付きのピクセルアート、テキスト、ダッシュボード、アニメーションをレンダリングして送信します。STDIO または Streamable HTTP に対応しています。
概要
ローカルネットワーク上の Divoom Pixoo LED マトリックスディスプレイに対応しています。主な対象は Pixoo-64 ですが、16 と 32 もサポートしています。スタイル付きテキスト、レイヤー化されたシーン、ダッシュボード、アニメーション、HTML ページをレンダリングして送信したり、デバイスの状態を読み取って変更したりできます。
ツール
| ツール | 説明 |
|---|---|
pixoo_display_text | テーマ、グラデーション、シャドウ、自動フィットを使ってスタイル付きテキストをレンダリングし、静止画またはアニメーションとして送信します |
pixoo_compose_scene | テキスト、アイコン、ウィジェット、図形、ビットマップ、画像、スプライトを重ねたシーンを作成します。静止画とアニメーションに対応しています |
pixoo_push_image | ローカル画像または https 画像を LED グリッドに合わせてリサイズして送信します。アニメーション GIF または WebP はアニメーションとして送信します |
pixoo_render_html | HTML ページ(CSS、SVG、Canvas、WebGL)を、パネルサイズに合わせてヘッドレスブラウザーでレンダリングし、静止画または仮想時計に基づくフレーム単位のアニメーションとして送信します |
pixoo_overlay_text | デバイスでレンダリングされるスクロールテキストのオーバーレイを設定または解除します |
pixoo_control_device | 明るさ、画面の状態、チャンネル、時計盤を読み取ったり変更したりします |
pixoo_discover_devices | Divoom のクラウド検出を通じて Pixoo デバイスとその LAN IP アドレスを見つけます |
pixoo_design_brief | デザインのテーマに関するガイダンスを作成します。デバイスの最新状態と、入力済みの次の呼び出しを含みます |
リソース
| リソース | 説明 |
|---|---|
pixoo://device/status | デバイスのライブスナップショット:到達可能性、チャンネル、明るさ、画面の状態、表示サイズ |
pixoo://reference/themes | テーマとパレットの一覧 |
pixoo://reference/icons | カテゴリ別の組み込みアイコン名 |
pixoo://reference/design-guide | 64px ディスプレイ向けの詳細な制作ガイド |
ツールのみを利用するクライアントも、同じ機能を利用できます。pixoo_control_device はデバイスのライブ状態を読み取り、pixoo_design_brief は制作ガイダンス、テーマ名、アイコン名を返します。
機能リファレンス
pixoo_display_text tool
textは文字列または行の配列です。theme(midnight、ember、claude、ice、neon、forest、mono)は背景とデフォルトのパレットを設定します。styleには、paletteのグラデーション(ember、ice、neon、fire、lavender、claude、mono)またはカスタムの{ from, to }に加え、shadow、outline、scale1~8 を指定します。positionは意味的な位置またはピクセル単位の位置で、alignは複数行のテキストを揃えますfont:standard(5×7)とcompact(3×5)は、印字可能な ASCII 文字に加えて° ← ↑ → ↓ ▲ ▼ ♥ · …を描画します。それ以外の文字(€、’、1つの文字列内の改行など)は?として表示され、レスポンスのnoticeにはコードポイントと行インデックスが記載されます。numeralsは時計や数値表示向けの 11×18 の数字フォントで、0~9、スペース、および: . - + / % ° ?を描画します。それ以外の文字を含むテキストは検証に失敗し、該当する文字が示されますlayout[]は各種のフィット判定をactionとして報告します(テキストがコンパクトフォントでのみ収まる場合はshrunk-to-compact、返されるフレームがスクロールする場合はscrolling、それ以外はnone)。また、使用するfontと、各行のボックスがパネルにfitsするかどうかも報告します。1行がパネルの幅を超え、スクロールしない場合は、x 0 から始まり、右端で切り取られます。単一行のテキストは、fontが設定されていない場合、標準フォントからコンパクトフォントに切り替わりますが、numeralsには切り替わりません。テキストがそれでも幅を超える場合、effect: "auto"または"scroll"のときにのみスクロールしますeffect:scrollは最大 40 フレームで1回スクロールし、autoはオーバーフローした場合にのみスクロールします。floatとpulseは 20 フレームにわたってループします。framesはフレーム数を報告し、アニメーションは1つのデバイスアニメーションとして送信されます
pixoo_compose_scene ツール
text(pixoo_display_textと同じ3種類のフォント)、icon、rect、circle、line、progress、sparkline、bitmap、pixels、image(絶対パスまたは https URL。pixoo_push_imageと同じfinishを使用)、sprite(絶対パス)を、背面から前面の順に最大50個のelementsとして描画します。backgroundは単色、v/h/rのグラデーション、またはthemeです- 各要素では
opacity(各ピクセルに固有のアルファ値 ×opacityが適用されるため、ソフトエッジも均等にフェードします)とblend(normal、add(発光や光線向け)、screen、multiply)を指定します。lineと輪郭のみのcircleではstrokeWidthとantialiasを、rectの枠線では内側に広がるstrokeWidthを指定できます。ストロークを描画しない図形にいずれかのフィールドを指定すると、該当フィールド名を示して検証に失敗します layout[]が返されます。各要素の配置ボックス(幅のあるストロークまたはアンチエイリアス処理されたストロークの場合は、描画されるすべてのピクセル)と、パネル内に収まるかどうかが含まれます。要素は指定された順に配置され、再フィットされないため、actionは常にnoneです。絶対パスのoutputを指定すると、PIXOO_OUTPUT_DIRへの自動保存の代わりに、最初のフレームが PNG としてその場所に保存されます。型付きエラー:asset_not_found、invalid_image(読み込まれたもののデコードできない画像またはスプライト)、invalid_color、unknown_icon、invalid_output_path- 要素ごとのエフェクトプリセット(
float、scroll-left、scroll-right、pulse、blink、twinkle、drift、fade-in、fade-out)またはdx、dy、opacity(数値または数値文字列)、visible(true/false)、color(colorを持つあらゆる要素でRGBを通じて補間)の生のanimateキーフレームを使ってアニメーションできます。各トラックには少なくとも1つのキーフレームが必要です。framesは1~800、speedは1フレームあたり10~2000 ms(デフォルトは150)です。40フレームを超えると、シーンはデバイスがこのホストからダウンロードする1つのGIFとして再生され、speedは10 ms単位に丸められます。要素にはeffectまたはanimateのどちらか一方を指定し、両方は指定できません。エフェクトのamplitudeは、float、scroll-*、driftの移動量と、pulseおよびtwinkleの不透明度低下の深さ(0~1)を設定します
pixoo_push_image ツール
sourceはローカルの絶対パスまたは https URL です。ダウンロードサイズの上限は10 MBです。fitはcontain(デフォルト)、cover、fill、kernelはnearest(デフォルト。ピクセルアート向け)、lanczos3(写真向け)、mitchellです- ファイル名にかかわらず、アニメーション GIF または WebP としてデコードされるソースは、最大
maxFramesフレーム(1~800、デフォルトは40)のアニメーションとして送信されます。長いソースは均等にサンプリングされ、40フレームを超えると、デバイスがこのホストからダウンロードする1つのGIFとして再生されます。再生時間は、ソース全体の再生時間を送信フレーム数で割ったもの(ソースに遅延時間の記録がない場合は150 ms)か、speed(1フレームあたり10~2000 ms)です。frames、sourceFrames、speedは送信された内容を示します finishを指定すると、送信前に画像がパレットに減色されます。colors(画像から生成。2~256色)またはpalette(16進数または名前付きカラー。1~256色)のどちらか一方を指定し、さらにdither(none、bayer4、floyd-steinberg)を指定します。透明ピクセルは消灯したままになり、アニメーションのcolorsパレットはすべてのフレームで共有されます- 読み取れないパスまたは URL は
asset_not_found、読み込まれたもののデコードできないソース(テキストファイル、HTMLページ、不完全なダウンロード)はinvalid_image、解決できないfinishのパレット項目はinvalid_colorとして失敗します。プレビューにはデバイスが受信するフレームそのもの、またはアニメーションのフレーム一覧がグリッドで表示されます
pixoo_render_html tool
-
htmlは完全なドキュメントまたは本文フラグメントで、最大500,000文字です。CSSピクセル1つをLED 1個に対応させた正方形のビューポートにレイアウトされます。ページがパネルになります。bodyに余白はなく、スクロールバーは非表示で、背景を描画しないページは黒(消灯)でレンダリングされます。ページ独自のCSSが各LEDを上書きします -
framesは1~800(デフォルトは1)、speedはフレームあたり10~2000 ms(デフォルトは150)です。各フレームで仮想時計がspeedだけ進みます。ページで定義されている場合、window.render(t, frame)は各キャプチャの前に実行され、t = frame / framesとなるため、周期的な動きはシームレスにループします。requestAnimationFrame、setTimeout/setInterval(ネストされたタイマーと繰り返しタイマーでは最小4 ms)、Date(実際の時刻から開始)、performance.now()(読み込み時に0)は同じ時計に従い、CSSアニメーションもその時刻に一時停止してシークされるため、すべてのフレームが決定論的に描画されます。requestIdleCallbackと iframe は実時間のままです。40フレームを超えると、pixoo_compose_sceneと同様に、デバイスがこのホストからダウンロードするGIFとしてページが再生されます -
samplingはnative(デフォルト)またはsupersampleです。後者は8倍の解像度でレンダリングし、各LEDにエリア平均化して、変形、テキスト、SVG、canvasを滑らかにします。Chromiumは拡大縮小の前に通常のボックスの端をCSSピクセル単位の整数にスナップするため、left: 0.5pxのボックスも1つのLED上に配置されます。サブピクセル移動にはtransformを使用してください。finishにはpixoo_push_imageと同じパレット縮小が適用され、プレビューの前に処理されます -
ネットワークからの読み込みは行われず、ワーカーはブロックされます。
pageErrorsはページで捕捉されなかったエラー、console.errorの出力、ブロックされたURL(ブロックされたナビゲーションはBlocked navigation: <url>)を返します。最初の20件がそれぞれ500文字に切り詰められます。window.renderが例外をスローするか拒否された場合は、フレーム番号を示すpage_errorで失敗します。ブラウザーが見つからない場合は、インストール手順を含むbrowser_unavailableで失敗します(前提条件を参照)。render_timeoutとrender_crashedは、それぞれレンダリングが30秒を超えた場合、ブラウザーまたはページがクラッシュした場合を示します。PIXOO_HTML_ENABLED=falseにすると、このツールは無効になります -
すべてのページには、ブラウザーのアンチエイリアスでLED上ににじむのを防ぐ、くっきりしたビットマップテキスト、パレット、アイコン用の
pixooグローバルが、ページ独自のスクリプト実行前に追加されます。pixoo.context()は、ページ上に固定配置されたパネルサイズの透明キャンバスの2Dコンテキストです。pixoo.text(ctx, text, x, y, { font, color, palette, scale, shadow, outline })は、pixoo_display_textのフォントを描画します。pixoo.icon(ctx, name, x, y, { w, h, color, palette })は、レジストリのアイコンを描画します。pixoo.palettesは7つのパレットを、pixoo.sizeはパネルサイズを保持します。
この方法で描画したテキストとアイコンは、どちらのサンプリングモードでも
pixoo_compose_sceneとピクセル単位で一致します。不明なパレット、アイコン、色が指定されると、その名前を示す例外が発生します。<script> const ctx = pixoo.context(); pixoo.text(ctx, 'HELLO', 'center', 4, { palette: 'ember', scale: 2, shadow: true }); pixoo.icon(ctx, 'check-circle', 50, 50, { color: 'green' }); </script> -
トピックを
htmlにしたpixoo_design_briefでは、ループ、時計、サンプリング、pixooランタイム、64 pxでの読みやすさを扱います。ループごとにパネルを1周するドットの例:
{
"html": "<svg viewBox=\"0 0 64 64\" style=\"display:block;width:100vw;height:100vh\"><circle id=\"dot\" r=\"6\" fill=\"#ffb000\"/></svg><script>const dot = document.getElementById('dot'); window.render = (t) => { const a = 2 * Math.PI * t; dot.setAttribute('cx', 32 + 20 * Math.cos(a)); dot.setAttribute('cy', 32 + 20 * Math.sin(a)); };</script>",
"frames": 20,
"speed": 100,
"sampling": "supersample"
}
pixoo_overlay_text tool
- 20個のスロットのいずれか(
id0~19)でmode: "set"または"clear"を指定します。setではtextが必須です。また、デバイスのfontID(0~114)、PIXOO_SIZE内のx/y、color、speed(0~100)、direction、align、widthを指定できます acknowledged、mode、idを返します。オーバーレイはデバイスでレンダリングされるため、プレビューはありません。消去するまでチャンネルを切り替えても表示され続けます
pixoo_control_device tool
- パラメーターなしの場合は状態を読み取ります。
brightness(0~100)、screen(on/off)、channel(faces/cloud/visualizer/custom)、clockFaceIdのいずれかを指定すると、読み取り結果を返す前に適用されます reachable、channel、brightness、screenOn、clockId(到達不能な場合は省略)とappliedを返します。設定に失敗した項目はappliedから除外され、呼び出し自体を失敗させるのではなく、通知に項目名が記載されます
pixoo_discover_devices ツール
- Divoom のクラウドエンドポイント(
app.divoom-gz.com)に問い合わせるため、インターネットアクセスが必要です。timeoutMsは 1000~30000(デフォルトは 5000)です。 - 各デバイスの
name、id、ipを返します。PIXOO_IPが設定されている場合、configuredIpFoundは一致したかどうかを示します。エンドポイントに到達できない場合はdiscovery_failedで失敗します。
pixoo_design_brief ツール
topic:text、scene、dashboard、animation、pixel-art、html、troubleshootingのいずれかです。到達可能なデバイスがなくても動作します。- Markdown 形式の
craftGuidance、ライブのdeviceContext、htmlRenderer(利用可能な場合はavailable、PIXOO_HTML_ENABLED=falseの場合はdisabled、ブラウザーを起動せずに検出した場合はno_browser)、トピックとデバイスの状態に合わせて引数が事前入力された{ toolName, reason, args }形式のnextToolSuggestionsに加え、availableThemesとiconCategoriesを返します。
pixoo://device/status リソース
- キャッシュされないライブ読み取り:
reachable、channel、brightness、screenOn、clockId、displaySize、configuredIp - デバイスに到達できない場合や
PIXOO_IPが未設定の場合は、エラーではなくreachable: falseを返します。
pixoo://reference/themes リソース
- 各テーマ(背景、
textPalette、accent、shadow)と各パレット(from/toの停止点)に加え、themeおよびpaletteパラメーター用のthemeNamesとpaletteNamesを返します。 - 静的レジストリで、24 時間キャッシュされます。
pixoo://reference/icons リソース
- 各アイコンの
name、category、viewBoxに加え、カテゴリ(weather、arrows、status、media)ごとのbyCategoryグループを返します。nameはpixoo_compose_sceneのアイコン要素に指定します。 - 静的レジストリで、24 時間キャッシュされます。
pixoo://reference/design-guide リソース
text/markdown:読みやすさの最低基準、パレットの使い方、レイアウトゾーン、アニメーション予算、エフェクトプリセット、ピクセルアートのルール、送信の間隔、既知のデバイス動作を記載しています。- ガイド全体をまとめたドキュメントです。
pixoo_design_briefはトピックごとのガイダンスを返します。24 時間キャッシュされます。
機能
@cyanheads/mcp-ts-core を基盤としています。stdio および Streamable HTTP トランスポート、差し替え可能な認証(none / jwt / oauth)、差し替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレースに対応した構造化ログを備えています。
Pixoo 固有の機能:
- すべての合成処理は、RGBA キャンバスのパイプライン(
@cyanheads/pixoo-toolkit)を使用してホスト上で行われます。デバイスには完成した RGB フレームが送信されます。 - プッシュすると、デバイスはカスタムチャンネルに切り替わります。デバイスのフリーズを防ぐため、プッシュは一度に 1 つずつ、
PIXOO_PUSH_MIN_INTERVAL_MS(デフォルトは 1000)で指定した間隔を空けて実行されます。 - アニメーションのフレーム数が 40 以下の場合、各リクエストで最大 40 フレームをプッシュします。それを超えるフレームのプッシュはデバイスを不安定にします。40 フレームを超える場合、
pixoo_compose_scene、pixoo_push_image、pixoo_render_html(最大 800 フレーム)は、このホスト上の一度限りのリスナーから GIF を 1 つ提供し、デバイスがそれをダウンロードしてループ再生します。そのため、デバイスからこのホストにアクセスできる必要があります。pixoo_display_textは 40 フレーム以内に収まります。
エージェントに適した出力:
- すべてのレンダリングでプレビューを表示します。
pixoo_display_text、pixoo_compose_scene、pixoo_push_image、pixoo_render_htmlは、プッシュの有無にかかわらず、フレームを 8 倍に拡大した PNG 画像ブロックとして返します。そのため、push: falseを使えば、デバイスを接続せずにデザインを確認できます。MCP クライアントによって GIF の表示が異なるため、アニメーションはフレームのグリッドとしてプレビューされます(1 倍サイズのタイルが 512 px のシートに収まる場合はすべてのフレーム、それを超える場合は均等にサンプリングしたフレーム)。GIF 自体はPIXOO_OUTPUT_DIRが設定されている場合に保存されます。保存されるのは、8 倍プレビュー GIF、または 40 フレームを超える場合はデバイスがダウンロードするパネルサイズの GIF です。 - レイアウトの透明性:
layout[]には、フォントのフォールバック、スクロール、各ボックスがパネルに収まるかどうかなど、レンダラーのすべての判断が報告されるため、エージェントはデザインを調整できます。 - デバイスの状態を正確に反映します。
pushedはデバイスの ACK を反映します。40 フレームを超える場合は、再生の ACK とデバイスによる GIF リクエストを反映します(ファイル全体は送信用に OS に渡されます。デバイスは受信を確認しません)。プッシュ後に読み戻されるdeviceStateには、レンダリングが表示されない場合、対処方法を示す通知が付属します(画面がオフ、明るさが 10 以下、カスタムチャンネル以外)。 - プッシュに失敗してもレンダリング結果は保持されます。4 つすべてのレンダリングツールで、型付きエラー(
device_unreachable、device_http_error、device_rejected、gif_serve_failed、no_device_configured)には、保存されたプレビューを示すoutputFilesが含まれます(PIXOO_OUTPUT_DIRのコピー、または未設定の場合は一時ファイル)。
はじめに
PIXOO_IP に Pixoo の LAN アドレスを設定し、以下を MCP クライアントの設定ファイルに追加します。アドレスがわからない場合は、pixoo_discover_devices で検出できます。
{
"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"
}
}
}
}
または npx を使用する場合(Bun は不要です):
{
"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"
}
}
}
}
または 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",
"-e", "PIXOO_SERVE_HOST=192.168.1.20",
"-e", "PIXOO_SERVE_PORT=8765",
"-p", "8765:8765",
"ghcr.io/cyanheads/pixoo-mcp-server:latest"
]
}
}
}
デバイスは 40 フレームを超えるアニメーションをこのホストからダウンロードします。Docker のデフォルトのブリッジネットワークでは、デバイスにルーティングされるアドレスはコンテナ自身のアドレスであり、デバイスからはアクセスできません。上記のように、PIXOO_SERVE_HOST に Docker ホストの LAN アドレスを設定し、固定の PIXOO_SERVE_PORT を公開してください。40 フレーム以下の場合、どちらも必要ありません。
Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動します。
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
前提条件
- Bun v1.4.0 以降(または Node.js v24 以降)。
- ローカルネットワーク上の Divoom Pixoo(Pixoo-64、Pixoo-32、または Pixoo-16)。
- HTML レンダラーを使用する場合は任意:chrome-headless-shell。
npx @puppeteer/browsers install chrome-headless-shell@stable --path ~/.cache/puppeteerを実行すると、サーバーがデフォルトで参照する場所にインストールされます。--path <dir>を指定して別の場所にインストールした場合は、インストール時に表示される実行ファイルのパスをPIXOO_BROWSER_PATHに設定してください。サーバーは、レンダリングに必要な場合にのみ、DevTools ポートを開かずにヘッドレスで起動します。
インストール
- リポジトリをクローンします:
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
設定
| 変数 | 説明 | デフォルト |
|---|---|---|
PIXOO_IP | ローカルネットワーク上のデバイスの IP アドレスです。プッシュ、オーバーレイ、デバイス制御には必須です。検出、デザイン概要、push: false のレンダリングは、この値がなくても動作します。 | — |
PIXOO_SIZE | ディスプレイのサイズ(ピクセル単位)です。16、32、64 のいずれかを指定します。 | 64 |
PIXOO_OUTPUT_DIR | レンダリングツールがプレビュー用の PNG ファイルと GIF ファイルを保存するディレクトリです。相対パスはサーバーの起動元ディレクトリを基準に解決されるため、報告される保存先パスは絶対パスになります。未設定の場合、プレビューはレスポンス内でのみ返されます。 | — |
PIXOO_PUSH_MIN_INTERVAL_MS | デバイスへのプッシュ間の最小間隔(ミリ秒)です。 | 1000 |
PIXOO_SERVE_HOST | 40 フレームを超えるアニメーションをデバイスがダウンロードする URL で、PIXOO_IP へのルーティングに OS が使用するローカルアドレスの代わりに通知されるホストです。リスナーは、いずれの場合もそのルーティング先アドレスにバインドされます。NAT の背後やコンテナー内で実行する場合に設定してください。 | — |
PIXOO_SERVE_PORT | ファイアウォールルールやコンテナーポートの公開に使用する、ダウンロード用のワンショットリスナーの固定ポートです。未設定の場合、再生ごとに空きポートが使われます。 | — |
PIXOO_BROWSER_PATH | HTML レンダリングに使用するブラウザーの実行ファイルです。設定すると、そのブラウザーのみが試されます。実行可能ファイルではないパスを指定すると、フォールバックせずに失敗します。相対パスは起動ディレクトリを基準に解決されます。未設定の場合、Puppeteer のキャッシュ(~/.cache/puppeteer)にある最新の chrome-headless-shell が使用されます。Docker イメージにはブラウザーが含まれていません。 | — |
PIXOO_HTML_ENABLED | pixoo_render_html を提供します。false にすると tools/list から削除されます。ブール値以外を指定すると、起動に失敗します。 | true |
MCP_TRANSPORT_TYPE | トランスポートです。stdio または http を指定します。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモードです。stateless、stateful、auto のいずれかを指定します。ここで値を設定すると、サーバーが宣言する stateless より優先されます。 | stateless |
MCP_AUTH_MODE | 認証方式です。none、jwt、oauth のいずれかを指定します。 | none |
MCP_LOG_LEVEL | ログレベルです(debug、info、warning、error など)。 | info |
LOGS_DIR | ログファイルのディレクトリです(Node.js のみ)。 | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | 失敗したツール呼び出しごとに、引数と結果をログに記録します。キー名による編集が行われ、LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES(デフォルトは 16384)で上限が設定されます。自由形式の値に含まれるシークレットは編集されません。 | false |
OTEL_ENABLED | OpenTelemetry を有効にします。 | false |
省略可能なオーバーライドの全一覧は .env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec # Real-browser suite for the HTML renderer (opt-in; launches the named browser) PIXOO_TEST_BROWSER_PATH=/path/to/chrome-headless-shell bun run test:browser
Docker
docker build -t pixoo-mcp-server .
docker run --rm -e PIXOO_IP=192.168.1.50 -p 3010:3010 \
-e PIXOO_SERVE_HOST=192.168.1.20 -e PIXOO_SERVE_PORT=8765 -p 8765:8765 \
pixoo-mcp-server
PIXOO_SERVE_HOST(Docker ホストの LAN アドレス)と公開された PIXOO_SERVE_PORT を設定すると、上記の stdio 構成と同様に、コンテナー内からデバイスが 40 フレームを超えるアニメーションをダウンロードできます。
Dockerfile では、デフォルトで HTTP トランスポート、ステートレスセッションモードが使用され、ログは /var/log/pixoo-mcp-server に記録されます。OpenTelemetry のピア依存関係はデフォルトでインストールされます。これらを除外するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() エントリーポイント:ツールとリソースを登録し、Pixoo サービスを初期化します。 |
src/config/ | Zod を使用した、サーバー固有の環境変数の解析と検証を行います。 |
src/mcp-server/tools/ | ツール定義(*.tool.ts)、レンダリング後の共通プッシュ処理、共通の finish 入力スキーマを格納します。 |
src/mcp-server/resources/ | リソース定義(*.resource.ts)を格納します。 |
src/services/pixoo/ | PixooService:@cyanheads/pixoo-toolkit をラップし、プッシュ間隔の調整、結果のマッピング、デバイス状態の読み取りを行います。 |
src/services/browser/ | BrowserRenderer:隔離されたヘッドレスの chrome-headless-shell で HTML をレンダリングします。DevTools Protocol のパイプ経由で制御し、パネルフレームとしてキャプチャします。 |
src/renderer/ | デバイスに依存しない純粋なレンダリングパイプラインです。要素レンダラー、スタイル付きテキストエンジン、テーマ、アイコン、エフェクトコンパイラー、パレットの仕上げ、プレビューのエンコード、リモート画像の取得、HTML ページに注入する仮想時計を含みます。 |
tests/ | src/ に対応するユニットテストと統合テストを格納します。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md/AGENTS.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで
try/catchは使用しません - リクエスト単位のログには
ctx.logを、テナント単位のストレージにはctx.stateを使用します - レンダラー(
src/renderer/)は純粋で、デバイスに依存せず、ハードウェアなしでテストできます - デバイスへの呼び出しはすべて
PixooService経由で行います。すべてのPixooResultを確認し、プッシュが成功したと決めつけないでください
コントリビュート
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。