Skip to main content
Glama
README.md
# ๐ŸŽฎ Roku MCP Server

[ํ•œ๊ตญ์–ด](#ํ•œ๊ตญ์–ด) | [English](#english)

---

## ํ•œ๊ตญ์–ด

Roku ๊ธฐ๊ธฐ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ์ธ์ฆ์„ ์œ„ํ•œ **MCP (Model Context Protocol) ์„œ๋ฒ„**์ž…๋‹ˆ๋‹ค.  
AI ์—์ด์ „ํŠธ(Gemini, Claude, Copilot ๋“ฑ)๊ฐ€ Roku ๊ธฐ๊ธฐ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

### โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

- ๐Ÿ“ฆ **์•ฑ ๋ฐฐํฌ** โ€” ์‚ฌ์ด๋“œ๋กœ๋“œ ๋ฐฐํฌ ๋ฐ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜
- ๐Ÿ–ฅ๏ธ **ํ•ด์ƒ๋„ ๊ฒ€์ฆ** โ€” HD/FHD ํ˜ธํ™˜์„ฑ ์ž๋™ ํ™•์ธ
- โŒจ๏ธ **๋ฆฌ๋ชจ์ปจ ์ œ์–ด** โ€” ํ‚ค ์ž…๋ ฅ, ์‹œํ€€์Šค, ํ…์ŠคํŠธ ์ž…๋ ฅ
- ๐Ÿ“ฑ **์•ฑ ๊ด€๋ฆฌ** โ€” ์„ค์น˜๋œ ์•ฑ ์กฐํšŒ, ์‹คํ–‰, ๋”ฅ๋งํฌ ํ…Œ์ŠคํŠธ
- ๐Ÿ“‹ **๋กœ๊ทธ ์ˆ˜์ง‘** โ€” BrightScript ์ฝ˜์†” ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ
- ๐Ÿ” **SceneGraph ๊ฒ€์‚ฌ** โ€” ๋…ธ๋“œ ํŠธ๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ, ํฌ์ปค์Šค ์š”์†Œ
- ๐ŸŽฅ **์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง** โ€” ์žฌ์ƒ ์ƒํƒœ, ๋ฒ„ํผ๋ง, ๋Œ€์—ญํญ
- ๐Ÿ›ก๏ธ **์ธ์ฆ ๊ฒ€์ฆ** โ€” DRM, ์ ‘๊ทผ์„ฑ(Audio Guide/์ž๋ง‰), RAF ๊ด‘๊ณ 
- ๐Ÿงช **ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ** โ€” ์—ฌ๋Ÿฌ ๋™์ž‘์„ ์‹œํ€€์Šค๋กœ ์ž๋™ ์‹คํ–‰

### ๐Ÿ“‹ ๋„๊ตฌ ๋ชฉ๋ก (25๊ฐœ)

| ์นดํ…Œ๊ณ ๋ฆฌ | ๋„๊ตฌ | ์„ค๋ช… |
|---------|------|------|
| ๋ฐฐํฌ | `roku_deploy` | ์•ฑ ์‚ฌ์ด๋“œ๋กœ๋“œ ๋ฐฐํฌ |
| | `roku_screenshot` | ํ™”๋ฉด ์บก์ฒ˜ (base64 ์ด๋ฏธ์ง€) |
| ๋””์Šคํ”Œ๋ ˆ์ด | `roku_device_info` | ๊ธฐ๊ธฐ ์ •๋ณด (๋ชจ๋ธ, ํ•ด์ƒ๋„, ํŽŒ์›จ์–ด) |
| | `roku_check_resolution` | HD/FHD ํ•ด์ƒ๋„ ํ˜ธํ™˜์„ฑ ๊ฒ€์ฆ |
| ์ž…๋ ฅ | `roku_keypress` | ๋ฆฌ๋ชจ์ปจ ํ‚ค ์ž…๋ ฅ |
| | `roku_keypress_sequence` | ํ‚ค ์‹œํ€€์Šค ์ „์†ก |
| | `roku_input` | ์ปค์Šคํ…€ ์ด๋ฒคํŠธ/๋”ฅ๋งํฌ ํŒŒ๋ผ๋ฏธํ„ฐ |
| ์•ฑ ๊ด€๋ฆฌ | `roku_apps` | ์„ค์น˜๋œ ์•ฑ ๋ชฉ๋ก |
| | `roku_active_app` | ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์•ฑ |
| | `roku_launch` | ์•ฑ ์‹คํ–‰/์žฌ์‹œ์ž‘ |
| | `roku_deep_link` | ๋”ฅ๋งํฌ ์ธ์ฆ ํ…Œ์ŠคํŠธ |
| | `roku_registry` | ์•ฑ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ ์กฐํšŒ |
| | `roku_app_state` | ์•ฑ ๋ผ์ดํ”„์‚ฌ์ดํด ์ถ”์  |
| ๋กœ๊ทธ | `roku_log` | BrightScript ์ฝ˜์†” ๋กœ๊ทธ |
| SceneGraph | `roku_sg_nodes` | SG ๋…ธ๋“œ ํŠธ๋ฆฌ ๊ฒ€์‚ฌ |
| | `roku_perf` | CPU/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ |
| | `roku_graphics_fps` | ๊ทธ๋ž˜ํ”ฝ FPS |
| | `roku_element` | UI ์š”์†Œ ๊ฒ€์ƒ‰ (WebDriver) |
| | `roku_focused_element` | ํฌ์ปค์Šค ์š”์†Œ ์กฐํšŒ |
| ์ŠคํŠธ๋ฆฌ๋ฐ | `roku_media_player` | ๋ฏธ๋””์–ด ์žฌ์ƒ ์ƒํƒœ |
| | `roku_server_check` | ์„œ๋ฒ„ ํ—ฌ์Šค์ฒดํฌ |
| ์ธ์ฆ | `roku_check_drm` | DRM ์ฝ˜ํ…์ธ  ๋ณดํ˜ธ ์ƒํƒœ |
| | `roku_check_accessibility` | ์ ‘๊ทผ์„ฑ ์ค€์ˆ˜ ๊ฒ€์‚ฌ |
| | `roku_check_raf` | RAF ๊ด‘๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ ๊ฒ€์ฆ |
| ํ…Œ์ŠคํŠธ | `roku_run_test` | ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹คํ–‰ |

### ๐Ÿ› ๏ธ ์„ค์น˜

```bash
git clone https://github.com/maskelog/roku-mcp.git
cd roku-mcp
npm install
npm run build
```

### โš™๏ธ ์„ค์ •

`.env.example`์„ `.env`๋กœ ๋ณต์‚ฌํ•œ ํ›„ ์„ค์ •:

```env
ROKU_DEV_HOST=192.168.0.100     # Roku ๊ธฐ๊ธฐ IP (์„ค์ • > ๋„คํŠธ์›Œํฌ > ์ •๋ณด)
ROKU_DEV_PASSWORD=your_password  # Developer Mode ๋น„๋ฐ€๋ฒˆํ˜ธ
ROKU_PROJECT_ROOT=               # ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ (๊ธฐ๋ณธ: ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ)
ROKU_APP_SERVER_URL=             # ์•ฑ ์„œ๋ฒ„ URL (์„ ํƒ)
```

> โš ๏ธ Roku Developer Mode๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

### ๐Ÿ”Œ MCP ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ

AI ์—์ด์ „ํŠธ์˜ MCP ์„ค์ •์— ์ถ”๊ฐ€:

```json
{
  "mcpServers": {
    "roku-dev": {
      "command": "node",
      "args": ["/path/to/roku-mcp/dist/index.js"],
      "env": {
        "ROKU_DEV_HOST": "192.168.0.100",
        "ROKU_DEV_PASSWORD": "your_password"
      }
    }
  }
}
```

### ๐Ÿ’ก ์‚ฌ์šฉ ์˜ˆ์‹œ

AI ์—์ด์ „ํŠธ์—๊ฒŒ ์ž์—ฐ์–ด๋กœ ์š”์ฒญ:
- *"Roku ๊ธฐ๊ธฐ ์ •๋ณด ์•Œ๋ ค์ค˜"* โ†’ `roku_device_info`
- *"์•ฑ ๋ฐฐํฌํ•˜๊ณ  ์Šคํฌ๋ฆฐ์ƒท ์ฐ์–ด์ค˜"* โ†’ `roku_deploy` โ†’ `roku_screenshot`
- *"๊ด‘๊ณ  ์„ค์ • ์–ด๋–ค์ง€ ํ™•์ธํ•ด"* โ†’ `roku_check_raf`
- *"HD/FHD ํ•ด์ƒ๋„ ํ˜ธํ™˜ ๋˜๋Š”์ง€ ๋ด์ค˜"* โ†’ `roku_check_resolution`
- *"ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋Œ๋ ค์ค˜"* โ†’ `roku_run_test`

---

## English

MCP (Model Context Protocol) server for **Roku device development, testing, and certification**.  
Enables AI agents (Gemini, Claude, Copilot, etc.) to directly control and test Roku devices.

### โœจ Features

- ๐Ÿ“ฆ **App Deployment** โ€” Sideload apps and capture screenshots
- ๐Ÿ–ฅ๏ธ **Resolution Verification** โ€” Auto-check HD/FHD compatibility
- โŒจ๏ธ **Remote Control** โ€” Key presses, sequences, text input
- ๐Ÿ“ฑ **App Management** โ€” List apps, launch, deep link testing
- ๐Ÿ“‹ **Log Collection** โ€” Real-time BrightScript console logs
- ๐Ÿ” **SceneGraph Inspection** โ€” Node tree, memory, focused elements
- ๐ŸŽฅ **Streaming Monitoring** โ€” Playback state, buffering, bandwidth
- ๐Ÿ›ก๏ธ **Certification Checks** โ€” DRM, accessibility (Audio Guide/Captions), RAF ads
- ๐Ÿงช **Integration Testing** โ€” Automated multi-step test sequences

### ๐Ÿ“‹ Tools (25)

| Category | Tool | Description |
|----------|------|-------------|
| Deploy | `roku_deploy` | Sideload app to device |
| | `roku_screenshot` | Capture screen (base64 image) |
| Display | `roku_device_info` | Device info (model, resolution, firmware) |
| | `roku_check_resolution` | Verify HD/FHD resolution support |
| Input | `roku_keypress` | Send remote key press |
| | `roku_keypress_sequence` | Send key sequence |
| | `roku_input` | Custom events / deep link params |
| App | `roku_apps` | List installed apps |
| | `roku_active_app` | Currently running app |
| | `roku_launch` | Launch / restart app |
| | `roku_deep_link` | Test deep linking (certification req.) |
| | `roku_registry` | Read app registry data |
| | `roku_app_state` | Track app lifecycle |
| Logging | `roku_log` | BrightScript console logs |
| SceneGraph | `roku_sg_nodes` | Inspect SG node tree |
| | `roku_perf` | CPU / memory usage |
| | `roku_graphics_fps` | Graphics frame rate |
| | `roku_element` | Find UI element (WebDriver) |
| | `roku_focused_element` | Get focused element |
| Streaming | `roku_media_player` | Media playback state |
| | `roku_server_check` | Server health check |
| Certification | `roku_check_drm` | DRM content protection status |
| | `roku_check_accessibility` | Accessibility compliance |
| | `roku_check_raf` | RAF ad framework verification |
| Testing | `roku_run_test` | Run integration test sequence |

### ๐Ÿ› ๏ธ Installation

```bash
git clone https://github.com/maskelog/roku-mcp.git
cd roku-mcp
npm install
npm run build
```

### โš™๏ธ Configuration

Copy `.env.example` to `.env` and configure:

```env
ROKU_DEV_HOST=192.168.0.100     # Roku device IP (Settings > Network > About)
ROKU_DEV_PASSWORD=your_password  # Developer Mode password
ROKU_PROJECT_ROOT=               # Project root (default: parent directory)
ROKU_APP_SERVER_URL=             # App server URL (optional)
```

> โš ๏ธ Roku Developer Mode must be enabled on the target device.

### ๐Ÿ”Œ MCP Client Setup

Add to your AI agent's MCP configuration:

```json
{
  "mcpServers": {
    "roku-dev": {
      "command": "node",
      "args": ["/path/to/roku-mcp/dist/index.js"],
      "env": {
        "ROKU_DEV_HOST": "192.168.0.100",
        "ROKU_DEV_PASSWORD": "your_password"
      }
    }
  }
}
```

### ๐Ÿ’ก Usage Examples

Ask your AI agent in natural language:
- *"Show me the Roku device info"* โ†’ `roku_device_info`
- *"Deploy the app and take a screenshot"* โ†’ `roku_deploy` โ†’ `roku_screenshot`
- *"Check if the ad framework is set up correctly"* โ†’ `roku_check_raf`
- *"Verify HD/FHD resolution support"* โ†’ `roku_check_resolution`
- *"Run a full integration test"* โ†’ `roku_run_test`

### ๐Ÿ—๏ธ Architecture

```
roku-mcp/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ index.ts              # MCP server entry (25 tools + 2 resources)
โ”‚   โ”œโ”€โ”€ roku-client.ts        # ECP + Dev Web Server client
โ”‚   โ”œโ”€โ”€ log-client.ts         # BrightScript console (Telnet :8085)
โ”‚   โ”œโ”€โ”€ webdriver-client.ts   # Roku WebDriver (port 9000)
โ”‚   โ””โ”€โ”€ test-runner.ts        # Integration test orchestrator
โ”œโ”€โ”€ dist/                     # Compiled output
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ tsconfig.json
โ””โ”€โ”€ .env.example
```

### ๐Ÿ“ก Roku APIs Used

| API | Port | Purpose |
|-----|------|---------|
| ECP (External Control Protocol) | 8060 | Device control, queries, key presses |
| Developer Web Server | 80 | App sideloading, screenshots |
| BrightScript Console | 8085 | Runtime logs, debugging |
| SceneGraph Debug | 8080 | SG-specific debugging |
| WebDriver | 9000 | UI element automation |

### ๐Ÿ“ Self-Documenting

Every tool includes inline Roku API documentation in its description โ€” API endpoints, ports, parameters, expected responses, and links to official docs. AI agents can use the tools without consulting external documentation.

---

## License

MIT