Roku MCP Server
Provides full remote control of Roku Smart TVs and streaming players over the local network via Roku's ECP REST API — checking power state, active app, network and hardware status; powering the device on/off/toggle; launching channels by name or ID; adjusting volume and muting; sending physical remote keypresses (home, ok, back, play, etc.); typing text into search inputs; triggering Roku's native universal content search; and listing installed apps.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Roku MCP Serverturn on the TV and launch Netflix"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
📺 Roku MCP Server
High-performance Model Context Protocol (MCP) server for hands-free, voice and text control of Roku Smart TVs and streaming devices via Google Gemini (iPhone, Android, and Desktop) and Antigravity IDE.
🌐 Languages: English | Português (Brasil) | Español

🌟 Highlights
🗣️ Seamless Voice Control via Gemini App on iPhone: Talk to your television natively using Google Gemini Live or voice prompts.
⚡ Universal Dual-Transport MCP: Supports both modern SSE (Server-Sent Events) streaming and direct Streamable HTTP JSON-RPC handshaking with full CORS support.
🔒 Zero-Trust Network Security: Securely exposed to Google Cloud via Tailscale Funnel with official Let's Encrypt TLS certificates. Zero open router ports or UPnP risks.
🛡️ Google CodeMender Audited: Evaluated against OWASP and AI agent attack vectors (100% clean security bill of health).
📺 Comprehensive Hardware Support: Operates seamlessly across all Roku OS Smart TVs (Philco, TCL, AOC, Philips, Semp, Hisense) and Roku streaming sticks/players.
🚀 Built for Speed: Powered by
uv, Python 3.10+, and asynchttpxfor instantaneous (<50ms) command execution.
Related MCP server: roku-mcp
🏛️ Architecture
flowchart TD
subgraph Mobile["📱 Mobile / Voice Experience"]
User["User (Voice Prompt)"] -->|Voice Command| GeminiLive["Gemini App / Gemini Live (iOS / Android)"]
end
subgraph Cloud["☁️ Google Cloud"]
GeminiLive --> GeminiCloud["Google Gemini LLM Engine"]
end
subgraph Gateway["🛡️ Secure Ingress Layer"]
GeminiCloud -->|HTTPS / SSE / JSON-RPC| Funnel["Tailscale Funnel (TLS 1.3 / Let's Encrypt)"]
end
subgraph Host["🖥️ Local Host (Mac / Linux / Windows)"]
Funnel --> MCPServer["Roku MCP Server (:8000)"]
IDE["Antigravity IDE / Desktop CLI"] -->|stdio| MCPServer
end
subgraph LAN["🏠 Local Home Network (Wi-Fi / Ethernet)"]
MCPServer -->|HTTP REST ECP :8060| TV["Roku Smart TV / Streaming Player"]
end📺 Supported Devices & Televisions
This MCP server works with any television or device powered by Roku OS (versions 9.x through Roku OS 16.x).

