MCP server for Stream Deck profile writing with legacy USB control
Project description
Stream Deck MCP
AI-first MCP server for Elgato Stream Deck profile management. The default server writes directly to the Stream Deck desktop app's native profile files, and the original USB-direct server is still available as a legacy fallback.
Installation
Default: Desktop Profile Writer
The default packaged entrypoint is the profile writer. It edits ProfilesV3 when present, then falls back to ProfilesV2.
uvx streamdeck-mcp
Local Repo Configuration
{
"mcpServers": {
"streamdeck": {
"command": "uv",
"args": [
"--directory",
"/path/to/streamdeck-mcp",
"run",
"profile_server.py"
]
}
}
}
Legacy USB Server
If you still want direct hardware control that bypasses the Elgato app entirely, keep using the legacy server:
{
"mcpServers": {
"streamdeck-usb": {
"command": "uv",
"args": [
"--directory",
"/path/to/streamdeck-mcp",
"run",
"server.py"
]
}
}
}
Or use the packaged legacy entrypoint:
uvx --from streamdeck-mcp streamdeck-mcp-usb
Default Tools
| Tool | What it does |
|---|---|
streamdeck_read_profiles |
Lists desktop profiles and page directories from the active ProfilesV3 or ProfilesV2 store |
streamdeck_read_page |
Reads a page manifest and returns simplified button details plus the raw manifest |
streamdeck_write_page |
Creates a new page or rewrites an existing page manifest |
streamdeck_create_icon |
Generates a 72x72 PNG icon with text and colors |
streamdeck_create_action |
Creates an executable shell script in ~/StreamDeckScripts/ and returns an Open action block |
streamdeck_restart_app |
Restarts the macOS Stream Deck desktop app after profile changes |
How the Profile Writer Works
ProfilesV3is preferred when it exists because page UUIDs map cleanly to directories.ProfilesV2is still supported, but existing pages should be targeted bydirectory_idorpage_indexbecause Elgato stores opaque page directory names there.streamdeck_write_pagecan accept raw native action objects, or use convenience fields likepath,action_type,plugin_uuid, andaction_uuid.- Generated icons are stored in
~/.streamdeck-mcp/generated-icons/. - Generated shell scripts are stored in
~/StreamDeckScripts/.
Usage Notes
- After writing profiles, the Elgato desktop app may need a restart to pick up the new manifests.
streamdeck_create_actionis the safest way to build shell-command buttons because it writes a standalone script and returns the native Open action block for it.- The profile writer does not require exclusive USB access.
Legacy USB Tools
The original USB-direct server is preserved for backwards compatibility. It still provides:
streamdeck_connectstreamdeck_infostreamdeck_set_buttonstreamdeck_set_buttonsstreamdeck_clear_buttonstreamdeck_get_buttonstreamdeck_clear_allstreamdeck_set_brightnessstreamdeck_create_pagestreamdeck_switch_pagestreamdeck_list_pagesstreamdeck_delete_pagestreamdeck_disconnect
Use that mode only when you want the MCP server to own the hardware directly and the Elgato desktop app is not running.
Development
uv venv
uv pip install -e ".[dev]"
uv run pytest tests/ -v
uv run ruff check .
To audit this repo against the shared Very Good Plugins MCP standards:
../mcp-ecosystem/scripts/audit-server.sh .
Support
For issues, questions, or suggestions:
Built with 🧡 by Very Good Plugins
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file streamdeck_mcp-0.2.0.tar.gz.
File metadata
- Download URL: streamdeck_mcp-0.2.0.tar.gz
- Upload date:
- Size: 29.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45bdb099b7738259fa40b453e550ea7a245aa8a5d03e1607607cfeb73c9cceff
|
|
| MD5 |
fb433ad3d1136cc1bd335f0ec0222f47
|
|
| BLAKE2b-256 |
a4402aa7f555b3fc0d1fc95e41faf24c95cd1078df0538d2f820679ce64392b2
|
Provenance
The following attestation bundles were made for streamdeck_mcp-0.2.0.tar.gz:
Publisher:
release.yml on verygoodplugins/streamdeck-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
streamdeck_mcp-0.2.0.tar.gz -
Subject digest:
45bdb099b7738259fa40b453e550ea7a245aa8a5d03e1607607cfeb73c9cceff - Sigstore transparency entry: 1156223066
- Sigstore integration time:
-
Permalink:
verygoodplugins/streamdeck-mcp@42f070923e7abe2d928209899330c1ff00397552 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/verygoodplugins
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@42f070923e7abe2d928209899330c1ff00397552 -
Trigger Event:
push
-
Statement type:
File details
Details for the file streamdeck_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: streamdeck_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 23.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5710718d6ca2320aa6b0d1feaa7bee2982663abe9a5425fc5e5dac9e0f755d40
|
|
| MD5 |
fc3136048cd458af92152710b733c5fa
|
|
| BLAKE2b-256 |
fbd9fa15fc3d692fbb913f73cd719b596b9be86f4af8b919b80584c36b5c2f2b
|
Provenance
The following attestation bundles were made for streamdeck_mcp-0.2.0-py3-none-any.whl:
Publisher:
release.yml on verygoodplugins/streamdeck-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
streamdeck_mcp-0.2.0-py3-none-any.whl -
Subject digest:
5710718d6ca2320aa6b0d1feaa7bee2982663abe9a5425fc5e5dac9e0f755d40 - Sigstore transparency entry: 1156223071
- Sigstore integration time:
-
Permalink:
verygoodplugins/streamdeck-mcp@42f070923e7abe2d928209899330c1ff00397552 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/verygoodplugins
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@42f070923e7abe2d928209899330c1ff00397552 -
Trigger Event:
push
-
Statement type: