Skip to main content

MCP Roku Control

MCP Roku Control

A Model Context Protocol (MCP) server that enables AI assistants and agentic systems to control TVs on your local network.

Currently supports: Roku TVs via the External Control Protocol (ECP).

Based on mcp-remote-control by Aaron Goldsmith. This fork adds auto-discovery of Roku TVs via SSDP (with HTTP subnet scan fallback), fixes a connection pool exhaustion bug in the subnet scanner, and includes WSL2 networking guidance.

What is MCP?

The Model Context Protocol is an open standard that allows AI models to securely interact with external tools and data sources. This server exposes TV controls as MCP tools, enabling LLMs like Claude to control your TV through natural language commands.

Architecture

This project is designed with future extensibility in mind. The Roku-specific implementation is isolated in roku_bridge.py, separating the ECP protocol details from the MCP server layer. While the current implementation is Roku-specific, the structure provides a foundation for supporting additional TV brands and control protocols in the future.

Why Use This?

  • Natural Language Control: Tell your AI assistant "turn on Netflix" or "increase the volume" without touching a remote
  • Smart Home Integration: Integrate TV control into agentic workflows and automation systems
  • Accessibility: Control your TV through conversational interfaces
  • Development: Build custom applications that leverage AI-powered TV control

Prerequisites

TV Setup

Before using this server, you need to enable external control on your Roku TV:

  1. Enable Network Control:

    • Go to Settings > System > Advanced system settings
    • Select Control by mobile apps
    • Choose Network access and set to Default or Permissive
  2. Find Your TV's IP Address (optional — auto-discovery is supported):

    • Go to Settings > Network > About
    • Note the IP address (e.g., 192.168.1.100)
  3. Set Environment Variable (optional):

    export HOST_IP=192.168.1.100  # Replace with your TV's IP
    

    If HOST_IP is not set, the server will automatically scan the local network for Roku TVs on startup using SSDP. You can also trigger discovery at any time with the discover_tv() tool.

System Requirements

  • Python: 3.12 or higher
  • Network: TV and computer must be on the same local network
  • MCP Client: An MCP-compatible client like Claude Desktop, Claude Code, Goose or custom implementations

Features

  • Remote Control: Simulate button presses (navigation, playback, volume, power)
  • App Launching: Launch apps by name (e.g., "Netflix", "YouTube")
  • App Discovery: List all available apps and their IDs
  • Device Info: Query device information
  • Auto-Discovery: Automatically find Roku TVs on the local network via SSDP — no static IP required

Getting Started

Installation

The package is available on PyPI.

The easiest way to use this server is via uvx, which runs the package directly from PyPI without requiring a separate install step:

uvx mcp-roku-control

Alternatively, install globally with pip:

pip install mcp-roku-control

Using with Claude Desktop

Add this server to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "tv-control": {
      "command": "uvx",
      "args": ["mcp-roku-control"],
      "env": {
        "HOST_IP": "192.168.1.100"
      }
    }
  }
}

Replace 192.168.1.100 with your TV's IP address.

After updating the config, restart Claude Desktop. You can then ask Claude to control your TV:

  • "Turn on my TV and launch Netflix"
  • "Increase the volume"
  • "What apps are available on my Roku?"

Using with Claude Code

Install the server using the MCP server manager in Claude Code. See the Claude Code documentation for details.

Using with Other MCP Clients

This server uses the standard MCP protocol over stdio. See the MCP documentation for connecting local servers to your MCP client.

Local Development

If you want to modify the server or contribute to development, clone the repository and install in editable mode:

git clone https://github.com/AaronGoldsmith/mcp-remote-control.git
cd mcp-remote-control
pip install -e .
# or with uv:
uv pip install -e .

To use your local development version with Claude Desktop, point to the cloned directory:

{
  "mcpServers": {
    "tv-control": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/mcp-remote-control", "run", "mcp-roku-control"],
      "env": {
        "HOST_IP": "192.168.1.100"
      }
    }
  }
}

Replace /absolute/path/to/mcp-remote-control with the actual path to your cloned repository.

Available Tools

press_key(key_name)

