Skills/PyPI/opendeck-mcp

opendeck-mcp@0.5.0

VERIFIED· not started

Publisher claims: "MCP server for configuring OpenDeck (open-source Stream Deck software) in natural language" Observed in sandbox: no network, touches nothing outside the project, writes no memory.

Registry PyPI (MCP server)Publisher kastro5 · publishing for 30 daysInstalls 677Last detonated 18 h ago
$claude mcp add opendeck-mcp -- uvx opendeck-mcp
WatchReport an issue

Coverage

Not started: dependency install failed; the server itself was not observed.
Tested
the dependency install step · every file read, file written and host contacted by what ran
Not tested
server startup · the tool list · tool behavior

What this means for the label: Verified here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.

Before you give it your token

It will ask for
OPENDECK_MCP_TOKENConfiguration, not credentials: OPENDECK_CONFIG_DIR, OPENDECK_EXE, OPENDECK_MCP_HA_VERIFY_TLS
Where it talks to
no vendor host named in the codeAlso jsdelivr.net, amankhanna.me — not the publisher's domain; check what for before connecting.
What the honeypot saw
no credential files read · no network
What we could not test
server startup · the tool list · tool behavior

Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names jsdelivr.net, amankhanna.me as well as its own vendor. The guard injects OPENDECK_MCP_TOKEN only into requests to the host you bind (and its subdomains) and refuses the rest.

$vet-skills run --net declared -- uvx opendeck-mcp

Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.

Is [email protected] safe to install?

KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-13 and scored it 85/100 (Verified). In what ran, nothing we could detect went wrong: no undeclared network egress, no credential reads, no persistent instruction writes. What it does with a real credential was not observed; the static findings and the publisher carry the rest of the score. Summary: no network, touches nothing outside the project, writes no memory.

Behavior trace

Honeypot run · 0 s · 2 scenarios · 0 deviations
t+CategoryObserved action
0.0sprocessno install scripts in bundle
0.1sprocessdependency install exit 1 ·
0.1sclaimednot started: dependency install failed (exit 1); the server itself was not observed
0.2sprocessscript backend runs setup only
0.2sprocessno install scripts to re-run

Static findings

MEDIUM
Python subprocess execution detectedscripts/build_plugin.py:41 · Python subprocess execution detectedsubprocess.run([Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/runtime/process.py:141 · Python subprocess execution detectedsubprocess.Popen(args, start_new_session=True, **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/runtime/detached.py:65 · Python subprocess execution detectedsubprocess.Popen(command, creationflags=detached | new_group | no_window, **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
HTTP URL with a raw public IP addresstests/test_http.py:38 · HTTP URL with a raw public IP address — a hard-coded destination that domain-based monitoring cannot nameasync with httpx.AsyncClient(transport=transport, base_url="http://100.77.1.2:8765") as client:Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.
AST07
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/runtime/process.py:63 · Python subprocess execution detectedsubprocess.run([str(paths.exe), "--process-message", json.dumps(message)], timeout=30,Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/runtime/detached.py:67 · Python subprocess execution detectedsubprocess.Popen(command, start_new_session=True, **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/runtime/detached.py:63 · Python subprocess execution detectedsubprocess.Popen(command, creationflags=detached | new_group | no_window | breakaway, **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
URL using a raw public IP addresstests/test_http.py:38 · URL using a raw public IP address — may bypass domain-based filteringasync with httpx.AsyncClient(transport=transport, base_url="http://100.77.1.2:8765") as client:Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.
AST07
MEDIUM
URL using a raw public IP addresstests/test_http.py:57 · URL using a raw public IP address — may bypass domain-based filtering'claude mcp add --transport http opendeck http://100.1.2.3:8765/mcp --header "Authorization: Bearer T"')Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.
AST07
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/runtime/process.py:137 · Python subprocess execution detectedsubprocess.Popen(args, creationflags=detached | new_group | breakaway, **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/runtime/process.py:139 · Python subprocess execution detectedsubprocess.Popen(args, creationflags=detached | new_group, **kwargs)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
MEDIUM
Python subprocess execution detectedsrc/opendeck_mcp/http.py:156 · Python subprocess execution detectedsubprocess.Popen(["wscript.exe", str(startup_script())], close_fds=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
AST05
LOW
URL to a private-network addresstests/test_homeassistant.py:93 · URL to a private-network address — a LAN or development targetassert ha._pinned("http://homeassistant.local:8123") == ("http://192.168.1.5:8123",Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.
AST07
MEDIUM
HTTP URL with a raw public IP addresstests/test_http.py:57 · HTTP URL with a raw public IP address — a hard-coded destination that domain-based monitoring cannot name'claude mcp add --transport http opendeck http://100.1.2.3:8765/mcp --header "Authorization: Bearer T"')Fix: Replace encoded or assembled strings with plain literals and remove undeclared network calls.
AST07

Cost to the agent

Instructions loaded
≈59 tok
1 file · 81 in bundle
Tool list per prompt
≈0 tok
0 tools · 0 per tool
Handshake
no reply
launch to tools/list, stdio
Undocumented tools
0
description under 20 chars · avg 0

Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.

Known vulnerabilities

No advisories in OSV for opendeck-mcp@0.5.0 as of 17 h ago. This is the package itself, not its dependencies.