Roku Dev Studio MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_action_typesA | Return every supported Action Script step |
| get_action_schemaA | Return the authoring schema (label, description, required and optional fields) for ONE Action Script step |
| get_capability_bundleA | Single payload of every static capability (actions, vocabularies, RALE built-ins, presets, authoring rules, op directory, |
| validate_scriptA | Validate an Action Script before |
| probe_bridgeA | Returns |
| get_selected_deviceA | Return the single device tab the user currently has focused in Dev Studio ( |
| list_devicesA | Return every device Dev Studio already knows about — connected, discovered, remembered, or remote — without running a network scan. Read-only. Each entry: |
| connect_deviceA | Open (or focus, if already open) a Dev Studio device tab for the given Roku, making it the active target for renderer-routed tools (rale_command, telnet_*, app_function, get_telnet_log). Required |
| list_app_connector_functionsA | Live |
| rale_get_node_by_idA | Read-only convenience wrapper over rale_command |
| send_script_to_builderA | Drop a validated Action Script into Dev Studio Builder for human review (does not auto-run). Runs the same validation as |
| network_inspector_statusA | Report whether Dev Studio's Network Inspector is enabled and actively capturing, plus connected Roku clients, packet/event counts, MITM (HTTPS decryption) state, and |
| network_inspector_list_eventsA | List captured network events as lightweight summaries (no full headers/body — drill down with network_inspector_get_event_detail using an event |
| network_inspector_get_event_detailA | Fetch the full headers and body for one captured event by |
| network_inspector_analyzeA | Aggregate the captured buffer into hotspots and rollups in one call — counts by event type, by HTTP status class (2xx/3xx/4xx/5xx), top hosts (with error counts), top content types, total HTTP/MITM transactions, error count, and the largest responses. Use this to orient on a session before drilling into individual events. Accepts the same optional filters as network_inspector_list_events ( |
| network_inspector_findA | Search the FULL content of captured transactions — request/response URL, headers, and bodies — for |
| network_inspector_get_ca_infoA | Return the Dev Studio MITM CA fingerprint, proxy host:port, and the BrightScript snippet needed to trust the proxy so HTTPS request/response bodies become visible to the Network Inspector. Use when network_inspector_list_events shows TLS handshakes but no decrypted HTTP bodies, to guide the user through enabling HTTPS decryption for their sideloaded dev channel. |
| debugger_attachA | Open a BrightScript debug session to the Roku on control port 8081. REQUIRED FIRST — every other debugger_* tool needs an attached session. Prefer calling the read-only |
| debugger_detachA | Close the debug session for a device (releases the 8081 control socket). Idempotent — a no-op if not attached. The running channel keeps executing. |
| debugger_statusA | Return the session |
| debugger_wait_for_stopA | Block (server-side poll) until the target HALTS at a breakpoint / STOP / step-completion / runtime error, then return |
| debugger_continueA | Resume execution from a halted state (run until the next breakpoint / STOP / error). After calling this, use debugger_wait_for_stop to catch the next halt. Only meaningful while |
| debugger_pauseA | Request a halt of a running channel (best-effort). Follow with debugger_wait_for_stop to get the snapshot once it stops. Only meaningful while |
| debugger_stepA | Single-step the halted thread. |
| debugger_get_callstackA | Return the call-stack frames (function, file, line — top frame first) for the halted thread. Requires the target to be HALTED. Optional |
| debugger_get_variablesA | Return variables in scope at a stack frame while HALTED. With no |
| debugger_evaluateA | Run a BrightScript expression/statement in the halted frame (the debug-console REPL) — e.g. |
| debugger_set_breakpointsA | Add breakpoints. |
| debugger_remove_breakpointsA | Remove breakpoints by location. |
| debugger_list_breakpointsA | List the breakpoints the debugger is tracking for a device: each with |
| keypressA | Send one ECP remote key (e.g. "Home", "Up", "Select", "Play") to a Roku device — mirrors a physical remote press. Mutates on-screen state: each key advances the UI, so repeated calls are NOT a no-op. Use keypress for navigation/transport keys; to type characters into a focused text field use input_text (far faster than sending "Lit_" keys one at a time). |
| launch_appA | Launch a channel / app on the device to its home screen by app id. Discover ids with ecp_query "/query/apps"; "dev" is the sideloaded Dev App. Changes device state (foregrounds the app). To open the app directly on a specific title use deep_link instead; optional launch params are passed through as ECP query params. |
| input_textA | Type a literal text string into whatever input field is currently focused on the device (ECP /input endpoint). Requires a text field to already be focused — use keypress to navigate into one first. Mutates the focused field: repeated calls append, so this is NOT read-only or idempotent. Use this instead of sending characters as individual keypress keys. |
| deep_linkA | Launch an app straight into a specific piece of content via ECP Deep-Link (contentId + mediaType, plus any extra params the channel expects). Equivalent to /launch/?contentId=...&mediaType=...&. Changes device state (foregrounds the app on the requested content). Use this when you have a content id to open; to just open an app to its home screen use launch_app instead. |
| ecp_queryA | Run a read-only ECP GET against a device (device info, installed apps, active app, media player state, …). Pick an endpoint from list_query_presets or pass any /query/* path. Read-only — does not change device state. This is the go-to inspection tool; for state-changing POSTs use ecp_post, and to enumerate app ids call this with "/query/apps". |
| ecp_postA | POST to an arbitrary ECP endpoint (e.g. /sgrendezvous/track). Side-effecting — agents should use list_post_presets for safe defaults. For read-only lookups use ecp_query instead. |
| test_connectionA | Probe one known device IP for ECP reachability and return basic device info. Does not require a Dev Studio tab to be open — use it to confirm a specific IP is a reachable Roku before connect_device. Read-only. Differs from its siblings: probe_bridge checks whether Dev Studio itself is running (not a device); scan_devices discovers unknown devices on the network; test_connection verifies one address you already have. |
| get_app_iconA | Fetch the 336x210 app icon for one installed channel on the device, returned as base64 / data URL (ECP /query/icon/). Read-only. Discover valid app ids with ecp_query "/query/apps" (or launch_app's notes); "dev" is the sideloaded Dev App. Use this to preview a channel's branding — for a picture of the current screen use screenshot instead. |
| sideloadA | Upload and install a .zip channel package on the device. Destructive: replaces any currently sideloaded Dev App (readOnly false; not safe for autonomous use without user intent). Provide the zip in ONE of two ways: (1) |
| delete_sideloadA | Remove the currently sideloaded Dev App from the device. Password optional when Dev Studio has remembered it for this device. Destructive; idempotent (deleting when nothing is sideloaded still ends with no Dev App). To install/replace a Dev App use sideload — you do not need to delete first, since sideload overwrites. |
| screenshotA | Capture a screenshot of the current device screen and return it inline as an MCP image content block (JPEG, base64). Hosts (Cursor, Claude Desktop, etc.) render this image to the user, so for any human-facing capture let |
| scan_devicesA | Discover Roku devices on the local network via SSDP (multicast) and, optionally, a subnet HTTP sweep. Read-only; does not connect devices — follow up with connect_device to open a tab. Use this to FIND unknown devices; to list devices Dev Studio already knows (connected / remembered) without a network scan, use list_devices instead. |
| rale_commandA | Run any built-in RALE command against the active App Connector session — including destructive ones (addRegistryField, removeRegistrySection, clearRegistry, …). Use list_rale_builtins for the catalog. Every call surfaces as a toast in Dev Studio. Some commands read (getNodeById, getRegistry) and some write; the tool as a whole is not read-only — for a plain read prefer rale_get_node_by_id. |
| app_connector_connectA | Open a RALE / App Connector session against the device's running Dev App. Mutates session state (establishes a connection), so it is not read-only; idempotent — reconnecting an open session is a no-op. You rarely need to call this explicitly: rale_command, app_function, and rale_get_node_by_id auto-connect on demand. Use it only to pre-warm the session or surface connection errors early. |
| app_connector_disconnectA | Close the RALE / App Connector session on the targeted device. Mutates session state (tears down the connection), so it is not read-only; idempotent — closing an already-closed session is a no-op. Use it to free the session or force a clean reconnect; normal RALE tools do not require you to disconnect between calls. |
| app_functionA | Invoke a single function on the sideloaded channel through the App Connector. Use this for any one-off function call exposed by the channel; only wrap it in an |
| get_telnet_logA | Read lines from the BrightScript debug console (port 8085) buffer that Dev Studio holds in memory. Returns |
| telnet_connectB | Open the BrightScript debug console (TCP 8085) for the targeted device, exactly as if the user had clicked the Connect button on the Telnet Console tab. Idempotent: returns |
| telnet_disconnectB | Close the BrightScript debug console (TCP 8085) for the targeted device, mirroring the Disconnect button. Idempotent: returns |
| console_monitor_findingsA | Analyze the in-memory BrightScript debug console (port 8085) buffer and return the recognized BrightScript ISSUES and CRASHES — the same data the Console Monitor UI shows. Returns |
| device_performance_metricsA | Time-series Device Performance metrics — the same chanperf/r2d2-bitmaps/app-object-counts data the Remote tab's CPU/Memory/BrightScript Objects quad charts poll and plot, returned as compact per-timestamp entries with a decoding |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| roku-one-shot-action | Primes the agent to perform a single deterministic action (keypress, launch, ecp_query/post, rale_command, screenshot, …) via a direct op — **not** by authoring an Action Script. |
| roku-action-script-quickstart | Primes the agent to author an Action Script for multi-step / conditional / saved-or-reviewed flows (bridge probe → capability load → validate → send to Builder). For single actions, prefer `roku-one-shot-action`. |
| roku-debug-device | Primes the agent to inspect a Roku using read-only tools (probe_bridge → list_devices → get_selected_device → ecp_query / rale_get_node_by_id). |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| quick-start | One-page primer: bridge probe, capability loading, device selection, and the validate → send workflow. Read first. |
| action-script-contract | Canonical shape for validate_script / send_script_to_builder inputs (root, appFunction params, wait / if conditions). |
| capability-bundle | Every static catalog the agent needs in one JSON: actions, presets, vocabularies, RALE built-ins, authoring rules, op directory, and the agent contract. |
| authoring-rules | Constraints the agent must obey when generating Action Scripts (version, password handling, wait vs delay, …). |
TDQS
Scored across 51 tools
Every tool has a clearly distinct purpose, with detailed descriptions that eliminate ambiguity. Related tools (e.g., device discovery vs. connection vs. testing) are well-separated, and overlapping functions like rale_command vs. rale_get_node_by_id are explicitly distinguished.
Tool names follow a mostly consistent verb_noun pattern (e.g., get_selected_device, list_devices, connect_device, debugger_continue). Minor deviations like 'keypress', 'sideload', and 'app_function' are understandable and do not cause confusion, but the pattern is not perfectly uniform.
With 51 tools, the count far exceeds the 25+ threshold and even the 50+ extreme mismatch line. While the server covers a broad Roku development domain, the sheer number of tools is excessive and likely overwhelming for agents, suggesting a need for consolidation or modularization.
The toolset covers the full Roku development lifecycle: device discovery/connection, ECP control, debugging, app connector operations, telnet logging, network inspection, performance metrics, action scripting, and sideloading. There are no obvious gaps or dead ends; every operation an agent would need for Roku development is represented.