1. Smart TVs with Roku OS
Brand | Popular Supported Models | Capabilities |
Philco | PTV50G70, PTV58G70R2CSGBL4K, PTV32G70RCH, PTV55G7ER2CP | 4K UHD, HDR10, AirPlay, Fast ECP |
TCL | 3-Series, 4-Series, 5-Series, 6-Series (QLED & Mini-LED) | 4K Dolby Vision, High Refresh, Game Mode |
AOC | 32S5195, 43S5195, 50U6295, 55U6295 | HD, Full HD, 4K UHD, DTS Studio Sound |
Philips | 50PUG7625, 55PUG7625, 43PFG6825 | 4K UHD, Ambilight Integration, HDR10+ |
Hisense | R6 Series, R7 Series, R8 Series, U6GR | 4K HDR, Dolby Vision IQ, Full Array Dimming |
Semp | R5500, R6500 | HD, Full HD Roku TV |
Others | JVC, Sharp, Hitachi, RCA, Insignia, Westinghouse Roku TVs | All models running official Roku OS |
2. Roku Streaming Players (HDMI)
Roku Express / Express 4K / 4K+ (Models 3930X, 3940X, 3941X)
Roku Streaming Stick / Streaming Stick 4K / 4K+ (Models 3810X, 3820X)
Roku Ultra / Ultra LT (Models 4800X, 4802X)
Roku Streambar / Streambar Pro (Models 9102X)
⚙️ Critical Prerequisite: TV Network Access Mode
Recent versions of Roku OS enforce a security restriction called Limited Mode by default, which blocks external volume, power, and channel switching.
To enable full control by Gemini, unlock Permissive mode on your TV (takes 10 seconds):
On your physical Roku remote, open Settings (
Configurações).Navigate to System (
Sistema) > Advanced system settings (Configurações avançadas do sistema).Select Control by mobile apps (
Controle por aplicativos móveis).Change Network access (
Acesso à rede) from Limited to Permissive (Permissivo).
🚀 Quickstart
1. Requirements
Python 3.10 or higher
uv (recommended) or standard
pipTailscale (for remote Gemini iPhone connectivity) or Cloudflare Tunnel
2. Installation
# Clone the repository
git clone https://github.com/romuloigor/roku-mcp.git
cd roku-mcp
# Install dependencies using uv
uv sync3. Configuration
Copy .env.example to .env and adjust the TV IP address if needed:
cp .env.example .envEdit .env:
ROKU_HOST=192.168.0.9 # Replace with your TV's local IP address
ROKU_PORT=8060
MCP_HOST=0.0.0.0
MCP_PORT=8000
MCP_TRANSPORT=sse4. Test Connectivity
just -f Justfile test
# or: uv run python tests/test_roku.py📱 Connecting to Google Gemini on iPhone
flowchart LR
A[Gemini App on iPhone / Voice] -->|Natural Language| B[Gemini Cloud]
B -->|HTTPS POST/SSE| C[Tailscale Funnel]
C -->|Port 8000| D[Local Host: roku-mcp-server]
D -->|HTTP ECP :8060| E[Roku TV 192.168.0.9]Step 1: Run the Server in Background (macOS / Linux / Windows)
On macOS, install the automated launchd background service:
just -f Justfile install-service(On Linux/systemd or Windows, simply run just -f Justfile serve or use your supervisor of choice).
Step 2: Expose Secure HTTPS via Tailscale Funnel
tailscale funnel 8000This generates your official public URL with an automated Let's Encrypt SSL certificate:
https://<your-machine-name>.<your-tailnet>.ts.net/sse
Step 3: Register in Gemini Connectors
In your browser (Mac, PC, or Safari on iPhone), go to gemini.google.com/customize/connectors.
Click + Custom (+ Personalizado).
In MCP Server URL, enter your public endpoint:
https://<your-machine-name>.<your-tailnet>.ts.net/sseClick Next (Avançar).
Scroll down the security disclaimer, check the consent box, and click Connect (Conectar).
Done! The connector will now synchronize instantly with the Gemini App on your iPhone.
🗣️ Voice Commands Reference
You can talk naturally to Google Gemini on iPhone (or Gemini Live):
Purpose | Voice Command (English) | Voice Command (Portuguese) | Voice Command (Spanish) |
Launch Apps | "Gemini, open YouTube on the living room TV" | "Gemini, abre o YouTube na TV da sala" | "Gemini, abre YouTube en la tele" |
Volume Control | "Lower the TV volume by 10 points" | "Abaixa o volume da TV em 10 pontos" | "Baja el volumen de la tele 10 puntos" |
Mute / Unmute | "Mute the television" | "Coloca a TV no mudo" | "Silencia la televisión" |
Power Control | "Turn off the television" | "Desliga a TV" | "Apaga la tele" |
Device Status | "What is playing on the TV right now?" | "O que está passando na TV agora?" | "¿Qué aplicación está abierta en la tele?" |
Text Typing | "Search for classical rock music on TV" | "Digita rock clássico na busca da TV" | "Escribe rock clásico en el buscador de la tele" |
Navigation | "Go back to the home screen" | "Volta para o início" | "Vuelve a la pantalla de inicio" |
🛠️ MCP Tools Reference
Tool Name | Description | Key Parameters |
| Retrieves TV power state, active app/channel, network, and hardware info | None |
| Controls TV power state |
|
| Launches an app by name or ID (YouTube, Netflix, Prime, Disney+, etc.) |
|
| Modifies TV audio volume or toggles mute |
|
| Simulates physical remote keypresses ( |
|
| Sequential character-by-character typing for text search inputs |
|
| Triggers native Roku universal content search |
|
| Lists installed channels and cached catalog | None |
🛡️ Security & Google CodeMender Audit
This project has been independently evaluated and verified using Google DeepMind's CodeMender automated security methodology.
Zero Router Port Forwarding: Relies exclusively on Tailscale WireGuard mesh encryption.
SSRF Protection: Strict destination binding to private subnet environment configurations.
Injection Defense: Allowlist key validation and RFC-compliant URL encoding.
Hardware Protection: Enforced safety thresholds on rapid volume/power sequences.
👉 Read the full audit: docs/SECURITY_AUDIT.md.
💻 Desktop Integration (Antigravity IDE / Claude Desktop)
For local desktop usage, add the server to your MCP configuration file (mcp_config.json):
{
"mcpServers": {
"roku-control": {
"command": "uv",
"args": [
"--directory",
"/path/to/roku-mcp",
"run",
"python",
"src/roku_mcp/server.py",
"--transport",
"stdio"
]
}
}
}🤝 Contributing
Contributions, issues, and feature requests are welcome! Feel free to check the issues page.
📄 License
Distributed under the MIT License. See LICENSE for more details.
Available Tools
8 toolsroku_adjust_volumeA
Ajusta o volume da TV Roku ou silencia o som.
Args:
action: 'up' (aumentar), 'down' (abaixar) ou 'mute' (mutar/desmutar).
steps: Quantidade de níveis para aumentar ou diminuir (padrão 1, máximo 20).
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | ||
| action | No | up |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does disclose useful behavior beyond the schema: 'mute' acts as a toggle (mutar/desmutar) and steps is capped at a maximum of 20. It omits failure modes or device-state requirements, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One-line purpose statement followed by a compact per-parameter block; every sentence adds information and the core action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Both parameters are documented despite zero schema coverage, and an output schema exists so return values needn't be explained. The only gap is device-state/permission prerequisites for a mutation-style control tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it enumerates the three valid action values (which the schema leaves as an unconstrained string with no enum) and gives the default and max for steps. It doesn't clarify whether steps is ignored when action is 'mute', leaving one small ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Ajusta o volume da TV Roku') plus the mute variant, which is concrete enough to distinguish it from siblings like roku_power or roku_remote_key. It does not explicitly say how it differs from the remote-key tool (which could also carry volume keys), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the semantics of 'up'/'down'/'mute'; there is no statement of when to prefer this over roku_remote_key or roku_get_status, and no preconditions such as the TV needing to be on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roku_get_statusA
Retorna o status atual da TV Roku: estado de energia (ligada/desligada), aplicativo ativo na tela e informações do dispositivo.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden: it does convey that this is a passive read (no mutation implied) and enumerates the returned fields, which is useful. But it omits operational context such as whether the TV must be powered/reachable, what happens if the device is offline, or any timeout/rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the outcome first and then the three payload components. No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not strictly required, and with no parameters or annotations there is little else to cover. The only unaddressed gap is failure/availability behavior when the Roku is off or unreachable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies — there is nothing for the description to disambiguate. No misleading parameter language is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Retorna') plus resource ('status atual da TV Roku') and an enumeration of the three data points returned (power state, active app, device info). It is clearly the read-only counterpart to the action siblings (roku_power, roku_launch_app, etc.), though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool to call when it needs current TV state before acting. There is no explicit 'use when / do not use when' guidance and no mention of an alternative (e.g. polling vs. event) for obtaining state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roku_launch_appB
Abre um aplicativo ou canal na TV Roku pelo nome ou ID.
Exemplos suportados: 'youtube', 'netflix', 'prime video', 'globoplay', 'disney+', 'max', 'spotify', 'apple tv', 'pluto tv', 'twitch', etc.
Args:
app_name: Nome do aplicativo (ex: 'youtube', 'netflix', 'globoplay') ou ID numérico do canal.
| Name | Required | Description | Default |
|---|---|---|---|
| app_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does not say whether the TV must be on/connected, what happens if the app name is unrecognized (error vs. silent failure), or what the call returns or how long it takes. It only conveys that an app is opened.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the Args block is clearly separated from the example list. The ten-item example list is a bit long for a single parameter, but each entry reinforces the accepted name format rather than being filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for an action tool with no annotations and no prerequisites or failure-mode description, the definition leaves the agent without key operational context (device state requirements, behavior on unknown app).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: app_name is documented as either a friendly name or a numeric channel ID, supported by ten concrete examples. It lacks format hints for the numeric ID (e.g., zero-padding) but adds clear meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Abre um aplicativo ou canal na TV Roku' — and clarifies the two accepted identifier forms (name or numeric channel ID). It is clearly distinguishable from siblings like roku_list_apps or roku_search, though it never explicitly names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: launch an app when you know its name or channel ID. There is no explicit guidance on what to do when the name is unknown (e.g., call roku_list_apps first) or when the device must be powered on, and no alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roku_list_appsB
Lista os aplicativos disponíveis, catálogo de canais conhecidos e informa o modo de controle da TV.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Lista' implies a read-only operation and the mention of reporting the TV control mode adds useful context beyond the name, but there is no disclosure of side effects, permissions, or whether the listing is cached/live.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, naming the three things it returns. It is efficient, though the combination of apps, channel catalog and control mode in one clause is slightly dense and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and with zero parameters the description only needs to state what is produced. It does that, though the lack of any routing hint toward roku_launch_app leaves a small gap for a tool embedded in a seven-sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the description has no parameter semantics to explain and the baseline of 4 applies. Nothing in the description misrepresents the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lista os aplicativos disponíveis') and adds two secondary outputs: the known channel catalog and the TV control mode. The purpose is clear, but it never distinguishes itself from siblings like roku_search or roku_launch_app, which plausibly touch the same app catalog.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus roku_search or roku_launch_app, nor any note that this is the natural precursor to launching an app. The usage is only inferable from the tool name, not stated in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roku_powerA
Liga ou desliga a Smart TV Roku.
Args:
action: Ação desejada ('on' para ligar, 'off' para desligar, 'toggle' para alternar o estado atual).
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | toggle |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose that 'toggle' acts on the current state ('alternar o estado atual'), which is useful behavioral context for a mutating tool. However, it does not say whether the call blocks, how long power transitions take, or whether the new state is reported (the output schema partially covers return values).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence states the purpose, followed by a compact Args block. There is no filler, and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter power tool with an output schema, this is nearly sufficient: the action values are fully explained, and return values are covered by the schema. Minor gaps are the absence of guidance on combining this with roku_get_status and the lack of notes on transition timing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema only contains a bare string 'action' with no enum. The description compensates by enumerating all three valid values ('on', 'off', 'toggle') and explaining what each does. It does not mention that 'toggle' is the default, which the schema does provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: turn the Roku Smart TV on or off. This is clearly distinguishable from siblings such as roku_get_status (a read) or roku_launch_app (an app operation). It lacks nothing essential, but it does not explicitly position itself against those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicit usage only: an agent can infer that this tool is for changing the power state. The description does not say when to prefer this over roku_get_status to check power first, or whether a state query is needed before using 'toggle'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roku_remote_keyA
Envia uma tecla do controle remoto para a TV Roku.
Teclas comuns:
- Navegação: 'home', 'back', 'voltar', 'ok', 'select', 'up', 'down', 'left', 'right'
- Mídia: 'play', 'pause', 'playpause', 'stop', 'rev', 'fwd'
- Volume: 'volumeup', 'volumedown', 'mute', 'mudo'
- TV & Entradas: 'hdmi1', 'hdmi2', 'hdmi3', 'antena', 'tuner', 'info', '*'
Args:
key: Nome da tecla a ser pressionada.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The key vocabulary effectively defines the accepted input domain (a behavioral contract the schema lacks), which is valuable, but nothing is said about case sensitivity, behavior for unlisted keys, error handling, or whether the call blocks until the TV responds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in one sentence, followed by a scannable grouped list. The list is long but earns its place given there is no enum in the schema; only the redundant Portuguese/English duplicates ('back'/'voltar', 'mute'/'mudo') feel slightly padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, the description supplies the main missing piece: the accepted key vocabulary. Remaining gaps (case sensitivity, unknown-key behavior, overlap with roku_adjust_volume) are minor but real.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'key' parameter has no enum, so the description's categorized list of accepted key values is the primary source of parameter semantics and adds substantial meaning beyond the bare string type. It is qualified as 'Teclas comuns', leaving the full accepted set unspecified, which keeps it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: sending a remote-control key to the Roku TV. The purpose is unambiguous, but the description never distinguishes this generic key-sender from overlapping siblings such as roku_adjust_volume (volumeup/volumedown/mute) or roku_power.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The categorized key list ('Navegação', 'Mídia', 'Volume', 'TV & Entradas') implies the use cases, so an agent can infer this is the general-purpose input tool. However, there is no explicit when-to-use or when-not-to-use guidance, and no direction on preferring roku_adjust_volume or roku_power for those specific actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roku_searchB
Abre a busca universal da Roku TV para procurar filmes, séries, atores ou canais.
Args:
query: Termo de pesquisa (ex: 'Stranger Things', 'Rock', 'Coldplay').
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It implies a UI state change (opening the universal search screen) but never clarifies whether the query is typed/submitted automatically or whether the caller must follow up with roku_type_text, and it says nothing about required device state or error behavior when search is unavailable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and free of filler. The Args block is slightly redundant in structure but earns its place given the 0% schema description coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for a state-changing interaction with a TV device and no annotations, the description leaves gaps: whether the search is auto-executed, whether the device must be on, and what happens if the query finds nothing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the "query" field is undocumented in structured data; the description compensates by defining it as a search term and giving three concrete examples. It does not specify format constraints, escaping, or whether multi-word phrases are supported differently.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Abre a busca universal da Roku TV") plus the domain of things searchable (filmes, séries, atores, canais), which is far more informative than the tool name alone. No sibling tool performs search, so confusion is unlikely, but the description never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intent (find content/actors/channels) is implied by the enumerated search targets, but there is no explicit guidance on when to prefer this over roku_launch_app or roku_type_text, nor any prerequisite such as the TV being powered on or the app context. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
roku_type_textA
Digita um texto na TV Roku caractere por caractere (ideal para preenchimento de campos de busca).
Args:
text: Texto a ser digitado na tela da TV.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that input is per-character, implying slowness and that an on-screen field must already be focused — but it never states that prerequisite, what happens if no field is focused, or whether existing text is appended or replaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in a single sentence. The Args block restates the schema but is short and standard; nothing is padded or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a one-parameter interaction tool the description covers what it does and roughly when, leaving only focus/prerequisite state to inference with no annotations to back it up.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only one required, self-evident string parameter, and the Args stanza confirms it is the text typed onto the TV screen. That is sufficient for a single trivial parameter, though it adds no constraints such as length or character-set limits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: types text on a Roku TV, character by character. The mechanism (simulated keystrokes) is a meaningful detail that separates it from simply issuing a search. It does not explicitly contrast with roku_search, though the 'filling search fields' note implies the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'ideal for preenchimento de campos de busca' gives implied usage context, but there is no explicit when-to-use/when-not guidance and no mention of the sibling roku_search, which is the obvious alternative for querying content. The agent must infer the split itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
roku_adjust_volume - First observed
roku_get_status - First observed
roku_launch_app - First observed
roku_list_apps - First observed
roku_power - First observed
roku_remote_key - First observed
roku_search - First observed
roku_type_text
TDQS
Scored across 8 tools
Most tools are clearly distinct by action and purpose: status, power, app launch, remote key, volume, text input, search, and app listing. There is minor overlap because roku_remote_key can send volume keys while roku_adjust_volume also handles volume/mute, but the descriptions make the intended use reasonably clear.
All tools use the same snake_case style and roku_ prefix, which is readable. However, the verb_noun convention is inconsistent: some tools use verbs (roku_get_status, roku_launch_app), while others use noun-like or ambiguous names (roku_power, roku_remote_key, roku_search).
Eight tools is well-scoped for a Roku TV control server. Each tool covers a distinct control area and there is no excessive tool sprawl.
The surface covers the core Roku control lifecycle: checking status, powering on/off, launching apps, sending remote keys, adjusting volume, typing text, searching, and listing apps. Minor gaps exist around explicit input/source selection and device discovery, but these are largely workable through remote keys and status.
Maintenance
Related MCP Connectors
Control Android TV from any AI. 38 MCP tools: playback, recap, recommend, smart-home, schedules.
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
- mytesla.ioOAuthio.mytesla
Control your Tesla from your AI assistant - climate, charging, access, and security.
Related MCP Servers
- FlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to control TVs on a local network through natural language commands. It currently supports Roku devices, allowing users to launch apps, manage playback, and navigate menus.51-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to inspect and control Roku devices—query UI elements, send remote input, launch channels, and run tests—using the Model Context Protocol or a CLI.18 npm6MIT
- FlicenseAqualityDmaintenanceEnables AI assistants to control Roku TVs on the local network via natural language commands.6-
- AlicenseAqualityCmaintenanceMCP server for controlling Google TV devices via natural language. Enables key presses, text input, and app launching on paired devices.51MIT