RokuMCP について
RokuMCPは、Rokuデバイスの自動化とアプリ開発向けのMCPサーバーです。エージェントによるデバイス操作や実行状態の調査を支援し、アプリ配布、ECP操作、スクリーンショット、SceneGraph検査、BrightScriptデバッグに対応します。
主な機能
- 01開発チャンネルの配布と削除
- 02ECPによるキー入力とチャンネル起動
- 03デバイス検出と端末・メディア状態の照会
- 04スクリーンショット撮影とアプリUIツリーの検査
- 05BrightScriptデバッグコンソールへのアクセス
活用シーン
- 01開発中のチャンネルをRokuデバイスに配布
- 02リモコン入力を自動化して画面変化を確認
- 03アプリUIノードを調べて問題箇所を特定
- 04デバッグコンソールの出力を確認
MCP 対応
RokuMCPは標準のMCP stdioトランスポートを使い、Rokuの操作、配布、撮影、UI検査、デバッグ用ツールをクライアントに提供します。デバイスアドレスを設定するほか、SSDPによるローカルネットワーク上の検出も可能です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
20掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| host | string | いいえ | Roku デバイスの IP アドレスまたはホスト名 |
| files | array | いいえ | 含めるファイルの Glob パターン。デフォルトでは rootDir 内のすべてのファイル(**/*)が対象です。 |
| rootDir | string | はい | manifest ファイルを含むプロジェクトルートディレクトリの絶対パス |
| password | string | いいえ | Roku デバイスの開発者パスワード |
詳細
roku-mcp
Roku デバイスの自動化に対応するModel Context Protocol(MCP)サーバーです。アプリのデプロイ、ECP リモートコントロール、スクリーンショットの撮影、SceneGraph ノードの検査、BrightScript デバッグコンソールへのアクセス用ツールを提供します。
インストール
サーバーは単一の npx コマンドとして提供されています。必要であれば一度だけグローバルにインストールするか、MCP クライアントから npx -y roku-mcp を使って必要に応じて起動できます。どちらも動作します。
npm install -g roku-mcp # optional, global install
# or just point your client at: npx -y roku-mcp
プラグインモード(Claude Code と Cursor)
非公式のコミュニティツールです。Roku, Inc. とは提携しておらず、同社の推奨を受けたものでもありません。
このリポジトリには、MCP サーバー、ワークフロースキル(skills/)、Cursor ルールをまとめて登録するプラグインも含まれています。
- Claude Code:
/plugin marketplace add jack1590/RokuMCPの後に/plugin install roku-mcp@roku-mcp-marketplaceを実行します。マニフェスト:.claude-plugin/、.mcp.json。 - Cursor: マニフェストは
.cursor-plugin/とmcp.jsonにあります。スキルはskills/、ルールはrules/cursor/にあります。
プラグインを有効にすると、Claude Code はデバイスのホストと開発者パスワードを尋ねます(パスワードは機密情報として保存されます)。両方のクライアントでエントリポイント bootstrap.mjs を使用します。どちらも初回起動時に npm ci と npm run build を実行します(Node 18 以上)。プラグインモード以外では、ROKU_DEVICE_HOST / ROKU_DEVICE_PASSWORD またはプロジェクトの .env も引き続き使用できます。
以下で AI クライアントを設定してください。すべてのプラットフォームで同じ起動コマンドを使用し、異なるのは設定ファイルと再読み込みの手順だけです。
Cursor — エージェントモードのツール、MCP サーバーを自動検出
前提条件: Agent モードを備えた Cursor 0.45 以上。
インストール: プロジェクトのルートに .cursor/mcp.json を作成します(グローバルに設定する場合は ~/.cursor/mcp.json)。
{
"mcpServers": {
"roku": {
"command": "npx",
"args": ["-y", "roku-mcp"],
"env": {
"ROKU_DEVICE_HOST": "192.168.1.XXX",
"ROKU_DEVICE_PASSWORD": "your-password"
}
}
}
}
その後、ウィンドウを再読み込みします(Cmd+Shift+P / Ctrl+Shift+P → Developer: Reload Window)。
確認: Cursor Settings → MCP を開き、roku の行に緑色の点が表示されていることを確認します。無効になっている場合は、切り替えボタンをクリックします。新しいエージェントチャットで list roku tools と入力すると、roku_deploy、roku_screenshot などが表示されます。
ルーティングルール(推奨): このリポジトリには AGENTS.md も含まれています。Cursor はこれを自動的に読み込むため、毎回説明しなくても、エージェントは標準の 観察 → 実行 → 待機 → 検証 のループと、RTA の uiElementId に関する注意点を把握できます。
トラブルシューティング: サーバーがグレー表示または無効のままの場合は、View → Output → MCP Logs を確認してください。最もよくある原因は、LAN 上で ROKU_DEVICE_HOST に到達できないことです。env ブロックを完全に省略すると、SSDP による自動検出に切り替わります。
VS Code (GitHub Copilot) — エージェントモード、.vscode/mcp.json 経由の MCP
前提条件: VS Code 1.99 以上、GitHub Copilot 拡張機能、および Agent モードを含む有効な Copilot サブスクリプション。
インストール: プロジェクトのルートに .vscode/mcp.json を作成します。
{
"servers": {
"roku": {
"command": "npx",
"args": ["-y", "roku-mcp"],
"env": {
"ROKU_DEVICE_HOST": "192.168.1.XXX",
"ROKU_DEVICE_PASSWORD": "your-password"
}
}
}
}
ウィンドウを再読み込みします(Cmd+Shift+P / Ctrl+Shift+P → Developer: Reload Window)。
確認: Copilot Chat を開き、チャットモードのドロップダウンを Agent に切り替えて、「どんな roku ツールがありますか?」と尋ねます。roku_* の一覧がすべて表示されるはずです。MCP パネル(Cmd+Shift+P → MCP: List Servers)では、roku が Running と表示されます。
トラブルシューティング: サーバーが起動しない場合は、まず通常のターミナルで npx -y roku-mcp --help を実行してください。これにより、VS Code が起動する前に Node 18 以上と npx が動作することを確認できます。
Claude Desktop — Anthropic 公式デスクトップアプリ
前提条件: Claude Desktop(claude.ai/download から最新版を入手)、PATH 上の Node.js 18 以上。
インストール: Claude Desktop の設定を編集します。
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"roku": {
"command": "npx",
"args": ["-y", "roku-mcp"],
"env": {
"ROKU_DEVICE_HOST": "192.168.1.XXX",
"ROKU_DEVICE_PASSWORD": "your-password"
}
}
}
}
Claude Desktop を完全に終了してから再起動します(メニューバーのアイコンを終了する必要があります。macOS では Cmd+Q を押します)。
確認: 新しいチャットを開きます。入力欄の 🛠️ アイコンに、すべてのツールとともに roku-mcp が表示されるはずです。「Roku のスクリーンショットを撮って」と依頼すると、Claude は roku_screenshot の承認を求めて実行します。
Windsurf — Codeium のエージェント型 IDE
前提条件: Cascade が有効な Windsurf。
インストール: プロジェクトのルートに .windsurf/mcp.json を作成します(または、グローバル設定として ~/.codeium/windsurf/mcp_config.json を作成します)。
{
"mcpServers": {
"roku": {
"command": "npx",
"args": ["-y", "roku-mcp"],
"env": {
"ROKU_DEVICE_HOST": "192.168.1.XXX",
"ROKU_DEVICE_PASSWORD": "your-password"
}
}
}
}
ウィンドウを再読み込みします。Cascade の設定で、MCP サーバーリストを更新します。
確認: Cascade に「利用可能な MCP ツールを一覧表示して」と尋ねます。roku_* の項目が表示されるはずです。
トラブルシューティング: Windsurf では、古いサーバーがキャッシュされることがあります。再読み込みしても編集内容が反映されない場合は、Windsurf を完全に終了してから再起動してください。
任意の MCP 互換クライアント(Continue、Cline、Zed、Codex、Claude Code、OpenCode、…)
このサーバーは、標準の MCP stdio トランスポートに対応しています。次のように宣言できる環境であれば、どこでも動作します。
command: npx
args: ["-y", "roku-mcp"]
env: { ROKU_DEVICE_HOST: "...", ROKU_DEVICE_PASSWORD: "..." }
両方の環境変数は省略可能です。ROKU_DEVICE_HOST を省略すると、LAN 上で SSDP による自動検出が行われます。また、各ツール呼び出しで host/password を指定すると、設定を上書きできます。
リポジトリのルートにある AGENTS.md は、Claude Code、OpenCode、Codex CLI、および AGENTS.md の規約に従うその他のツールによって自動的に読み込まれます。そのため、追加設定なしで各エージェントが同じ使用ガイドラインを引き継ぎます。
エージェントのルール
エージェントの動作を改善するため(observe → act → wait → verify のループ、roku_edit_node が気付かないうちに動作しなくなる RTA の uiElementId に関する注意点、各ツールの使い分け)、このリポジトリには主要なエージェントごとに、そのまま導入できる形式のルールが用意されています。本文は同一で、各エージェントが自動読み込みする形式に合わせてラッパーだけが異なります。
| エージェント | ファイル | インストール先 |
|---|---|---|
| Cursor | rules/cursor/roku-mcp.mdc | .cursor/rules/roku-mcp.mdc |
| Claude Code | rules/claude-code/CLAUDE.md | CLAUDE.md(リポジトリのルート) |
| Claude Desktop | rules/claude-desktop/roku-mcp.md | Settings → System Prompt |
| Windsurf | rules/windsurf/roku-mcp.md | .windsurf/rules/roku-mcp.md |
| Codex CLI / OpenCode / Aider | AGENTS.md(リポジトリのルート) | AGENTS.md(リポジトリのルート) |
各エージェント用の1行コピーコマンドについては、rules/README.md を参照してください。
クイックスタート
クライアントの接続が完了すると、次の3つのプロンプトをすぐに使って、主な機能グループを試せます。
1. デバイスに接続できることを確認する
Use roku-mcp to query my Roku device info and tell me the model, firmware, and IP.
エージェントは roku_query_device_info(ホストが設定されていない場合は roku_discover も)を呼び出し、1ターンで応答するはずです。
2. スクリーンショットを使って UI を操作する
Press Home, wait 2 seconds, take a screenshot, then move Right twice and
screenshot again. Describe what changed between the two screenshots.
これにより roku_keypress、roku_sleep、roku_screenshot を使った、標準的な observe → act → wait → verify ループを試せます。
3. 実行中のチャンネルをライブ編集する(RTA が必要です。ランタイム UI 編集を参照してください)
On the currently running dev channel, find the label that shows the page
title, change its text to "Hello from MCP", verify the change with
roku_get_value, then change it back.
エージェントは roku_query_app_ui でノードを特定し、uiElementId を取得して、roku_edit_node と roku_get_value を呼び出してから変更を元に戻します。これにより、RTA の接続がエンドツーエンドで機能することを確認できます。
環境変数
| 変数 | 説明 |
|---|---|
ROKU_DEVICE_HOST | Roku デバイスの IP アドレスまたはホスト名 |
ROKU_DEVICE_PASSWORD | Roku デバイスの開発者パスワード |
どちらも各ツール呼び出しのパラメーターとして渡すことができ、その場合は環境変数の設定が上書きされます。
自動検出
ROKU_DEVICE_HOST が設定されておらず、host パラメーターも指定されていない場合、サーバーは SSDP を使ってローカルネットワーク上の Roku デバイスを自動検出し、最初に見つかったデバイスを使用します。roku_discover ツールを使って、利用可能なデバイスをすべて一覧表示することもできます。パスワードは検出できないため、別途設定する必要があります。
.env ファイルのサポート
サーバーは dotenv を使用して、現在の作業ディレクトリにある .env ファイルを自動的に読み込みます。プロジェクトの .env ですでに ROKU_DEVICE_HOST と ROKU_DEVICE_PASSWORD を使用している場合、追加の設定なしでサーバーがそれらを読み込みます。MCP 設定から env ブロックを省略するだけです。
ROKU_DEVICE_HOST=192.168.1.100
ROKU_DEVICE_PASSWORD=my-password
プロジェクトで異なる変数名(例:ROKU_IP、ROKU_DEV_PASSWORD)を使用している場合は、env ブロックでマッピングできます。
"env": {
"ROKU_DEVICE_HOST": "${ROKU_IP}",
"ROKU_DEVICE_PASSWORD": "${ROKU_DEV_PASSWORD}"
}
または、既存の変数とあわせて、必要な2つの変数を .env に追加するだけです。
利用可能なツール
デプロイ
| ツール | 説明 |
|---|---|
roku_deploy | Roku アプリをデバイスにサイドロード(デプロイ)します。一時フォルダーを使用してステージングします(stagingDir で上書き可能)。これにより、プロジェクトの bsconfig.json によって rootDir が消去されることを防ぎます |
roku_delete_dev_channel | 現在サイドロードされている開発者チャンネルを削除します |
検出
| ツール | 説明 |
|---|---|
roku_discover | SSDP を使用してローカルネットワーク上の Roku デバイスをスキャンします |
ECP(外部制御プロトコル)
| ツール | 説明 |
|---|---|
roku_keypress | 単一のキー入力を送信します(Home、Select、Up、Down、Left、Right、Back など) |
roku_keypress_sequence | 設定可能な遅延を挟んで、複数のキー入力を順番に送信します |
roku_type_text | フォーカスされているフィールドにテキスト文字列を入力します(例:メールアドレス、パスワード、検索語) |
roku_launch | チャンネルを起動するか、ディープリンクで開きます(restart: true の場合は、先に終了します) |
roku_query_device_info | デバイスのモデル、ファームウェア、シリアル番号、ネットワーク情報を取得します |
roku_query_active_app | 現在実行中のアプリを取得します |
roku_query_media_player | メディアプレーヤーの状態(再生/一時停止/バッファリング/停止)、再生位置、再生時間を取得します |
roku_query_app_ui | 現在のアプリの UI ツリーを XML として取得します |
roku_query_sg_nodes | SceneGraph ノードをクエリします(すべて、ルート、またはノード ID 指定) |
roku_find_node | ID または属性(サブタイプ、テキストなど)を指定して、UI ツリー内のノードを検索します |
roku_get_focused_node | 現在フォーカスされているノードと、そのすべてのプロパティを取得します |
roku_sleep | 指定した時間待機します(ナビゲーション手順の合間に便利です) |
スクリーンショット
| ツール | 説明 |
|---|---|
roku_screenshot | スクリーンショットを撮影します(base64 画像とファイルパスを返します) |
デバッグコンソール
| ツール | 説明 |
|---|---|
roku_console_connect | BrightScript デバッグコンソールへの TCP 接続を開きます(ポート 8085) |
roku_console_read | バッファーされたコンソール出力を読み取り、自動的に切断します |
roku_console_send | デバッグコンソールにコマンドを送信し、自動的に切断します |
roku_console_disconnect | コンソール接続を閉じます(安全策) |
roku_console_capture_start | ポート 8085 を開いたままにし、コンソール出力をファイルに記録します(前のセッションの再生はスキップします。デフォルトは ./logs/<timestamp>-rokuDevice.log) |
roku_console_wait | 正規表現に一致する、キャプチャされた行を待ちます。predicate: "jwtValid" は任意です。行番号、タイムスタンプ、伏せ字処理されたプレビューを返し、コンソールの生データは返しません |
roku_console_capture_stop | キャプチャを停止し、ファイルを閉じます |
roku_console_capture_status | キャプチャがアクティブかどうか、およびファイルとサイズを報告します |
ランタイム UI の編集
再デプロイせずに、実行中のサイドロード済み開発チャンネルの SceneGraph UI を編集できます。vscode-brightscript-language 拡張機能の SceneGraph Inspector が使用するものと同じバックエンドです。これらのツールは、チャンネルの On-Device Component に対して TCP ポート 9000 で roku-test-automation(RTA)プロトコルを使用するため、デバッガーを一時停止することなく変更が即座に反映されます。
| ツール | 説明 |
|---|---|
roku_edit_node | ID で指定したノードの 1 つ以上のフィールド(表示状態、translation、テキスト、色、不透明度など)を設定します |
roku_set_node_visible | ID で指定したノードの表示/非表示を切り替えます |
roku_move_node | ノードを [x, y] に移動します |
roku_focus_node | ID で指定したノードにフォーカスを設定します(RTA focusNode) |
roku_remove_node | 実行時にノードを親から切り離します(RTA removeNode) |
roku_create_node | 新しいノードを作成し、ID で指定した親に追加します(RTA createChild) |
roku_get_value | 実行中のシーンからフィールド値(または完全な keyPath)を読み取ります(RTA getValue) |
roku_observe_field | フィールドが変更されるか、値に一致するまで待機します(RTA onFieldChangeOnce)。「X になるまで待つ」アサーションに最適です |
仕組み。 各ツールは、実行中のチャンネルにある RTA On-Device Component(ポート 9000)への短時間の TCP 接続を開き、長さプレフィックス付きの JSON リクエスト(setValue/getValue/focusNode/…)を送信して、フレーム化された JSON レスポンスを解析します。変更はデバッガーに割り込むことなく、SceneGraph スレッドで適用されます。
ノードの指定。 nodeId には、次のいずれかを指定できます。
RTA_1773のようなuiElementId(RTA の実行中は、すべてのノードについてroku_query_sg_nodes/roku_query_app_uiの出力に表示されます)。最も確実な指定方法です。- チャンネルのソース内でノードに定義された実際の BrightScript
id属性。
/^RTA_\d+$/ に一致する値は RTA の base: "elementId" として送信されます。それ以外は base: "scene" として送信されます。
必須:チャンネルに RTA On-Device Component をインストールする
これらのツールは、テスト対象のチャンネルに RTA が含まれている場合にのみ動作します。方法は 2 つあります。
オプション A — サイドロードのたびに roku-debug に RTA を挿入させます(VS Code ユーザーにおすすめ)。
-
launch.jsonで、次を有効にします。"injectRdbOnDeviceComponent": true -
source/main.brsで、screen.show()の直後にマーカーコメントを追加します。sub main() screen = createObject("roSGScreen") ' ... screen.show() ' vscode_rdb_on_device_component_entry ' ... end sub
オプション B — RTA コンポーネントを自分で同梱します。 roku-test-automation の device/components フォルダーをチャンネルにコピーし、シーンから RTA_OnDeviceComponent を 1 回インスタンス化します。
どちらの方法でも、インストールが成功すると、チャンネルの起動時にデバイスログに次の内容が表示されます。
[RTA][INFO] OnDeviceComponent init
ランタイム UI ツールが接続拒否エラーを返す場合、実行中のチャンネルに RTA が存在しません。上記のインストール方法のいずれかを適用し、再デプロイしてください。
BrightScript プロファイラー
Roku デバイスで生成された .bsprof ファイルを分析します。これらのツールは bsprof-cli を使用して、バイナリ形式のプロファイラーデータを解析し、構造化された JSON レポートを返します。
| ツール | 説明 |
|---|---|
analyze_bsprof | .bsprof ファイルを分析します。メモリリーク、CPU のホットパス、完全なレポート、または要約に対応しています。モジュール/ファイルによるフィルタリングと並べ替えオプションも使用できます。 |
compare_bsprof | 2 つの .bsprof プロファイルを比較し、リグレッション、改善、新たなリーク、解消されたリークを検出します。 |
bsprof_info | 完全な解析を行わずに、ヘッダーのメタデータ(ターゲット名、デバイス、ファームウェア、形式のバージョン、機能)を取得します。 |
.bsprof ファイルを生成するには、Roku アプリの manifest でプロファイラーを有効にし(bs_prof_enabled=true)、アプリを実行して、http://<device-ip>:8080 からプロファイルをダウンロードします。
Perfetto トレース
Roku デバイスの Perfetto トレースを記録、分析、比較します。Roku OS 15.1+ が必要です。これらのツールは、ECP 制御、WebSocket による記録、PerfettoSQL による分析に roku-perfetto を使用します。
| ツール | 説明 |
|---|---|
roku_perfetto_enable | ECP 経由でチャンネルの Perfetto トレースを有効にします(次回のアプリ起動時にトレースが開始されます) |
roku_perfetto_start | WebSocket バイナリストリーム経由で Perfetto トレースの記録を開始します |
roku_perfetto_stop | 記録を停止し、ファイルパス、サイズ、時間を返します |
analyze_perfetto | .trace ファイルを分析します — サマリー、フレームドロップ、主要イベント、オブザーバー、ランデブー、set-fields、スレッドに対応します。AI が扱いやすい構造化 JSON と提案を返します。 |
compare_perfetto | 2 つの .trace ファイルを比較し、パフォーマンスの低下や改善を検出します |
query_perfetto | トレースファイルに対して PerfettoSQL クエリを直接実行し、カスタム分析を行います |
ワークフロー:トレースを有効化 → 記録を開始 → アプリを操作 → 記録を停止 → 分析。.trace ファイルは ui.perfetto.dev で開くこともできます。
ストリーム診断
ほかのあらゆる環境では再生できる HLS/DASH ストリームが Roku で再生できない原因を特定します。
| ツール | 説明 |
|---|---|
roku_diagnose_stream | Video ノードの errorInfo、マニフェスト(取得可能な url または貼り付けた content)、任意の Charles/HAR キャプチャを照合し、Roku 固有の根本原因を順位付けして提示します(原因、証拠、確信度、深刻度、修正方法、ドキュメントへのリンク)。captureLive=true を指定すると、バンドルされた StreamProbe ハーネスをデプロイして、先にデバイスのエラーをキャプチャできます。 |
fMP4/CMAF HLS で音声と映像が多重化されている(映像は再生されるが無音になる)、ハードウェアデコーダーの対応範囲を超える動画コーデックやレベル(例:4K H.264 または 8K HEVC)、トークン/403 で制限された CDN、DRM ライセンスの拒否など、Roku 固有の注意点を検出します。静的なマニフェストチェックは手がかりとして扱われます。実際のデバイスの errorInfo を指定すると、診断結果の確信度が高まります。
要件
- Node.js 18+
- 同じネットワーク上で 開発者モード を有効にした Roku デバイス
- スクリーンショットの撮影とデプロイには、サイドロードした開発用チャンネルが実行中である必要があります
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。