Skip to main content
Glama

busybar-mcp

IMPORTANT

Unofficial community project, not affiliated with Flipper Devices / BUSY.

Let Claude and Codex draw and play sounds on your BUSY Bar: text, pixel art, pictures, animations, melodies, GitHub status and the weather.

Just ask: "put 'In a meeting' on the Bar", "draw a cat on the back screen", "play a fanfare".

Display orchestration

BusyBar MCP connects directly to the Bar over USB by default. Drawing, sound, and device diagnostics work with the direct connection.

For shared display orchestration, point BusyBar MCP at busybar-wm.

AI client → BusyBar MCP → busybar-wm → BUSY Bar

When connected through the WM, display commands use its proxy. The WM arbitrates display ownership and keeps each app's latest frame. Temporary messages and countdowns are drawn as a layer over the app selected by the WM, so app ownership and input routing continue underneath. When the overlay expires, the WM removes it and reveals the current app's frame. Use bar_clear to dismiss it sooner. Each display can hold one overlay at a time, and a new overlay on that display replaces the previous one.

Read-only diagnostics report hardware, battery, firmware, available updates, Wi-Fi, Bluetooth Low Energy, and the Bar's USB or Wi-Fi transport. Through the WM, these requests are forwarded to the device without claiming the display. The diagnostic tools report which readings the device could provide.

Related MCP server: streamdeck-mcp

Install

Claude Code: type this in Claude Code.

/plugin install busybar --marketplace viirtualp1/busybar-mcp

Claude Desktop: download busybar.mcpb, double-click it, press Install.

Codex:

npx busybar-mcp install --yes

Connect directly

Plug the Bar in over USB and leave the address blank to use 10.0.4.20. On Wi-Fi, tell your assistant the Bar's address, for example "my Bar is at 192.168.1.50". You can also use the BUSY cloud endpoint with a token.

To use both USB and LAN, leave the main address at the USB default and enter the LAN fallback address for the same Bar. The MCP checks USB before each operation and uses LAN when it can't reach USB. It checks USB again on the next operation, so reconnecting the cable restores USB preference. In Codex, run npx busybar-mcp install --yes --addr 10.0.4.20 --lan-addr 192.168.1.50.

Optional busybar-wm setup

Start busybar-wm 2.1.0 or later. Configure the device address and credentials in the WM, then set the MCP's BUSY_ADDR to the WM's HTTP address, normally http://127.0.0.1:4111. With the Codex installer, pass --addr <WM URL>.

If the WM has a WM_API_TOKEN, enter the same token in the MCP client settings or pass --wm-token <token> to the installer. The WM requires a token for control requests from another machine.

On macOS, allow the app under System Settings → Privacy & Security → Local Network, or it won't reach the Bar.

Updating

When a new version is out, Claude or Codex tells you in the next conversation, with what to run:

  • Claude Code: /plugin update busybar

  • Claude Desktop: download the new busybar.mcpb and double-click it

  • Codex: npx busybar-mcp@latest update

What changed is in the changelog. To hear about releases on GitHub: Watch → Custom → Releases.

What it can do

Tool

busybar_get_status

WM connection and active app, plus hardware, power, uptime, and firmware update status

busybar_get_connectivity

Wi-Fi details, BLE status and address, and USB or Wi-Fi transport

busybar_list_apps

WM · list manifest apps and see which have a frame ready

busybar_switch_app

WM · pin a ready app by name

busybar_show_message

WM · show a temporary message for 1–300 seconds

busybar_start_timer

WM · show a countdown for 1–86,400 seconds

busybar_return_to_auto

WM · release the app pin and resume automatic scheduling

busybar_send_input

WM · route an OK or START tap, or an encoder step, to a subscribed WM app

bar_text

one or two lines of text

bar_pixels

pixel art

bar_progress

a progress bar

bar_image

a picture from a file, a URL or the Bar's stock

bar_animation

a built-in animation

bar_sound

a built-in sound, an audio file, or a melody

bar_stock

list built-in images, animations and sounds

bar_screenshot

see what the screen shows

bar_clear

dismiss what the MCP drew and release its claim on the display

bar_connect

save the WM or Bar address and check reachability

bar_status

read device status and check reachability

github_ci

latest CI run of a repo

github_inbox

PRs to review, your PRs, your issues

weather

weather for a city

Works on both screens: the front colour strip and the back greyscale panel.

Notifications are per request. Ask your assistant to put a message on the Bar when a task finishes, or ask for a chime. Updating removes the previous BUSY Bar notification hooks and restores any earlier Codex notifier.

Settings

Set in the plugin's settings (Claude Code), the extension's (Claude Desktop), or by bar_connect and npx busybar-mcp install in ~/.busybar-mcp/config.json. Environment variables override them.

Key

BUSY_ADDR

Bar address (default 10.0.4.20 over USB), or the WM address

BUSY_LAN_ADDR

