Deckhand MCP Server
Allows configuring Now Playing keys that display track information and full album art from Spotify, and control playback on the Stream Deck.
Allows configuring Now Playing keys for YouTube Music (desktop and browser) that show track details and album art (using YouTube video thumbnails as fallback), and control playback on the Stream Deck.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Deckhand MCP Serveradd a play/pause key with album art to my first page"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Why Deckhand?
Linux has Stream Deck tools, but most of them either look dated or make you fight the workflow. Deckhand is built to feel like the Windows app people love, minus the Windows: a clean three-panel editor, drag-and-drop everything, instant feedback on the real deck, and sensible behaviour when things go wrong.
Looks and flows like a modern desktop app. Dark theme, purposeful micro-animations, undo/redo for everything, a command palette, no sideways scrolling.
Runs great on Wayland. Keys are injected through
uinputand window tracking uses KWin, so nothing depends on X11 tools.Zero fragile dependencies. Only PyQt6 and the
hidapisystem library. The USB driver, the MCP server and the D-Bus bridge are written in plain Python.Safe by design. Corrupt data is quarantined, never overwritten. Every edit is undoable. AI agents ask before they run anything.
Related MCP server: streamdeck-mcp
Features
Layout and editing
Three-panel editor: searchable action list, a live deck canvas, and an inspector for the selected key.
Drag and drop: drop actions on keys, drag keys to rearrange (Ctrl-drag to copy), drop an image onto a key to use it as its icon, or drag a key onto a page tab to move it there.
Pages, folders and profiles with import/export, duplicate, reorder and copy-between-profiles.
Template gallery with ready-made pages: Media, Streaming, Productivity, Developer, System monitor.
Command palette (
Ctrl+K) to jump to any profile, page, folder, action or command.Full undo/redo, copy/paste/duplicate keys, keyboard navigation,
F1shortcut cheat sheet.Modern colour picker (not the 1990s dialog): saturation square, hue strip, hex field, palette and recents.
Actions
Group | What you get |
System | Hotkey recorder, type text, open app / file / website, run command or script, lock, sleep, screenshot, toggle monitor |
Network | HTTP request (GET/POST/PUT/PATCH/DELETE with headers and body) for webhooks and smart-home |
Multimedia | Play/pause, next/previous, stop, volume, mute, mic mute (optionally pinned to one device) |
Navigation | Folders, page next/previous, switch profile, brightness |
Widgets | Live clock, CPU / RAM / GPU gauges, Now Playing with album art, counter, stopwatch / countdown timer (a countdown rings a built-in chime or your own sound, then resets). Every widget has its own colours, sizes and show/hide options in the inspector |
Multi action | Chain any actions with delays |
Hold actions: a quick tap runs the main action, holding (configurable) runs a second one.
State-aware keys: Mic Mute, Mute and Play/Pause follow the real system state (even when changed elsewhere). Any other key can get an alternate "active" look that toggles on press.
Now Playing with album art
Works with any MPRIS player. Spotify and YouTube Music (desktop apps and browser tabs) are handled explicitly: low-resolution thumbnails are upgraded to full covers, YouTube video thumbnails are used as a fallback, downloads happen in the background and are cached, and a failed download never stalls the key.
Wallpapers, including animated ones
Spread one image across the whole deck, aligned across the physical gaps between keys. Fill / Fit / Stretch, zoom, position and darken controls. Animated GIF and WebP wallpapers play on the deck at 5-20 fps with smart frame pacing (a slow deck drops frames instead of lagging) and bounded memory.
Auto-switch profiles by active window
Map an app or a window title (plain text or re: regex) to a profile; the first matching rule wins. On KDE Plasma this uses a tiny KWin script that is loaded only while the feature is on, and nothing leaves your computer.
AI agents (MCP) built in
Deckhand ships an MCP server so Claude, Codex, Gemini CLI, Cursor, Windsurf, VS Code, Zed, opencode and any other MCP-capable agent can design and manage your deck.
deckhand mcp install # connects every agent app it finds, one command34 tools: read the layout, build pages and keys, set icons and wallpapers, manage profiles, take screenshots to verify their own work, undo, and more. Batch edits are a single undo step.
Three access levels (Read-only, Edit layout, Full control) set in the Agents dialog; the default is Edit layout.
Approval prompts: tools that run things on your computer (
press_key,run_action) show exactly what will run and wait for your click.Private by construction: the server listens on a user-only Unix socket, nothing is exposed on the network.
Reliability
Diagnosed device states: not plugged in, held by another program (with a Close it button), missing USB permission (with the exact fix), unsupported model, missing
hidapi. Offline editing always works and the deck is filled the moment it appears.Branded loading screen that ends as soon as the deck is found or a clear problem is known.
Never loses data: corrupt files are copied aside, saves retry on failure, a daily automatic backup is kept, and Preferences has Back up, Restore (with a safety copy) and Save diagnostics.
Fail-soft rendering: a broken key becomes a warning tile, never a crash.
Quality of life
Night dimming schedule, idle sleep, press animation, remembered window layout, start-minimized tray mode with autostart, single-instance guard, hold-time setting, per-action friendly error messages ("'konsole' isn't installed (Arch package: konsole)").
Supported hardware
Device | Status |
Stream Deck (original V2, 15 keys) | Tested on real hardware |
Stream Deck MK.2 (15 keys) | Supported (same protocol), not hardware-tested |
Stream Deck XL (32 keys) | Supported (same protocol), not hardware-tested |
Mini, Neo, Plus, Pedal | Not supported yet (different protocols) |
Multiple decks are detected; pick which one to use from the status chip.
Install
Requirements
Linux with Python 3 (developed and tested on Python 3.14, CachyOS / Arch, KDE Plasma 6, Wayland)
PyQt6 (with QtSvg, QtNetwork and QtDBus)
The hidapi system library
# Arch / CachyOS
sudo pacman -S python-pyqt6 hidapi
# Other distros: install PyQt6 (with QtSvg/QtNetwork/QtDBus) and hidapi from your package manager;
# package names vary, and only Arch has been tested.Get it
Arch / CachyOS (installs the dependencies, launcher, menu entry, icon and the udev rules for you):
git clone https://github.com/ProfetGit/deckhand.git
cd deckhand/packaging/arch && makepkg -siAny distro with PyQt6 and hidapi installed: pipx install --system-site-packages git+https://github.com/ProfetGit/deckhand.git (then add the udev rules below).
A Flatpak manifest is in packaging/flatpak/. It builds and starts, but actions that run host tools do not work inside the sandbox; prefer the options above.
From a checkout (per-user, no root):
git clone https://github.com/ProfetGit/deckhand.git
cd deckhand
./scripts/install.sh # per-user launcher, app-menu entry and icon (no root)
deckhand # or start it from your app menuYou can also run it straight from the checkout: python3 -m deckhand.
One-time permissions
USB access to the deck. If Deckhand reports a permission problem it shows the exact fix. The rule is:
printf '%s\n' 'SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", TAG+="uaccess"' \
'KERNEL=="hidraw*", ATTRS{idVendor}=="0fd9", TAG+="uaccess"' \
| sudo tee /etc/udev/rules.d/70-deckhand-streamdeck.rules >/dev/null \
&& sudo udevadm control --reload-rules && sudo udevadm triggerSending keystrokes (hotkeys, media keys) uses /dev/uinput. Preferences shows a one-line rule if it is not accessible:
echo 'KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess", OPTIONS+="static_node=uinput"' \
| sudo tee /etc/udev/rules.d/70-deckhand-uinput.rules >/dev/null \
&& sudo udevadm control --reload-rules && sudo udevadm triggerOnly one program can control a Stream Deck at a time. Close the Elgato software, StreamController, streamdeck-ui or OpenDeck first; Deckhand will tell you if one of them is holding the deck.
Usage
Plug in your deck and start Deckhand. The deck's keys appear in the editor.
Drag an action from the left panel onto a key (or double-click it to add it to the selected key).
Fine-tune the key in the panel below: icon, title, colours, the action's settings, an optional hold action and an optional "active" look.
Use
Ctrl+Kfor everything else.
Closing the window keeps Deckhand running in the tray so your keys keep working; quit from the tray menu.
Keyboard shortcuts
Shortcut | Action |
| Command palette |
| Undo / redo |
| Copy, cut, paste the selected key |
| Duplicate the selected key |
| Clear the selected key |
| Go to page 1 to 9 |
| Open a folder (or go back) |
| Shortcut cheat sheet |
AI agents: setup details
deckhand mcp status # which agent apps were found and which are connected
deckhand mcp install # connect all detected apps (or name one: claude-code, codex, gemini, ...)
deckhand mcp uninstall # remove it again
deckhand mcp config # print a JSON snippet for any other agentThe agent's config simply starts deckhand mcp, a tiny stdio bridge that launches the app if needed and talks to it over a private Unix socket. Config files are merged (never overwritten) and backed up first. In the app, open Agents to switch access levels, see connected agents and revoke "allow for this session" approvals.
How it works
deckhand/
hardware.py USB HID driver (ctypes over hidapi), device scan and the reconnect state machine
engine.py central controller: profiles, navigation, undo, device sync, key dispatch
render.py key renderer (one code path for the deck and the editor)
actions.py action registry and executors templates.py ready-made pages
wallpaper.py wallpaper slicing and animation autoswitch.py KWin script + D-Bus bridge
sysinfo.py live system state (mute, MPRIS, GPU)
agentapi.py the agent-facing tool set mcp_server.py MCP over a Unix socket
mainwindow.py, widgets.py, inspector.py, ... the Qt interface
tests/ headless test suites (UI, engine, MCP, installer, resilience, animation...)
docs/ README images and the script that regenerates themData lives in ~/.config/deckhand/ (profiles.json, settings.json, imported icons, backups/, errors.log). Profiles are plain JSON.
Development
pip install -r requirements.txt # PyQt6 and Pillow (tests and image generation)
python3 tests/smoke.py # engine, UI, drag and drop, key states
python3 tests/test_mcp.py # MCP server end to end through the real stdio bridge
python3 tests/test_install.py # agent installer (sandboxed HOME)
python3 tests/test_resilience.py # corrupt data, device states, loading screen
python3 tests/test_anim.py # animated wallpapers
python3 tests/test_autoswitch.py # window rules and the D-Bus path
python3 tests/test_features.py # hold actions, timers, pages, templates, backups
python3 tests/test_nowplaying.py # Now Playing, Spotify / YouTube Music art
python3 tests/test_timer.py # timer sound, auto-reset and custom sounds
python3 tests/test_buttons.py # button hover glow, pointer cursor
python3 docs/make_assets.py # regenerate the images in docs/imagesAll tests run headless (QT_QPA_PLATFORM=offscreen) in throwaway config directories, so they never touch your real profiles or hardware.
Contributions are welcome. Please open an issue first for larger changes, keep new actions self-contained in actions.py (registry entry plus executor), and add tests next to the behaviour you change.
Troubleshooting
Symptom | Fix |
"X is using your Stream Deck" | Close that program (the banner has a Close it button). Disable its autostart if it keeps coming back. |
"Not allowed to use the Stream Deck" | Install the udev rule above, then re-plug the deck. |
Hotkeys do nothing | Install the |
Auto-switch says it is unsupported | It needs KDE Plasma (KWin scripting). Everything else works on any desktop. |
Anything else | Preferences > Save diagnostics and attach the file to an issue. Errors are also in |
Roadmap
Ideas that are not built yet: multi-select keys, a macro recorder, a screen eyedropper in the colour picker, more deck models, and window-aware switching on desktops other than KDE.
License and notices
Released under the MIT License.
Deckhand is an independent project. It is not affiliated with, endorsed by or sponsored by Elgato or Corsair. "Stream Deck" is a trademark of its respective owner and is used here only to describe compatible hardware. Spotify and YouTube Music are trademarks of their owners; Deckhand only displays cover art that your own media player publishes.
This server cannot be deployed
Maintenance
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI to generate fully authored Elgato Stream Deck profiles with buttons, icons, colors, dials, and shell scripts from natural language prompts.7127 PyPI51MIT
- AlicenseAqualityDmaintenanceControl your Elgato Stream Deck from Claude Code with high-quality icons, full profile management, and task context aggregation from Slack, Notion, and GitHub.10MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI tools to create, edit, and run Linux macro pad decks via DeckApp, including pressing buttons and executing their commands.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to directly control a Mirabox Stream Dock N3 via tools for key/screen updates, brightness, power, event listening, and layout management.MIT