- current_app: detects running app by iterating known aliases via REST
- aspect_ratio: get/set via UPnP X_GetAspectRatio/X_SetAspectRatio
- captions: get state via UPnP X_GetCaptionState, toggle via KEY_CAPTION
- Updated README to reflect 18 tools
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents _ok() from getting duplicate 'message' argument when
unpacking the dict returned by info() when TV is unreachable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All tools are now async with hard timeout (10s) via
asyncio.wait_for + ThreadPoolExecutor. If any sync operation
(WebSocket, UPnP, REST) hangs, the MCP returns an error
instead of freezing the entire Claude Code session.
Root cause: sync functions blocked FastMCP's event loop.
SIGALRM and ThreadPoolExecutor.result(timeout) don't work
inside FastMCP threads. asyncio.wait_for is the correct
pattern for this context.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove ThreadPoolExecutor/SIGALRM approaches (don't work in FastMCP threads)
- list_apps: return known aliases directly (WS app_list blocks on TU7000)
- _send_ws: simplified with auto-reconnect, no thread wrapping
- All timeouts via SamsungTVWS timeout param + urlopen timeout
- No operation can block the MCP process anymore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- WS_TIMEOUT (8s) for all WebSocket commands via ThreadPoolExecutor
- SIGALRM hard timeout for list_apps (recv blocks indefinitely)
- Fallback to known app aliases when TV doesn't respond to app_list
- SamsungTVWS constructor now passes timeout parameter
- Prevents MCP tools from hanging forever on unresponsive TV
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
15 tools for controlling Samsung Tizen TVs via local network.
Auto-discovery (SSDP), WebSocket remote, UPnP volume/DLNA,
app management, browser control, and Wake-on-LAN.
Tested on Samsung UN65TU7000KXZL (2020, Crystal UHD).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>