Simulates a button press on the TV remote.

  • Navigation: Home, Up, Down, Left, Right, Select, Back
  • Playback: Play, Pause, Rev (Rewind), Fwd (FastForward)
  • Volume: VolumeUp, VolumeDown, VolumeMute
  • Power: PowerOff, PowerOn
  • Other: Info, InstantReplay, Search

launch_app(app_name)

Launches an app by name (case-insensitive). Examples:

  • launch_app("Netflix")
  • launch_app("youtube")
  • launch_app("Disney+")

list_apps()

Lists all available apps with their names and Roku channel IDs.

get_device_info()

Retrieves device information as XML.

power_on()

Powers on the TV.

discover_tv()

Scans the local network for Roku TVs via SSDP and updates the active TV to the first device found. Useful when HOST_IP is not set or when the TV's IP address has changed.

Supported Apps

The following apps are supported and can be launched by name using launch_app(). App names are case-insensitive and some apps have multiple accepted names (e.g., "Prime Video" or "Amazon Prime Video").

App Name Channel ID Alternative Names
Netflix 12 -
YouTube 837 -
Amazon Prime Video 13 Prime Video
Hulu 2285 -
Disney+ 291097 Disney Plus
HBO Max 61322 -
Apple TV+ 551012 Apple TV
Peacock 593099 -
Paramount Plus 31440 Paramount+
ESPN 34376 -
Tubi 41468 -
Sling TV 46041 -
STARZ 65067 -
CBS 619667 -
CNN 65978 -
Pluto TV 74519 -
SHOWTIME 8838 -

Use list_apps() to see the complete list programmatically.

Example Usage

Once connected to an MCP client, you can use natural language to control your TV:

User: "Turn on my TV and launch Netflix"
Assistant: *uses power_on() and launch_app("Netflix")*

User: "Show me what apps are available"
Assistant: *uses list_apps() to display all installed apps*

User: "Navigate down 3 times and select"
Assistant: *uses press_key("Down") three times, then press_key("Select")*

User: "Pause what's playing"
Assistant: *uses press_key("Pause")*

Learn More

MCP Resources

Roku Resources

Troubleshooting

  • Connection Failed: Ensure your TV and computer are on the same network and the TV's IP address is correct
  • Control Not Working: Verify that "Control by mobile apps" is enabled in your TV settings
  • App Not Launching: Check that the app is installed on your TV using list_apps()
  • Environment Variable: HOST_IP is optional — if omitted, auto-discovery runs at startup. Set it explicitly if discovery is slow or unreliable on your network.

WSL2 Users

SSDP discovery requires an inbound Windows Firewall rule to allow UDP responses from your local network to reach the WSL2 process. Run the following in an elevated PowerShell (replace the subnet if your home network differs):

New-NetFirewallRule -DisplayName "Roku SSDP WSL2" -Direction Inbound -Protocol UDP -RemoteAddress 192.168.1.0/24 -Action Allow

Without this rule, SSDP M-SEARCH responses are silently blocked by Windows Firewall. The server will fall back to an HTTP subnet scan, which works but is slower (~5–10 s vs. < 1 s for SSDP).

License

MIT

Release files for mcp-roku-control 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mcp-roku-control 0.1.1
File Size Uploaded
mcp_roku_control-0.1.1.tar.gz 12.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mcp-roku-control 0.1.1
File Interpreter ABI Platform
mcp_roku_control-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 23.2 kB

Release files / mcp_roku_control-0.1.1.tar.gz

Download URL mcp_roku_control-0.1.1.tar.gz
Size 12.7 kB
Tags Source
SHA-256 checksum
How to use checksums
215954b37005007a0d78ff77fff8e275706f807aaa25c470f2121fdd6f39832a
BLAKE2b-256 checksum
How to use checksums
f2fc8927faad5dd63efc2ffbc9a73b88a174db551ab6d0be959fb2590c2972f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / mcp_roku_control-0.1.1-py3-none-any.whl

Download URL mcp_roku_control-0.1.1-py3-none-any.whl
Size 10.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a466b464cf2661c023a967848d602d4614b2db08ffec6f2cebc4983f081ca637
BLAKE2b-256 checksum
How to use checksums
9c4ce6829d846c5445c989cbca72f320f51d3d3c96beec689976cc2a8733650d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page