optional Wi-Fi or LAN address of the same Bar, used only when the main address is USB

WM_API_TOKEN

control token, if configured on the WM

BUSY_HTTP_PASSWORD

if the Bar's HTTP access is locked

BUSY_TOKEN

cloud token, with BUSY_ADDR=https://api.busy.app

GITHUB_TOKEN

otherwise gh auth token is used

Development

npm install
npm run build                     # build/server.mjs, build/busybar.mcpb, plugin/
npm test                          # stdio tool tests against mocked HTTP responses
BUSYBAR_DRY_RUN=1 npm run smoke    # preview smoke checks
npm run live                      # media tools on a real Bar
npm run live -- --wm              # diagnostics, temporary message and timer on a real Bar

To release: bump version, add a ## X.Y.Z section to CHANGELOG.md, npm run build, commit, tag vX.Y.Z and push. CI publishes to npm and makes a GitHub release with busybar.mcpb and that changelog section.

License

MIT

Available Tools

22 tools
bar_animationPlay an animationA

Play one of the Bar's stock animations (names from bar_stock, e.g. coding_72x16.anim, on_air_72x16.anim, meeting_72x16.anim). The size is in the name; 72x16 ones fill the front screen. Loops by default. Custom animations are not supported (closed format).

NameRequiredDescriptionDefault
xNo
yNo
loopNo
nameYes
urgentNoRequest higher draw priority. Use only when asked to interrupt.
captionNo
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
caption_colorNoHex colour, #RRGGBB
bar_clearClearB

Dismiss temporary overlays and drawings from the MCP. Both screens unless display is given.

NameRequiredDescriptionDefault
displayNo
bar_connectConnect to a BarC

Save a direct USB, Wi-Fi or cloud address, or a busybar-wm address. For USB, optionally set a LAN fallback.

NameRequiredDescriptionDefault
addrYes
tokenNoCloud token from cloud.busy.app/api-tokens
lan_addrNoOptional LAN fallback for USB. Pass an empty string to remove it.
passwordNoHTTP access password, if the Bar has one
bar_imageShow a pictureA

Show a picture: a local file path or an http(s) URL (PNG; on macOS also JPEG, GIF, HEIC, WebP), or a stock image from bar_stock. It is scaled to fit max_width x max_height (the whole screen by default), uploaded, and dithered to 16 greys on the back. Pixel art in small files stays sharp when scaled up.

NameRequiredDescriptionDefault
xNo
yNo
stockNoStock image name from bar_stock, e.g. dt_apple_red.image
sourceNoPath or URL of the picture
urgentNoRequest higher draw priority. Use only when asked to interrupt.
captionNo
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
max_widthNo
max_heightNo
caption_colorNoHex colour, #RRGGBB
bar_pixelsDraw pixel artA

grid is rows of single-character symbols, top to bottom; every symbol must be in palette (symbol → #RRGGBB, or "none" for transparent). Max 32 colours. Fits 72x16 on the front, 160x80 on the back (shown in grey there). Optionally add a caption to the right of the art. Look at the returned image and iterate if it looks wrong.

NameRequiredDescriptionDefault
xNo
yNo
gridYes
urgentNoRequest higher draw priority. Use only when asked to interrupt.
captionNo
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
paletteYes
caption_colorNoHex colour, #RRGGBB
bar_progressShow progressC

Show a labelled progress bar (0..1).

NameRequiredDescriptionDefault
colorNoHex colour, #RRGGBB
labelYes
valueYes
urgentNoRequest higher draw priority. Use only when asked to interrupt.
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
bar_screenshotScreenshotB

Grab what a BUSY Bar screen shows right now, as an image.

NameRequiredDescriptionDefault
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
bar_soundPlay a soundA

Play exactly one of: a stock sound (bar_stock), an audio file path or URL (WAV; MP3/M4A/AIFF too on macOS or with ffmpeg), or a melody you write. Melody: space-separated NOTE:ms tokens, e.g. "C5:150 E5:150 G5:150 C6:400", R for a rest, chords with + ("C4+E4+G4:500"). Up to 15s.

NameRequiredDescriptionDefault
fileNoPath or URL of an audio file
waveNoTimbre for melody: square is chiptune, sine is softsquare
stockNo
melodyNo
bar_statusBar statusB

Which Bar the server talks to, and its system status.

NameRequiredDescriptionDefault

No parameters

bar_stockList stock mediaB

Images, animations and sounds built into the Bar, for bar_image, bar_animation and bar_sound.

NameRequiredDescriptionDefault
kindNo
bar_textShow textA

Show a short status on the BUSY Bar, ASCII only. Front: 72x16, ~17 characters per line. Back: 160x80, ~37 characters per line. One or two lines; a long first line scrolls. Returns an image of the result.

NameRequiredDescriptionDefault
logoNoShow the Claude or Codex logo at the left, e.g. for "Claude is working on…"
colorNoHex colour, #RRGGBB
line1Yes
line2No
accentNoDraws a 3px coloured band on the left
urgentNoRequest higher draw priority. Use only when asked to interrupt.
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
led_colorNoBlink the status LED in this colour
line2_colorNoHex colour, #RRGGBB
busybar_get_connectivityA
Read-only

Read Wi-Fi, Bluetooth Low Energy, and USB or Wi-Fi transport status from the Bar.

NameRequiredDescriptionDefault

No parameters

busybar_get_statusA
Read-only

Read WM connection and active app, plus device, power, uptime, firmware and update status.

NameRequiredDescriptionDefault

No parameters

busybar_list_appsA
Read-only

List apps in the window manager manifest, including which are running and ready to show.

NameRequiredDescriptionDefault

No parameters

busybar_return_to_autoA

Release the current WM app pin and resume automatic display scheduling.

NameRequiredDescriptionDefault

No parameters

busybar_send_inputB

Route an OK or START tap, or an encoder step, to an app listening through the WM. Supply delta only for the encoder.

NameRequiredDescriptionDefault
keyYes
deltaNo
busybar_show_messageC

Show a temporary WM overlay and automatically reveal the app underneath when it expires.

NameRequiredDescriptionDefault
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
messageYes
durationSecondsNo
busybar_start_timerC

Start a countdown overlay on the Bar. The WM removes it when time runs out.

NameRequiredDescriptionDefault
labelNo
displayNofront: 72x16 colour LED strip facing others. back: 160x80 greyscale (16 levels) OLED facing you.front
durationSecondsYes
busybar_switch_appB

Pin a ready app by its exact name from busybar_list_apps.

NameRequiredDescriptionDefault
appYes
github_ciGitHub CI statusB

Latest GitHub Actions run for a repo branch (default branch if omitted). Shows it on the Bar unless show=false.

NameRequiredDescriptionDefault
repoYesowner/name
showNo
branchNo
github_inboxGitHub inboxA

Counts of PRs awaiting your review, your open PRs, and issues assigned to you. Shows them on the Bar unless show=false.

NameRequiredDescriptionDefault
showNo
weatherWeatherB

Current weather for a city (Open-Meteo). Shows it on the Bar with an icon unless show=false.

NameRequiredDescriptionDefault
cityYes
showNo

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 22 tool updatesv0.10.0
    • First observedbar_animation
    • First observedbar_clear
    • First observedbar_connect
    • First observedbar_image
    • First observedbar_pixels
    • First observedbar_progress
    • First observedbar_screenshot
    • First observedbar_sound
    • First observedbar_status
    • First observedbar_stock
    • First observedbar_text
    • First observedbusybar_get_connectivity
    • First observedbusybar_get_status
    • First observedbusybar_list_apps
    • First observedbusybar_return_to_auto
    • First observedbusybar_send_input
    • First observedbusybar_show_message
    • First observedbusybar_start_timer
    • First observedbusybar_switch_app
    • First observedgithub_ci
    • First observedgithub_inbox
    • First observedweather

TDQS

B3.2/5.0

Scored across 22 tools

Disambiguation4/5

Most tools target clearly distinct actions (show text, show pixels, play sound, screenshot, connect), so selection is generally unambiguous. However, bar_status, busybar_get_status, and busybar_get_connectivity overlap around device/connection state, and bar_clear versus the WM overlay lifecycle (show_message, start_timer, return_to_auto) leaves some uncertainty about which tool owns cleanup.

Naming Consistency3/5

Two near-identical prefixes, bar_ and busybar_, refer to the same physical device, and the GitHub/weather integrations are unprefixed, creating a mixed namespace. Within each prefix patterns differ too: bar_text/bar_pixels are noun-only while busybar_get_status/list_apps follow verb_noun, so naming is readable but not predictable.

Tool Count3/5

At 22 tools the surface is heavy for a single device-control server, sitting in the borderline 16-25 range. The display and WM operations justify most tools, but the three status readers and bundled GitHub/weather integrations inflate the count and could likely be consolidated.

Completeness4/5

Coverage is strong across display modes (text, pixels, progress, image, animation, sound, screenshot) and WM app control (list, switch, overlays, input, auto-return). Minor gaps remain: no explicit stop/cancel for a playing animation, sound, or active timer, and no brightness or volume control, though bar_clear and return_to_auto cover some cleanup.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI tools like Claude Code and Codex CLI to read and write serial port data, facilitating embedded development workflows such as coding, flashing, and debugging.
    24 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Talk to your Flipper Zero from Claude Code — or any MCP client. Storage, app deployment, screen capture, button automation, JavaScript execution on the device, and honest answers about what is nearby.
    66
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude Code to see and drive Bambu Lab 3D printers over the local network via MQTT, providing status, file management, print control, filament, maintenance, and diagnosis without any cloud dependency.
    MIT