Skip to main content
Glama

📺 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.

Python 3.10+ Model Context Protocol Google Gemini Roku OS Security Audit License: MIT

🌐 Languages: English | Português (Brasil) | Español

Roku MCP Server Banner


🌟 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 async httpx for 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).

Supported Roku Smart TVs and Streaming Players

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):

  1. On your physical Roku remote, open Settings (Configurações).

  2. Navigate to System (Sistema) > Advanced system settings (Configurações avançadas do sistema).

  3. Select Control by mobile apps (Controle por aplicativos móveis).

  4. Change Network access (Acesso à rede) from Limited to Permissive (Permissivo).


🚀 Quickstart

1. Requirements

  • Python 3.10 or higher

  • uv (recommended) or standard pip

  • Tailscale (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 sync

3. Configuration

Copy .env.example to .env and adjust the TV IP address if needed:

cp .env.example .env

Edit .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=sse

4. 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 8000

This 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

  1. In your browser (Mac, PC, or Safari on iPhone), go to gemini.google.com/customize/connectors.

  2. Click + Custom (+ Personalizado).

  3. In MCP Server URL, enter your public endpoint:

    https://<your-machine-name>.<your-tailnet>.ts.net/sse
  4. Click Next (Avançar).

  5. 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

roku_get_status

Retrieves TV power state, active app/channel, network, and hardware info

None

roku_power

Controls TV power state

action: "on", "off", or "toggle"

roku_launch_app

Launches an app by name or ID (YouTube, Netflix, Prime, Disney+, etc.)

app_name: string

roku_adjust_volume

Modifies TV audio volume or toggles mute

action: "up", "down", "mute"; steps: 1–20

roku_remote_key

Simulates physical remote keypresses (home, ok, back, play, etc.)

key: string

roku_type_text

Sequential character-by-character typing for text search inputs

text: string

roku_search

Triggers native Roku universal content search

query: string

roku_list_apps

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 tools
roku_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).
NameRequiredDescriptionDefault
stepsNo
actionNoup

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.
NameRequiredDescriptionDefault
app_nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).
NameRequiredDescriptionDefault
actionNotoggle

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.
NameRequiredDescriptionDefault
keyYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_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.
NameRequiredDescriptionDefault
textYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 8 tool updatesv0.1.0
    • First observedroku_adjust_volume
    • First observedroku_get_status
    • First observedroku_launch_app
    • First observedroku_list_apps
    • First observedroku_power
    • First observedroku_remote_key
    • First observedroku_search
    • First observedroku_type_text

TDQS

A3.6/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency3/5

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).

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers