{
  "markdown": "# tronbyt-mcp\n\nLet your AI assistant put things on your LED sign.\n\nIf you have a [Tidbyt](https://tidbyt.com) or Tidbyt-style LED matrix display managed by\na self-hosted [tronbyt/server](https://github.com/tronbyt/server), this connects it to\nClaude (or any other AI tool that speaks [MCP](https://modelcontextprotocol.io), the\nopen standard for giving assistants access to tools). Once installed, your display\nbecomes something you can just talk to your assistant about:\n\n> \"Put **BREAD'S DONE** on the sign in amber.\"\n> \"Dim the display to 20% and turn on night mode from 10pm to 7am.\"\n> \"What apps are on the sign right now? Disable the stock ticker.\"\n> \"Show the clock app for a bit.\"\n\nThe assistant handles the rest — rendering text into the display's pixel format,\ntalking to your server, managing the app rotation. Everything runs on your own machine\nagainst your own server; nothing goes through any cloud service.\n\n## How it works\n\n`tronbyt-mcp` is a small MCP server that wraps tronbyt/server's documented\n[REST API](https://github.com/tronbyt/server/blob/main/API.md). Your MCP client (Claude\nCode, Claude Desktop, and friends) launches it locally and talks to it over stdio; it\ntalks to your Tronbyt server over HTTP with a device API key.\n\n## Requirements\n\n- A display managed by a self-hosted **tronbyt/server** (v2.x). Any device the server\n  manages works — it doesn't need to have started life as a Tidbyt: Tidbyt Gen1/Gen2,\n  Tronbyt S3 and S3 Wide kits, MatrixPortal S3 (including the Waveshare variant),\n  Waveshare S3, Pixoticker, Raspberry Pi displays, and homebrew panels typed \"other\".\n  Both standard 64×32 and wide 128×64 (2x) panels are supported.\n- **Node.js ≥ 20.9**\n- An **MCP client**: Claude Code, Claude Desktop, or anything else that supports MCP\n  stdio servers.\n\n## Installation\n\n### 1. Get a device API key\n\nIn the Tronbyt web UI, open your device's settings and copy (or generate) its **API\nkey**. Keys are scoped to a single device — one key, one display.\n\n### 2. Add the server to your MCP client\n\n**Claude Code** (one command):\n\n```sh\nclaude mcp add tronbyt \\\n  -e TRONBYT_BASE_URL=http://tronbyt.local:8000 \\\n  -e TRONBYT_API_KEY=<your-device-key> \\\n  -- npx -y tronbyt-mcp\n```\n\n**Claude Desktop**: edit the config file —\nmacOS: `~/Library/Application Support/Claude/claude_desktop_config.json`,\nWindows: `%APPDATA%\\Claude\\claude_desktop_config.json` — and add:\n\n```json\n{\n  \"mcpServers\": {\n    \"tronbyt\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tronbyt-mcp\"],\n      \"env\": {\n        \"TRONBYT_BASE_URL\": \"http://tronbyt.local:8000\",\n        \"TRONBYT_API_KEY\": \"<your-device-key>\"\n      }\n    }\n  }\n}\n```\n\nThen restart Claude Desktop.\n\n**Any other MCP client**: configure a stdio server with command `npx`, args\n`[\"-y\", \"tronbyt-mcp\"]`, and the two environment variables above.\n\n**From source** (instead of npx):\n\n```sh\ngit clone https://github.com/jonfishr/tronbyt-mcp.git\ncd tronbyt-mcp\nnpm install && npm run build\n```\n\nThen use `node /path/to/tronbyt-mcp/dist/index.js` as the server command in your MCP\nclient config (same environment variables).\n\n**Multiple displays?** API keys are per-device, so add one entry per display\n(`tronbyt-kitchen`, `tronbyt-office`, …), each with its own key.\n\n### 3. Check it works\n\nAsk your assistant something like *\"List my Tronbyt devices.\"* You should get back your\ndisplay with its brightness, night mode, and app list. (In Claude Code, `/mcp` also\nshows the server and its tools.)\n\n## Configuration\n\n| Env var | Required | Default | Notes |\n|---------|----------|---------|-------|\n| `TRONBYT_BASE_URL` | yes | — | Your tronbyt/server, e.g. `http://tronbyt.local:8000` |\n| `TRONBYT_API_KEY` | yes | — | Per-device API key from the Tronbyt web UI |\n| `TRONBYT_TIMEOUT_MS` | no | `10000` | Per-request timeout |\n\n## Usage\n\nYou don't call these directly — your assistant picks the right tool from your request —\nbut this is what it has to work with:\n\n| Tool | What it does |\n|------|--------------|\n| `list_devices` | Devices visible to the key: brightness, night mode, pinned app, last seen |\n| `update_device` | Set brightness, rotation interval, night/dim mode, pinned app |\n| `reboot_device` | Reboot the display |\n| `list_installations` | Apps installed on the device, with state and config |\n| `update_installation` | Enable/disable, pin/unpin, or retime an installation |\n| `delete_installation` | Remove an installation and its rendered images |\n| `push_app` | Render a server-side app (with optional config) and show it |\n| `push_image` | Push a base64 WebP (64×32, or 128×64 for wide displays) straight to the display |\n| `push_text` | Render text to a display-sized WebP locally and push it |\n\nPush tools take `background`: `false` (default) interrupts the display and shows the\npush immediately; `true` saves it into the rotation without interrupting. When a key\nsees exactly one device (the normal case), `device_id` never needs to be specified.\n\n### `push_text`\n\nText is rendered with the [Tom Thumb](https://robey.lag.net/2010/01/23/tiny-monospace-font.html)\n3×5 pixel font, word-wrapped and centered. Printable ASCII only; `\\n` forces a line\nbreak. Colors are hex (`#ffcc00`), default white on black.\n\nCanvas size is detected from the device type (`size: \"auto\"`): standard displays get\n64×32, wide/2x displays (`tronbyt_s3_wide`, `raspberrypi_wide`) get 128×64. On wide\ndisplays the font is doubled by default — same 16 chars × 5 lines, twice the pixels.\nPass `text_size: \"small\"` for native-size glyphs (32 chars × 10 lines), or override\nthe detection entirely with `size: \"64x32\"` / `\"128x64\"`.\n\n## Removal\n\n- **Claude Code:** `claude mcp remove tronbyt`\n- **Claude Desktop / other clients:** delete the `\"tronbyt\"` entry from the config\n  file and restart the client.\n- **If you installed from source:** delete the cloned directory. If you used `npx`, a\n  cached copy may linger under `~/.npm/_npx`; it's small and harmless, or clear it\n  with `npm cache clean --force`.\n- **On the server:** anything you pushed shows up as an installation on the device —\n  ask your assistant to delete it, or remove it in the Tronbyt web UI. Revoke the API\n  key in the web UI if you're done with it. Nothing else is stored anywhere.\n\n## Development\n\n```sh\nnpm install\nnpm test            # vitest: unit + in-process MCP + stdio e2e (builds first)\nnpm run build       # tsc -> dist/\nnpm run gen:font    # regenerate src/font.ts from scripts/tom-thumb.bdf\n```\n\nSmoke test against a real server (non-destructive — pushes to the rotation in\nbackground mode, then deletes the installation). Run from the repo root after a build:\n\n```sh\nTRONBYT_BASE_URL=http://tronbyt.local:8000 TRONBYT_API_KEY=<key> scripts/smoke.sh\n```\n\n## Out of scope (v1)\n\n- `update_firmware_settings` — deliberately excluded; a bad value can leave a display\n  unreachable\n- Animation (multi-frame WebP), image-by-URL\n- HTTP transport (stdio only)\n\n## License\n\nMIT. The bundled pixel font is Tom Thumb / \"Fixed4x6\" by Brian J. Swetland and Robey\nPointer (MIT), vendored as `scripts/tom-thumb.bdf`. This project is not affiliated with\nTidbyt (the company) or the Tronbyt project.\n",
  "bytes": 7141,
  "sha": "b903832857ba553adf1e39f539f8d739a3eac29ee878f12ab9c97c2b3acc083e",
  "repo_slug": "jonfishr/tronbyt-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_jonfishr_tronbyt_mcp_7662154b/readme"
}