{"_id":"@cyanheads/pixoo-mcp-server","_rev":"12-0e1be1906ce23cabd83be55802f32d1d","name":"@cyanheads/pixoo-mcp-server","dist-tags":{"latest":"1.4.0"},"versions":{"0.3.1":{"name":"@cyanheads/pixoo-mcp-server","version":"0.3.1","keywords":["animation","claude","divoom","divoom-pixoo","iot","led-matrix","mcp","mcp-server","model-context-protocol","pixel-art","pixoo","pixoo-64","rgb-display","smart-display","sprite","typescript"],"author":"cyanheads <casey@caseyjhand.com> (https://github.com/cyanheads)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@0.3.1","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js","@cyanheads/pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"e64e54ec93b07b6d719c32152552ae88510daba3","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-0.3.1.tgz","fileCount":5,"integrity":"sha512-x0IjFgj7hP0n4bRMML+Q7aekh1HAqzWdXTRfInUl+CEwPU+Eh6y47nBOmrv/sthp6O8EhC3jr1aGx2MAbJmbOA==","signatures":[{"sig":"MEQCIGZO/NLHv1NukHtFa1AibhQpwo3XU3j+1bOCiwuHhkGlAiAxhU6t7dTPxnA76Qz0tlLlkxLd0G0X7BWqqO7S6QIgTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14114655},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"e64e54ec93b07b6d719c32152552ae88510daba3","engines":{"bun":">=1.2.0","node":">=22.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./*":"./dist/*"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"dev":"bun --watch src/index.ts","lint":"bunx eslint .","test":"bunx vitest run","tree":"bun run scripts/tree.ts","audit":"bun audit","build":"bun build ./src/index.ts --outdir ./dist --target node --external pino --external pino-pretty","start":"bun ./dist/index.js","format":"bunx prettier --write \"**/*.{ts,js,json,md,html,css}\"","devdocs":"bun run scripts/devdocs.ts","prepare":"bunx husky","rebuild":"bun run scripts/clean.ts && bun run build","depcheck":"bunx depcheck","dev:http":"MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=http bun --watch src/index.ts","devcheck":"bun run scripts/devcheck.ts","lint:fix":"bunx eslint . --fix","audit:fix":"bun audit --fix","dev:stdio":"MCP_LOG_LEVEL=debug MCP_TRANSPORT_TYPE=stdio bun --watch src/index.ts","inspector":"bunx mcp-inspector --config mcp.json --server pixoo-mcp-server","test:fuzz":"bunx vitest run fuzz","typecheck":"bunx tsc --noEmit","deploy:dev":"MCP_TRANSPORT_TYPE=http bunx wrangler dev","fetch-spec":"bun run scripts/fetch-openapi-spec.ts","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","deploy:prod":"MCP_TRANSPORT_TYPE=http bunx wrangler deploy","publish-mcp":"bunx mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","build:worker":"bun build ./src/worker.ts --outdir ./dist --target bun --no-external","docs:generate":"bunx typedoc","test:coverage":"bunx vitest run --coverage","coverage:commit":"bun run scripts/update-coverage.ts --commit","coverage:update":"bun run scripts/update-coverage.ts","test:conformance":"bunx vitest run --config vitest.conformance.ts","typecheck:scripts":"bunx tsc --project tsconfig.scripts.json --noEmit"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"depcheck":{"ignores":["bun","repomix","@cyanheads/pixoo-mcp-server"]},"_integrity":"sha512-x0IjFgj7hP0n4bRMML+Q7aekh1HAqzWdXTRfInUl+CEwPU+Eh6y47nBOmrv/sthp6O8EhC3jr1aGx2MAbJmbOA==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Compose and push pixel art, animations, and text to Divoom Pixoo LED matrices via MCP.","directories":{},"resolutions":{"qs":"6.14.2","zod":"4.3.6","diff":"8.0.3","hono":"4.11.10","dotenv":"17.3.1","typescript":"5.9.3","chrono-node":"2.9.0","markdown-it":"14.1.1","@hono/node-server":"1.19.9","@isaacs/brace-expansion":"5.0.1"},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.3.6","hono":"^4.11.9","jose":"^6.1.3","pino":"^10.3.1","unpdf":"^1.4.0","dotenv":"^17.3.1","openai":"^6.22.0","js-yaml":"^4.1.1","pdf-lib":"^1.17.1","node-cron":"^4.2.1","papaparse":"^5.5.3","validator":"13.15.26","chrono-node":"^2.9.0","pino-pretty":"^13.1.3","partial-json":"^0.1.7","sanitize-html":"^2.17.1","fast-xml-parser":"^5.3.7","@hono/node-server":"^1.19.9","@opentelemetry/api":"^1.9.0","@supabase/supabase-js":"^2.97.0","@opentelemetry/sdk-node":"^0.212.0","@cyanheads/pixoo-toolkit":"0.4.0","@opentelemetry/resources":"^2.5.1","@modelcontextprotocol/sdk":"^1.26.0","@opentelemetry/sdk-metrics":"^2.5.1","@opentelemetry/sdk-trace-node":"^2.5.1","@opentelemetry/instrumentation-pino":"^0.58.0","@opentelemetry/semantic-conventions":"^1.39.0","@opentelemetry/exporter-trace-otlp-http":"^0.212.0","@opentelemetry/auto-instrumentations-node":"^0.70.0","@opentelemetry/exporter-metrics-otlp-http":"^0.212.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.2","devDependencies":{"msw":"^2.12.10","diff":"^8.0.3","vite":"7.3.1","execa":"^9.6.1","husky":"^9.1.7","eslint":"^10.0.1","ignore":"^7.0.5","vitest":"^4.0.18","globals":"^17.3.0","repomix":"^1.11.1","typedoc":"^0.28.17","depcheck":"^1.4.7","prettier":"^3.8.1","@hono/mcp":"^0.2.3","bun-types":"^1.3.9","@eslint/js":"^10.0.1","@types/bun":"^1.3.9","clipboardy":"^5.3.0","fast-check":"^4.5.3","typescript":"^5.9.3","@types/diff":"^8.0.0","@types/node":"^25.3.0","@types/js-yaml":"^4.0.9","@types/node-cron":"^3.0.11","@types/papaparse":"^5.5.2","@types/validator":"13.15.10","typescript-eslint":"8.56.0","vite-tsconfig-paths":"^6.1.1","@types/sanitize-html":"^2.16.0","@traversable/registry":"^0.0.49","@traversable/zod-test":"^0.0.28","@traversable/zod-types":"^0.0.30","@cloudflare/workers-types":"^4.20260302.0","@vitest/coverage-istanbul":"4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_0.3.1_1771835979358_0.22728652747585198","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@cyanheads/pixoo-mcp-server","version":"1.0.0","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"cyanheads <casey@caseyjhand.com> (https://github.com/cyanheads/pixoo-mcp-server#readme)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.0.0","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"2f0d3bbbf2a64cb07df6fe29f1e8d0b1517bbb59","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.0.0.tgz","fileCount":91,"integrity":"sha512-058mLq9K2o5egRMR/xQ0VZrp66555/+9PeBum97MZL7KBqWbE14bFJMdrrYeH3uFRACYpTMVfKeCiY0JJewMmw==","signatures":[{"sig":"MEQCIFkEKdu2grM1yyEnrH35cBhE9Ldfd/YGOG0jjvDwSH2lAiBY8b3Zgc0KddyzmrC4Rlq1YAi5NdsclWvY4wc73CLypw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21978262},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"2f0d3bbbf2a64cb07df6fe29f1e8d0b1517bbb59","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-058mLq9K2o5egRMR/xQ0VZrp66555/+9PeBum97MZL7KBqWbE14bFJMdrrYeH3uFRACYpTMVfKeCiY0JJewMmw==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3","sharp":"^0.35.1","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.10.6","@cyanheads/pixoo-toolkit":"^0.6.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.2","devDependencies":{"ignore":"^7.0.5","vitest":"^4.1.8","depcheck":"^1.4.7","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"25.9.3","@biomejs/biome":"2.4.16"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.0.0_1781259762951_0.31362154429904465","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@cyanheads/pixoo-mcp-server","version":"1.1.0","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.1.0","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"6a7b1b6ee04072aee0e709f5af5fbee92e3e6173","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.1.0.tgz","fileCount":95,"integrity":"sha512-hdBJFACMgpx7onSw92C0bTJs2pJFohLSmFiMnwFjwv7pSfNAR0pB/EFYODmgZ81q7GEUG1soS7yeArjExg03FQ==","signatures":[{"sig":"MEYCIQD+eZBg+LBJCIHlDqjCltYROoeN7eqEG31ABAGI43QVzAIhANHyKcDtaSonxvrMgp0JXVi7ChLPSlTFtnrPCvPSsj8G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":437506},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"6a7b1b6ee04072aee0e709f5af5fbee92e3e6173","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-hdBJFACMgpx7onSw92C0bTJs2pJFohLSmFiMnwFjwv7pSfNAR0pB/EFYODmgZ81q7GEUG1soS7yeArjExg03FQ==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.4.3","sharp":"^0.35.3","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.12.3","@cyanheads/pixoo-toolkit":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.6","vitest":"^4.1.11","depcheck":"^1.4.7","tsc-alias":"^1.9.2","typescript":"^7.0.2","@types/node":"26.2.0","@biomejs/biome":"2.5.9","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.1.0_1787435238374_0.9545252852258568","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@cyanheads/pixoo-mcp-server","version":"1.1.1","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.1.1","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"bfcb6c143254f2a35868e1b9567c817ea93866be","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.1.1.tgz","fileCount":96,"integrity":"sha512-8FGWewREUbaENaVlzSrx/zmmcdRcTgBTeJ6XwwW7HU3EiIMrbdIVtIA+p3Ws6SkVaGO7/Qi3JvaOYe7rP8YyqQ==","signatures":[{"sig":"MEUCIQDCYakSposTuQVGbz242ob+0SYdkgqgZwf3kzuoXtVHSwIgefkkUpnAoMhPUWyCbNbdn7O8B+QwTspBhJQI9PsEwbs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":438723},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"bfcb6c143254f2a35868e1b9567c817ea93866be","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-8FGWewREUbaENaVlzSrx/zmmcdRcTgBTeJ6XwwW7HU3EiIMrbdIVtIA+p3Ws6SkVaGO7/Qi3JvaOYe7rP8YyqQ==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.4.3","sharp":"^0.35.3","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.12.3","@cyanheads/pixoo-toolkit":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.6","vitest":"^4.1.11","depcheck":"^1.4.7","tsc-alias":"^1.9.2","typescript":"^7.0.2","@types/node":"26.2.0","@biomejs/biome":"2.5.9","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.1.1_1787435742698_0.291084302566359","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@cyanheads/pixoo-mcp-server","version":"1.1.2","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.1.2","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"ed88b21817b105eef1da0941f7ce116a899904de","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.1.2.tgz","fileCount":97,"integrity":"sha512-MxhS20upXvtXXDJ1xOvtltuUVWPXZL1zkVC4iTSbmnPVtYfkgisYzZX82IvgTJjWiil3G45jHe921Z0EhQu7zQ==","signatures":[{"sig":"MEYCIQDeI3wu4b3cMq2SKoxc4WFlJ37mVs2rimopzbPBZOmwdwIhAPyDTwFXcQ2JslumifhaxCGD1t8BrlqL+jOoeCEcRkz0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHx/3xD2kXE5ozXGURjzuLmL+L5acs0mbM+i8qLD0vP5AiBkGkeHqqDfGXPcgQTQLQ4wfmepODkB4GTaAqm7IDWqiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":455531},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"ed88b21817b105eef1da0941f7ce116a899904de","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-MxhS20upXvtXXDJ1xOvtltuUVWPXZL1zkVC4iTSbmnPVtYfkgisYzZX82IvgTJjWiil3G45jHe921Z0EhQu7zQ==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.4","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.2","@cyanheads/pixoo-toolkit":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.9","vitest":"^5.0.0","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.5.1","@biomejs/biome":"2.5.13","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.1.2_1789551194507_0.08770332163422423","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@cyanheads/pixoo-mcp-server","version":"1.1.3","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.1.3","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"b5bb5c32f52d57d4bff4f49944d4fa060e65bae5","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.1.3.tgz","fileCount":98,"integrity":"sha512-EWf2PB5sl+kZrwaf5fdpoOfxPpCdSfqlFIQuTzArs2P5bVJuc0GpR5yWDRyvskBY6TVo49KbibAj8TphEY5qHA==","signatures":[{"sig":"MEQCIAKSgWBQJpSJoW4ZB/S0UFGgD/AdOw68Jb80Wtk6EI4yAiB8tYofoPXF3nZmxiukBuFCW6BKnyVtDyOnxCNge0HvcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCX/SB2e7UCfOIIZAgxHb2x5DHuOrjSSCtcHI+1fyf2WgIgW/pxpNjiWswTiy6oz80quQzf7s6sz/LbpaQ/UvE1FBs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":464148},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"b5bb5c32f52d57d4bff4f49944d4fa060e65bae5","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-EWf2PB5sl+kZrwaf5fdpoOfxPpCdSfqlFIQuTzArs2P5bVJuc0GpR5yWDRyvskBY6TVo49KbibAj8TphEY5qHA==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.6","@cyanheads/pixoo-toolkit":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.9","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.1.3_1790055439259_0.09097426744745962","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@cyanheads/pixoo-mcp-server","version":"1.1.4","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.1.4","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"02916c665f95886d3813fd0f69a0c3177654c59a","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.1.4.tgz","fileCount":99,"integrity":"sha512-IjY93dVtkgnpz2Vq2RIaDP2gh8ZpyQT/I2Ace8oFDRswDTcsM7E+Y4Ae/MIiLriOuYe+KPiSAAPqbL1HSuYMlA==","signatures":[{"sig":"MEUCIBtXqwiReQ3C3c9eYGZdoObaOSYOXkS12AEHS04AseNIAiEAjBWgnclqMkwWJYe5hHdND9PBYRlq+fYVmhCn7hhna6M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC5pYwti6JHzSB/1mOSjJWL0zJ/59JueWJJwQJK/vHMCgIhAKJjr3CBJlfk7e9ksE4Nh314CtPs2li1kjS2M/ibHV1L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":476043},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"02916c665f95886d3813fd0f69a0c3177654c59a","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-IjY93dVtkgnpz2Vq2RIaDP2gh8ZpyQT/I2Ace8oFDRswDTcsM7E+Y4Ae/MIiLriOuYe+KPiSAAPqbL1HSuYMlA==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.6","@cyanheads/pixoo-toolkit":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.9","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.1.4_1790211045251_0.3528701031386807","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@cyanheads/pixoo-mcp-server","version":"1.2.0","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.2.0","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"04f5d6020d8d3ccef369c3f304c04ac7151f8e60","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.2.0.tgz","fileCount":104,"integrity":"sha512-USSc19H3xQSmA9Y6V+hMtvSN0yWl5laRsNbA/Dt7PsrPdUpnJebPcBtrGOr/y/N1ExBQjs4cLEtzCVpnJB5beA==","signatures":[{"sig":"MEYCIQC/gy22qGDIz/o1SJh9f99eVdU6KSYHwIjVvctXXM45vgIhANaHv/vKUgJPQ8HnpQ5SPv58wqe3Iaumu3+yzH7qbIBy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICRA/xcs3KmY7OWD/lHvKOg/qz2DokTbqNZx8QV3uKyLAiAubqd1JAn9fhM3FEQE9FYnRNAifp3wbTHgXpar4zG7qQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":506517},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"04f5d6020d8d3ccef369c3f304c04ac7151f8e60","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-USSc19H3xQSmA9Y6V+hMtvSN0yWl5laRsNbA/Dt7PsrPdUpnJebPcBtrGOr/y/N1ExBQjs4cLEtzCVpnJB5beA==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.6","@cyanheads/pixoo-toolkit":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.9","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.2.0_1790219113984_0.23893367974409574","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@cyanheads/pixoo-mcp-server","version":"1.2.1","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.2.1","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"04e0538fbd5e09a8e84fa42f33aa73d72f7f16cd","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.2.1.tgz","fileCount":105,"integrity":"sha512-d9Tgxi0t10B85Oc3rl/hnwpkevf/+2KbTxDcObLwkahBDzYG9ohjs4dc3d3aAfUIcnRcjMVLBep1kaarFXDM3Q==","signatures":[{"sig":"MEUCIQCP0BGBbTLV5Q4U2bg1aDNpMzkswmVKF/9ha/uD8fJ97AIgGeCMm0VTxl0RtvzS0fHXcXkzKTzgjOEHU5rsoUFdqRc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDpRT1zvlvzYd1DyWcYYPR7IPRK2Ok/vqDwsnOHS+kcSgIhAOVHaYCS4tz16DlYUtWXoe28OdutaFrvxV8+iRRo7AJL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":530624},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"04e0538fbd5e09a8e84fa42f33aa73d72f7f16cd","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-d9Tgxi0t10B85Oc3rl/hnwpkevf/+2KbTxDcObLwkahBDzYG9ohjs4dc3d3aAfUIcnRcjMVLBep1kaarFXDM3Q==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.9","@cyanheads/pixoo-toolkit":"^0.8.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"ignore":"^7.0.10","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.2.1_1790457164188_0.05923651172049027","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@cyanheads/pixoo-mcp-server","version":"1.2.2","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.2.2","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"be5bb57e44b4631db4408d48975229d88a18a71e","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.2.2.tgz","fileCount":114,"integrity":"sha512-EK0e7NJMFxZo4dFNqqebRfwlqN8x0jfUBp6cXB1xpwc3lxCSJf51AvjHndoQ4vowW4D09kBWqSsQkuoH8iY1vA==","signatures":[{"sig":"MEUCIQCNE9/PhV7LE6zE62M0oJWjsYLONlzEdNZbzIXXuRzkygIgZTdVe0JMFHiMoiMyvoSs0iQF0GWYbPFvjGXn+Nbr3nk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCiaP88cvMXa30I/lyo2Bkxnhe7Mm9BdBG8NNde0YVszQIhAPCadFv4pDgNFChnQFmYisdsvw6EwMQOhFDHrXOOwgwt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":591357},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"be5bb57e44b4631db4408d48975229d88a18a71e","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-EK0e7NJMFxZo4dFNqqebRfwlqN8x0jfUBp6cXB1xpwc3lxCSJf51AvjHndoQ4vowW4D09kBWqSsQkuoH8iY1vA==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.9","@cyanheads/pixoo-toolkit":"^0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"ignore":"^7.0.10","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.2.2_1790473972540_0.8807472882614009","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@cyanheads/pixoo-mcp-server","version":"1.3.0","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/pixoo-mcp-server@1.3.0","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"bin":{"pixoo-mcp-server":"dist/index.js"},"dist":{"shasum":"f27ad80dda522df8868cc54ccca415d34f4db7de","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.3.0.tgz","fileCount":119,"integrity":"sha512-OLxyECjrCPkNXUuAZWAeID2U6hr+ZMkFGi0zVLm/xr9TWd1PTs6PSi1NYHWHgQnlIXPbelNLI4TN4Q9CSbCNCw==","signatures":[{"sig":"MEUCIQDdbnetPV79yU90go8WCm5UDLjRuekQ2bnPYKCA9XPDLAIgQ77WWH1gPFbt/XxxsEeEm4OiWrbofGjzeeyDI8lNHFc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC2ddwwWbU9BKyCzZmW4V6Cr4e3RRwYTFmjR7KN5ys37wIhAMVdCWU0tPP347ZxytjncPIocxVPa+h1VSV3HIZWAsgw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":605330},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"f27ad80dda522df8868cc54ccca415d34f4db7de","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-OLxyECjrCPkNXUuAZWAeID2U6hr+ZMkFGi0zVLm/xr9TWd1PTs6PSi1NYHWHgQnlIXPbelNLI4TN4Q9CSbCNCw==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.10","@cyanheads/pixoo-toolkit":"^0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"ignore":"^7.0.10","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/pixoo-mcp-server_1.3.0_1790481488017_0.8082794304974521","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"_id":"@cyanheads/pixoo-mcp-server@1.4.0","bin":{"pixoo-mcp-server":"dist/index.js"},"bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"dist":{"shasum":"3a44efac53f6015c52aa8a1990346485a0061f37","tarball":"https://registry.npmjs.org/@cyanheads/pixoo-mcp-server/-/pixoo-mcp-server-1.4.0.tgz","fileCount":149,"integrity":"sha512-nLlc0Cm/s5rvAxkT7kmZudpMzgH5bxWSpruCRsCnXBLe2KzESDHB31lCcfZ0lnN+A0LiJkIAnY1hTuWXN78IhQ==","signatures":[{"sig":"MEUCIFSYH4bAnbrcY6EsqLlSwLYzr/J70FNuTIvfACrtMS1xAiEA/tPO5K3qAyFf6Zt/ZJtxQZKZwJxTCXitNwuBKRc9uVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAiN3RuRhLfc+Ftt5uIvr1vskZTpUVConudNIMYyGjDlAiEAuPdff8D8/GIawkg7q/GqYqgLdAfW77mbnTe/CXh75pQ="}],"unpackedSize":848082},"main":"dist/index.js","name":"@cyanheads/pixoo-mcp-server","type":"module","types":"dist/index.d.ts","author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","shasum":"3a44efac53f6015c52aa8a1990346485a0061f37","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"license":"Apache-2.0","mcpName":"io.github.cyanheads/pixoo-mcp-server","scripts":{"test":"bunx vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts && bun run scripts/build-page-runtime.ts","clean":"bun run scripts/clean.ts","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/pixoo-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/pixoo-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts && bun run scripts/build-page-runtime.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http bun ./dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio bun ./dist/index.js","test:browser":"PIXOO_BROWSER_SUITE=1 bunx vitest run --project browser","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"version":"1.4.0","_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"_integrity":"sha512-nLlc0Cm/s5rvAxkT7kmZudpMzgH5bxWSpruCRsCnXBLe2KzESDHB31lCcfZ0lnN+A0LiJkIAnY1hTuWXN78IhQ==","repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"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.","directories":{},"maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","sharp":"^0.35.4","pino-pretty":"^13.1.3","@cyanheads/mcp-ts-core":"^0.13.10","@cyanheads/pixoo-toolkit":"^0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"ignore":"^7.0.10","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pixoo-mcp-server_1.4.0_1790542799809_0.9978932574139989"}}},"time":{"created":"2026-02-23T08:39:39.269Z","modified":"2026-09-27T21:00:00.076Z","0.3.1":"2026-02-23T08:39:39.621Z","1.0.0":"2026-06-12T10:22:43.387Z","1.1.0":"2026-08-22T21:47:18.526Z","1.1.1":"2026-08-22T21:55:42.841Z","1.1.2":"2026-09-16T09:33:14.603Z","1.1.3":"2026-09-22T05:37:19.352Z","1.1.4":"2026-09-24T00:50:45.351Z","1.2.0":"2026-09-24T03:05:14.091Z","1.2.1":"2026-09-26T21:12:44.291Z","1.2.2":"2026-09-27T01:52:52.643Z","1.3.0":"2026-09-27T03:58:08.097Z","1.4.0":"2026-09-27T20:59:59.900Z"},"bugs":{"url":"https://github.com/cyanheads/pixoo-mcp-server/issues"},"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","homepage":"https://github.com/cyanheads/pixoo-mcp-server#readme","keywords":["mcp","mcp-server","model-context-protocol","divoom","pixoo","pixoo-64","led-matrix","pixel-art","typescript","bun","stdio","streamable-http","ai-agent","animation","display"],"repository":{"url":"git+https://github.com/cyanheads/pixoo-mcp-server.git","type":"git"},"description":"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.","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"readme":"<div align=\"center\">\n  <h1>@cyanheads/pixoo-mcp-server</h1>\n  <p><b>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.</b>\n  <div>7 Tools • 4 Resources</div>\n  </p>\n</div>\n\n<div align=\"center\">\n\n[![Version](https://img.shields.io/badge/Version-1.4.0-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/pixoo-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^2.1.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/pixoo-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/pixoo-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.2-blueviolet.svg?style=flat-square)](https://bun.sh/)\n\n</div>\n\n<div align=\"center\">\n\n[![Install in Claude Desktop](https://img.shields.io/badge/Install_in-Claude_Desktop-D97757?style=for-the-badge&logo=anthropic&logoColor=white)](https://github.com/cyanheads/pixoo-mcp-server/releases/latest/download/pixoo-mcp-server.mcpb) [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=pixoo-mcp-server&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBjeWFuaGVhZHMvcGl4b28tbWNwLXNlcnZlciJdfQ==) [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode:mcp/install?%7B%22name%22%3A%22pixoo-mcp-server%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40cyanheads%2Fpixoo-mcp-server%22%5D%7D)\n\n[![Framework](https://img.shields.io/badge/Built%20on-@cyanheads/mcp--ts--core-67E8F9?style=flat-square)](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)\n\n</div>\n\n---\n\n## Overview\n\nDivoom Pixoo LED matrix displays on the local network, with the Pixoo-64 as the primary target and the 16 and 32 also supported. Render and push styled text, layered scenes, dashboards, animations, and HTML pages, or read and change device state. Runs as a stdio process or a local Streamable HTTP server.\n\n### Tools\n\n| Tool | Description |\n|:---|:---|\n| `pixoo_display_text` | Render styled text with themes, gradients, shadows, and auto-fit, static or animated, and push it |\n| `pixoo_compose_scene` | Compose layered scenes of text, icons, widgets, shapes, bitmaps, images, and sprites, static or animated |\n| `pixoo_push_image` | Resize a local or https image to the LED grid and push it, an animated GIF or WebP as an animation |\n| `pixoo_render_html` | Render an HTML page (CSS, SVG, Canvas, WebGL) in a headless browser at the panel size, still or animated frame by frame on a virtual clock, and push it |\n| `pixoo_overlay_text` | Set or clear a device-rendered scrolling text overlay |\n| `pixoo_control_device` | Read or change brightness, screen state, channel, or clock face |\n| `pixoo_discover_devices` | Find Pixoo devices and their LAN IPs through Divoom's cloud discovery |\n| `pixoo_design_brief` | Craft guidance for a design topic, with live device state and pre-filled next calls |\n\n### Resources\n\n| Resource | Description |\n|:---|:---|\n| `pixoo://device/status` | Live device snapshot: reachability, channel, brightness, screen state, display size |\n| `pixoo://reference/themes` | Theme and palette registry |\n| `pixoo://reference/icons` | Built-in icon names by category |\n| `pixoo://reference/design-guide` | Long-form craft guide for the 64px display |\n\nTools cover the same ground for tool-only clients: `pixoo_control_device` reads the live device state, and `pixoo_design_brief` returns craft guidance, theme names, and icon names.\n\n## Capability reference\n\n### `pixoo_display_text` <sub>tool</sub>\n\n- `text` as a string or an array of lines; `theme` (`midnight`, `ember`, `claude`, `ice`, `neon`, `forest`, `mono`) sets the background and default palette. `style` takes a `palette` ramp (`ember`, `ice`, `neon`, `fire`, `lavender`, `claude`, `mono`) or a custom `{ from, to }`, plus `shadow`, `outline`, and `scale` 1–8; `position` is semantic or in pixels, and `align` lines up multi-line text\n- `font`: `standard` (5×7) and `compact` (3×5) draw printable ASCII plus `° ← ↑ → ↓ ▲ ▼ ♥ · …`, and any other character (`€`, `’`, a newline inside one string) as `?`, named with its code point and line index in the response `notice`; `numerals` is an 11×18 digit face for clocks and readouts that draws 0–9, space, and `: . - + / % ° ?`, and text holding any other character fails validation, naming those characters\n- `layout[]` reports every fit decision as an `action` (`shrunk-to-compact` when the text fits only in the compact font, `scrolling` when the returned frames scroll, `none` otherwise), the `font` used, and whether each line's box `fits` on the panel; a single line too wide for the panel starts at x 0, cut at the right edge when it does not scroll. Single-line text falls back from the standard to the compact font unless `font` is set — never to `numerals` — and text still too wide only scrolls under `effect: \"auto\"` or `\"scroll\"`\n- `effect`: `scroll` makes one pass in up to 40 frames, `auto` scrolls only on overflow, and `float` and `pulse` loop over 20 frames; `frames` reports the count, and the animation pushes as one device animation\n\n---\n\n### `pixoo_compose_scene` <sub>tool</sub>\n\n- Up to 50 `elements` drawn back-to-front: `text` (in the same three fonts as `pixoo_display_text`), `icon`, `rect`, `circle`, `line`, `progress`, `sparkline`, `bitmap`, `pixels`, `image` (absolute path or https URL, with the same `finish` as `pixoo_push_image`), `sprite` (absolute path). The `background` is a solid color, a `v` / `h` / `r` gradient, or a `theme`\n- Every element takes `opacity` (each pixel lands at its own alpha × `opacity`, so soft edges fade evenly) and `blend`: `normal`, `add` (glows and light beams), `screen`, or `multiply`. `line` and outline `circle` take `strokeWidth` and `antialias`, and a `rect` border takes `strokeWidth`, growing inward; either field on a shape that draws no stroke fails validation, naming it\n- Returns `layout[]`: each element's placed box — for a wide or anti-aliased stroke, every pixel it draws — and whether it `fits` on the panel. Elements are placed as given and never refit, so `action` is always `none`. An absolute `output` path saves the first frame as a PNG in place of the `PIXOO_OUTPUT_DIR` auto-save. Typed failures: `asset_not_found`, `invalid_image` (an image or sprite that was read but does not decode), `invalid_color`, `unknown_icon`, `invalid_output_path`\n- Animation through per-element `effect` presets (`float`, `scroll-left`, `scroll-right`, `pulse`, `blink`, `twinkle`, `drift`, `fade-in`, `fade-out`) or raw `animate` keyframes over `dx`, `dy`, `opacity` (numbers or numeric strings), `visible` (`true`/`false`), and `color` (interpolated through RGB on any element with a `color`), each track holding at least one keyframe; `frames` 1–800, `speed` 10–2000 ms per frame (default 150). Past 40 frames the scene plays as one GIF the device downloads from this host, with `speed` rounded to 10 ms. An element takes `effect` or `animate`, not both. An effect's `amplitude` sets the movement of `float`, `scroll-*`, and `drift`, and the 0–1 depth of the `pulse` and `twinkle` opacity dip\n\n---\n\n### `pixoo_push_image` <sub>tool</sub>\n\n- `source` is an absolute local path or an https URL, with downloads capped at 10 MB; `fit` is `contain` (default), `cover`, or `fill`, and `kernel` is `nearest` (default, for pixel art), `lanczos3` (photos), or `mitchell`\n- A source that decodes as an animated GIF or WebP, whatever its file name, pushes as an animation of up to `maxFrames` frames (1–800, default 40), sampled evenly from a longer source; past 40 frames it plays as one GIF the device downloads from this host. It plays at the source's total duration over the pushed frame count (150 ms when the source records no delays), or at `speed` (10–2000 ms per frame); `frames`, `sourceFrames`, and `speed` report what was pushed\n- `finish` reduces the image to a palette before the push: exactly one of `colors` (2–256, built from the image) or `palette` (1–256 hex or named colors), plus `dither` (`none`, `bayer4`, `floyd-steinberg`). Transparent pixels stay unlit, and an animation's `colors` palette is shared by every frame\n- An unreadable path or URL fails as `asset_not_found`, a source that is read but does not decode (a text file, an HTML page, a truncated download) fails as `invalid_image`, and an unresolvable `finish` palette entry fails as `invalid_color`; the preview is the exact frame the device receives, or a grid of an animation's frames\n\n---\n\n### `pixoo_render_html` <sub>tool</sub>\n\n- `html` is a full document or a body fragment, up to 500,000 characters, laid out in a square viewport one CSS pixel per LED. The page is the panel: `body` has no margin, scrollbars are hidden, and a page that paints no background renders on black (unlit). Its own CSS overrides each\n- `frames` 1–800 (default 1), `speed` 10–2000 ms per frame (default 150). Each frame advances a virtual clock by `speed`: `window.render(t, frame)`, when the page defines it, runs before each capture with `t = frame / frames`, so periodic motion loops seamlessly; `requestAnimationFrame`, `setTimeout` / `setInterval` (4 ms floor for nested and repeating timers), `Date` (starting at the real time), and `performance.now()` (0 at load) follow the same clock, and CSS animations are paused and seeked to it, so every frame is deterministic. `requestIdleCallback` and iframes keep real time. Past 40 frames the page plays as one GIF the device downloads from this host, as on `pixoo_compose_scene`\n- `sampling`: `native` (default) or `supersample`, which renders at 8× and area-averages into each LED, smoothing transforms, text, SVG, and canvas. Chromium snaps a plain box's edges to whole CSS pixels before scaling, so a box at `left: 0.5px` still lands on one LED; move it with `transform` for sub-pixel motion. `finish` takes the same palette reduction as `pixoo_push_image`, applied before the preview\n- Nothing loads from the network and workers are blocked. `pageErrors` returns the page's uncaught errors, `console.error` output, and blocked URLs (a blocked navigation as `Blocked navigation: <url>`): the first 20, each cut to 500 characters. A `window.render` that throws or rejects fails as `page_error`, naming the frame; with no browser found, the call fails as `browser_unavailable` with install steps (see [Prerequisites](#prerequisites)); `render_timeout` and `render_crashed` cover a render past 30 s and a crashed browser or page. `PIXOO_HTML_ENABLED=false` removes the tool\n- Every page gets a `pixoo` global before its own scripts run, for the crisp bitmap text, palettes, and icons that browser anti-aliasing would smear across LEDs:\n  - `pixoo.context()` is the 2D context of a transparent panel-size canvas fixed over the page.\n  - `pixoo.text(ctx, text, x, y, { font, color, palette, scale, shadow, outline })` draws `pixoo_display_text`'s fonts.\n  - `pixoo.icon(ctx, name, x, y, { w, h, color, palette })` draws a registry icon.\n  - `pixoo.palettes` holds the 7 palettes, and `pixoo.size` is the panel size.\n\n  Text and icons drawn this way match `pixoo_compose_scene` pixel for pixel in both sampling modes. An unknown palette, icon, or color throws naming it:\n\n  ```html\n  <script>\n    const ctx = pixoo.context();\n    pixoo.text(ctx, 'HELLO', 'center', 4, { palette: 'ember', scale: 2, shadow: true });\n    pixoo.icon(ctx, 'check-circle', 50, 50, { color: 'green' });\n  </script>\n  ```\n\n- `pixoo_design_brief` with topic `html` covers loops, the clock, sampling, the `pixoo` runtime, and legibility at 64 px. A dot orbiting the panel once per loop:\n\n```json\n{\n  \"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>\",\n  \"frames\": 20,\n  \"speed\": 100,\n  \"sampling\": \"supersample\"\n}\n```\n\n---\n\n### `pixoo_overlay_text` <sub>tool</sub>\n\n- `mode: \"set\"` or `\"clear\"` on one of 20 slots (`id` 0–19). `set` requires `text` and takes a device `font` ID (0–114), `x` / `y` within `PIXOO_SIZE`, `color`, `speed` (0–100), `direction`, `align`, and `width`\n- Returns `acknowledged`, `mode`, and `id`. The device renders the overlay, so there is no preview, and it persists across channel switches until cleared\n\n---\n\n### `pixoo_control_device` <sub>tool</sub>\n\n- No params reads state; any of `brightness` (0–100), `screen` (`on` / `off`), `channel` (`faces` / `cloud` / `visualizer` / `custom`), or `clockFaceId` is applied before the read-back\n- Returns `reachable`, `channel`, `brightness`, `screenOn`, and `clockId` (absent when unreachable) plus `applied`; a failed setting is left out of `applied` and named in the notice instead of failing the call\n\n---\n\n### `pixoo_discover_devices` <sub>tool</sub>\n\n- Queries Divoom's cloud endpoint (`app.divoom-gz.com`), so it needs internet access; `timeoutMs` 1000–30000 (default 5000)\n- Returns each device's `name`, `id`, and `ip`; with `PIXOO_IP` set, `configuredIpFound` says whether it matched. An unreachable endpoint fails as `discovery_failed`\n\n---\n\n### `pixoo_design_brief` <sub>tool</sub>\n\n- `topic`: `text`, `scene`, `dashboard`, `animation`, `pixel-art`, `html`, or `troubleshooting`; works without a reachable device\n- Returns markdown `craftGuidance`, a live `deviceContext`, `htmlRenderer` (`available`, `disabled` when `PIXOO_HTML_ENABLED=false`, or `no_browser`, found without launching a browser), `nextToolSuggestions` as `{ toolName, reason, args }` with arguments pre-filled for the topic and device state, plus `availableThemes` and `iconCategories`\n\n---\n\n### `pixoo://device/status` <sub>resource</sub>\n\n- Uncached live read: `reachable`, `channel`, `brightness`, `screenOn`, `clockId`, `displaySize`, `configuredIp`\n- Returns `reachable: false` rather than an error when the device can't be reached or `PIXOO_IP` is unset\n\n---\n\n### `pixoo://reference/themes` <sub>resource</sub>\n\n- Every theme (background, `textPalette`, `accent`, `shadow`) and palette (`from` / `to` stops), plus `themeNames` and `paletteNames` for the `theme` and `palette` parameters\n- Static registry, cached for 24h\n\n---\n\n### `pixoo://reference/icons` <sub>resource</sub>\n\n- Each icon's `name`, `category`, and `viewBox`, plus a `byCategory` grouping (weather, arrows, status, media); a `name` goes in a `pixoo_compose_scene` icon element\n- Static registry, cached for 24h\n\n---\n\n### `pixoo://reference/design-guide` <sub>resource</sub>\n\n- `text/markdown`: legibility floors, palette discipline, layout zones, animation budget, effect presets, pixel art rules, push pacing, and known device behaviors\n- The whole guide in one document, where `pixoo_design_brief` returns guidance per topic; cached for 24h\n\n## Features\n\nBuilt on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core): stdio and Streamable HTTP transports, pluggable auth (`none` / `jwt` / `oauth`), swappable storage (`in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`), structured logging with optional OpenTelemetry tracing.\n\nPixoo-specific:\n\n- All composition happens on the host in an RGBA canvas pipeline (`@cyanheads/pixoo-toolkit`); the device receives finished RGB frames\n- Pushes switch the device to the custom channel and run one at a time, spaced by `PIXOO_PUSH_MIN_INTERVAL_MS` (default 1000) so rapid pushes don't freeze the device\n- Up to 40 animation frames push one request each; more frame pushes make the device unstable. Past 40, `pixoo_compose_scene`, `pixoo_push_image`, and `pixoo_render_html` (up to 800 frames) serve one GIF from a one-shot listener on this host, which the device downloads and loops, so the device must be able to reach this host. `pixoo_display_text` stays within 40\n\nAgent-friendly output:\n\n- Preview on every render: `pixoo_display_text`, `pixoo_compose_scene`, `pixoo_push_image`, and `pixoo_render_html` return the frame as an 8× upscaled PNG image block, pushed or not, so `push: false` checks a design with no device attached. Animations preview as a grid of their frames (every frame while 1× tiles fit the 512 px sheet, an even sample past that), since GIF display varies across MCP clients; the GIF itself is saved to `PIXOO_OUTPUT_DIR` when set — an 8× preview GIF, or past 40 frames the panel-size GIF the device downloads\n- Layout transparency: `layout[]` reports every renderer decision (font fallback, scrolling, and whether each box fits on the panel) so agents can refine a design\n- Device truth: `pushed` reflects the device ACK (past 40 frames, the ACK of the play plus the device's request for the GIF, with the whole file handed to the OS to send; the device does not confirm receipt), and the `deviceState` read back after a push comes with a notice naming the fix when the render won't be visible (screen off, brightness ≤ 10, off the custom channel)\n- Renders survive failed pushes: on all four render tools, the typed error (`device_unreachable`, `device_http_error`, `device_rejected`, `gif_serve_failed`, `no_device_configured`) carries `outputFiles` pointing at the saved preview (the `PIXOO_OUTPUT_DIR` copy, or a temp file when that is unset)\n\n## Getting started\n\nAdd the following to your MCP client configuration file, with `PIXOO_IP` set to your Pixoo's LAN address. `pixoo_discover_devices` finds it if you don't know it.\n\n```json\n{\n  \"mcpServers\": {\n    \"pixoo-mcp-server\": {\n      \"type\": \"stdio\",\n      \"command\": \"bunx\",\n      \"args\": [\"@cyanheads/pixoo-mcp-server@latest\"],\n      \"env\": {\n        \"MCP_TRANSPORT_TYPE\": \"stdio\",\n        \"MCP_LOG_LEVEL\": \"info\",\n        \"PIXOO_IP\": \"192.168.1.50\"\n      }\n    }\n  }\n}\n```\n\nOr with npx (no Bun required):\n\n```json\n{\n  \"mcpServers\": {\n    \"pixoo-mcp-server\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@cyanheads/pixoo-mcp-server@latest\"],\n      \"env\": {\n        \"MCP_TRANSPORT_TYPE\": \"stdio\",\n        \"MCP_LOG_LEVEL\": \"info\",\n        \"PIXOO_IP\": \"192.168.1.50\"\n      }\n    }\n  }\n}\n```\n\nOr with Docker:\n\n```json\n{\n  \"mcpServers\": {\n    \"pixoo-mcp-server\": {\n      \"type\": \"stdio\",\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\", \"-i\", \"--rm\",\n        \"-e\", \"MCP_TRANSPORT_TYPE=stdio\",\n        \"-e\", \"PIXOO_IP=192.168.1.50\",\n        \"-e\", \"PIXOO_SERVE_HOST=192.168.1.20\",\n        \"-e\", \"PIXOO_SERVE_PORT=8765\",\n        \"-p\", \"8765:8765\",\n        \"ghcr.io/cyanheads/pixoo-mcp-server:latest\"\n      ]\n    }\n  }\n}\n```\n\nThe device downloads an animation of more than 40 frames from this host, and on Docker's default bridge network the address routed to the device is the container's own, which the device can't reach. Set `PIXOO_SERVE_HOST` to the Docker host's LAN address and publish a fixed `PIXOO_SERVE_PORT`, as above; 40 frames or fewer need neither.\n\nFor Streamable HTTP, set the transport and start the server:\n\n```sh\nMCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 PIXOO_IP=192.168.1.50 bun run start:http\n# Server listens at http://localhost:3010/mcp\n```\n\n### Prerequisites\n\n- [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+).\n- A Divoom Pixoo on the local network (Pixoo-64, Pixoo-32, or Pixoo-16).\n- Optional, for the HTML renderer: [chrome-headless-shell](https://developer.chrome.com/docs/automation-and-testing/headless-chrome-shell). `npx @puppeteer/browsers install chrome-headless-shell@stable --path ~/.cache/puppeteer` installs it where the server looks by default. Installed anywhere else with `--path <dir>`, set `PIXOO_BROWSER_PATH` to the executable path the install prints. The server launches it headless, with no DevTools port, only when a render needs it.\n\n### Installation\n\n1. **Clone the repository:**\n\n```sh\ngit clone https://github.com/cyanheads/pixoo-mcp-server.git\n```\n\n2. **Navigate into the directory:**\n\n```sh\ncd pixoo-mcp-server\n```\n\n3. **Install dependencies:**\n\n```sh\nbun install\n```\n\n4. **Configure environment:**\n\n```sh\ncp .env.example .env\n# edit .env and set PIXOO_IP\n```\n\n## Configuration\n\n| Variable | Description | Default |\n|:---|:---|:---|\n| `PIXOO_IP` | Device IP on the local network. **Required** for pushes, overlays, and device control; discovery, design briefs, and `push: false` renders work without it. | — |\n| `PIXOO_SIZE` | Display size in pixels: `16`, `32`, or `64`. | `64` |\n| `PIXOO_OUTPUT_DIR` | Directory where render tools save preview PNG and GIF files. A relative path resolves against the directory the server was launched from, so the saved paths it reports are absolute. Unset, previews are returned only in the response. | — |\n| `PIXOO_PUSH_MIN_INTERVAL_MS` | Minimum gap between device pushes, in ms. | `1000` |\n| `PIXOO_SERVE_HOST` | Host advertised in the URL the device downloads an animation of more than 40 frames from, in place of the local address the OS routes to `PIXOO_IP`. The listener binds that routed address either way. Set it behind NAT or in a container. | — |\n| `PIXOO_SERVE_PORT` | Fixed port for that download's one-shot listener, for firewall rules and container port publishing. Unset, a free port per play. | — |\n| `PIXOO_BROWSER_PATH` | Browser executable for HTML rendering. When set, the only browser tried: a path that is not an executable file fails rather than falling back. A relative path resolves against the launch directory. Unset, the newest chrome-headless-shell in Puppeteer's cache (`~/.cache/puppeteer`). The Docker image ships no browser. | — |\n| `PIXOO_HTML_ENABLED` | Offer `pixoo_render_html`. `false` removes it from `tools/list`; a value that is not a boolean fails startup. | `true` |\n| `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http`. | `stdio` |\n| `MCP_HTTP_PORT` | HTTP server port. | `3010` |\n| `MCP_SESSION_MODE` | HTTP session mode: `stateless`, `stateful`, or `auto`. A value set here overrides the server's declared `stateless`. | `stateless` |\n| `MCP_AUTH_MODE` | Authentication: `none`, `jwt`, or `oauth`. | `none` |\n| `MCP_LOG_LEVEL` | Log level (`debug`, `info`, `warning`, `error`, etc.). | `info` |\n| `LOGS_DIR` | Directory for log files (Node.js only). | `<project-root>/logs` |\n| `LOG_TOOL_FAILURE_PAYLOADS` | Log each failed tool call's arguments and result, redacted by key name and capped at `LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES` (default `16384`). A secret inside a free-form value is not redacted. | `false` |\n| `OTEL_ENABLED` | Enable [OpenTelemetry](https://github.com/cyanheads/mcp-ts-core/tree/main/docs/telemetry). | `false` |\n\nSee [`.env.example`](./.env.example) for the full list of optional overrides.\n\n## Running the server\n\n### Local development\n\n- **Build and run:**\n\n  ```sh\n  # One-time build\n  bun run rebuild\n\n  # Run the built server\n  bun run start:stdio\n  # or\n  bun run start:http\n  ```\n\n- **Run checks and tests:**\n\n  ```sh\n  bun run devcheck   # Lint, format, typecheck, security\n  bun run test       # Vitest test suite\n  bun run lint:mcp   # Validate MCP definitions against spec\n\n  # Real-browser suite for the HTML renderer (opt-in; launches the named browser)\n  PIXOO_TEST_BROWSER_PATH=/path/to/chrome-headless-shell bun run test:browser\n  ```\n\n### Docker\n\n```sh\ndocker build -t pixoo-mcp-server .\ndocker run --rm -e PIXOO_IP=192.168.1.50 -p 3010:3010 \\\n  -e PIXOO_SERVE_HOST=192.168.1.20 -e PIXOO_SERVE_PORT=8765 -p 8765:8765 \\\n  pixoo-mcp-server\n```\n\n`PIXOO_SERVE_HOST` (the Docker host's LAN address) and the published `PIXOO_SERVE_PORT` let the device download animations of more than 40 frames from inside the container, as in the stdio configuration above.\n\nThe 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.\n\n## Project structure\n\n| Directory | Purpose |\n|:---|:---|\n| `src/index.ts` | `createApp()` entry point: registers tools and resources and initializes the Pixoo service. |\n| `src/config/` | Server-specific environment variable parsing and validation with Zod. |\n| `src/mcp-server/tools/` | Tool definitions (`*.tool.ts`), the shared post-render push path, and the shared `finish` input schema. |\n| `src/mcp-server/resources/` | Resource definitions (`*.resource.ts`). |\n| `src/services/pixoo/` | `PixooService`: wraps `@cyanheads/pixoo-toolkit` with push pacing, result mapping, and device state reads. |\n| `src/services/browser/` | `BrowserRenderer`: renders HTML in an isolated headless chrome-headless-shell, driven over the DevTools Protocol pipe, and captures it as a panel frame. |\n| `src/renderer/` | Pure rendering pipeline with no device dependency: element renderers, styled-text engine, themes, icons, effect compiler, palette finishing, preview encoding, remote image fetch, and the virtual clock injected into HTML pages. |\n| `tests/` | Unit and integration tests mirroring `src/`. |\n\n## Development guide\n\nSee [`CLAUDE.md`/`AGENTS.md`](./CLAUDE.md) for development guidelines and architectural rules. The short version:\n\n- Handlers throw, framework catches — no `try/catch` in tool logic\n- Use `ctx.log` for request-scoped logging, `ctx.state` for tenant-scoped storage\n- The renderer (`src/renderer/`) is pure — no device dependency, testable without hardware\n- All device calls go through `PixooService`; every `PixooResult` is checked — never assume a push succeeded\n\n## Contributing\n\nIssues are welcome. Run checks and tests before submitting:\n\n```sh\nbun run devcheck\nbun run test\n```\n\n## License\n\nApache-2.0 — see [LICENSE](LICENSE) for details.\n","readmeFilename":"README.md"}