Skip to main content
Glama

tv-mcp

Build, deploy, and debug Smart TV web apps from any AI agent.

tv-mcp is a Model Context Protocol server that gives MCP clients (Claude Code, Cursor, VS Code, ...) hands-on access to real Samsung Tizen and LG webOS televisions: package and sign apps, install them on test TVs, take screenshots, read the JS console, evaluate code in the running app, and press remote-control keys.

The goal: an agent loop of edit code → build → install → screenshot → read console → fix that runs hands-free on physical TVs.

Who this is for

Smart TV development has the worst inner loop in web development: two vendor SDKs, certificate ceremonies, dev-mode timers, and a screen on the other side of the room. This hits hardest in hospitality and B2B TV — hotel IPTV, cruise ships, hospitals, digital signage, sports bars — where teams ship one web app to fleets of mixed Samsung/LG panels.

If that's you, this project is for you.

Related MCP server: MCP Server Tauri

How it works

Your TV app is a web app in a native wrapper (.wgt / .ipk). Both platforms expose the webview's Chrome DevTools Protocol remote inspector. So tv-mcp splits into:

  • a platform plane per vendor (build/sign/install/launch via tizen/sdb and ares-* CLIs), and

  • a shared CDP plane (screenshot, console, JS eval) that works identically on both — because underneath it's just Chromium.

MCP client ── stdio ── tv-mcp
                         ├── TizenDriver  → tizen / sdb        → Samsung TV
                         ├── WebOSDriver  → ares-*             → LG TV
                         └── CdpBridge    → DevTools Protocol  → the app's webview (both)

Progressive disclosure

A fresh session exposes only 3 tools (list_devices, connect_device, docs). Connecting a device unlocks the app-lifecycle tier; launching with debug: true unlocks the inspector tier (screenshot, console_logs, eval_js). Deep platform knowledge (Tizen signing/DUIDs, webOS dev-mode expiry, pairing flows) ships as MCP resources fetched on demand — your agent's context stays small until it actually needs the detail.

Tier

Unlocked by

Tools

0

always

list_devices, connect_device, docs, doctor

1

device connected

build_app, install_app, launch_app, stop_app, uninstall_app, device_logs, remote_key

2

debug launch

screenshot, console_logs, eval_js

Prerequisites

tv-mcp orchestrates the vendor toolchains — it does not replace them. You need:

Samsung (Tizen)

LG (webOS)

On this machine

Node ≥ 20 · Tizen Studio CLI (tizen, sdb on PATH)

Node ≥ 20 · webOS TV CLI: npm i -g @webos-tools/cli (ares-* on PATH)

On the TV, once

Developer mode: Apps → type 1 2 3 4 5 → ON → set Host PC IP to this machine's address on the TV's subnet → reboot the TV

Developer Mode app from LG Content Store (needs an LG developer account) → Dev Mode ON → note the on-screen passphrase

Signing

Certificate profile in Tizen Studio's certificate manager. Real TVs reject the generic Tizen distributor cert — you need a Samsung-issued cert that includes the TV's DUID (sdb shell 0 getduid)

none (dev installs ride the Dev Mode session)

Network

TV and this machine on the same subnet; port 26101 open only while dev mode is armed

same subnet; SSH on 9922 via the Dev Mode app; sessions expire after ~50h

Common trap (learned on real hardware): a multi-homed machine has several IPs — the Host PC IP on the TV must be the one on the TV's subnet, or the TV silently drops every connection. docs topic device-setup has the full checklist; the server's errors point there when connect/install fails.

Not sure your setup is right? Ask the agent to run doctor — one pass over toolchains, signing profiles (it distinguishes Samsung-issued certs from the generic SDK cert that real TVs reject), and TV reachability, with a remedy for every failing item.

Quick start

npm install
npm run build
cp devices.example.yaml devices.yaml   # edit for your TVs and project

Claude Code:

claude mcp add tv -- node /path/to/tv-mcp/dist/index.js --config /path/to/devices.yaml

Then, in a session:

connect to lab-samsung-q80, build the xtv project for tizen, install and launch it in debug mode, and screenshot it

Status

Early. Honest capability matrix:

Capability

Tizen

webOS

discover / connect

package (+sign)

install / launch / stop

debug attach (CDP)

screenshot / console / eval

remote key injection

✅ (one-time on-screen pairing)

✅ (one-time on-screen pairing)

dev-mode auto-renew

n/a

🚧 planned

emulator / simulator targets

🚧

🚧

commercial panels (Pro:Centric, SSSP)

🚧

🚧

Roadmap

  • v0.2 — ✅ remote-key pairing (Samsung remote WS API, LG SSAP)

  • v0.2.x — webOS dev-mode auto-renew

  • v0.3 — Android TV driver (#1): adb platform plane + the same CDP debug plane (Android TV webapps are Chromium WebViews too)

  • v0.3 — Tizen emulator + webOS simulator targets, CI-friendly headless mode

  • v0.4 — streamable-HTTP transport + device locking: one shared TV lab, whole team's agents

  • v1.0 — commercial hospitality panels (LG Pro:Centric / webOS Signage, Samsung SSSP / HTV)

Sponsoring

Commercial-panel support (Pro:Centric, SSSP) needs hardware and vendor-portal access that individual maintainers don't have. If your company ships hospitality TV apps and wants this to exist, sponsorship or hardware loans move the roadmap directly — see FUNDING or open a discussion.

Contributing

PRs welcome — see CONTRIBUTING.md. The TVDriver interface in src/types.ts is the extension point; a Vizio/Roku/Android TV driver would slot right in.

License

MIT

Available Tools

3 tools
connect_deviceConnect TVB

Connect to a TV by configured name or by host+platform. Unlocks app lifecycle tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoTV IP address (when not configured)
nameNoConfigured device name from devices.yaml
platformNoRequired with host

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 full burden. It discloses the 'Unlocks app lifecycle tools' behavioral trait, which is useful state-changing context, but doesn't describe connection limitations, timeout behavior, platform requirements beyond schema, or any failure modes. For a connection tool with no annotation coverage, this is adequate but not rich.

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?

Two crisp sentences—one stating the action and identification modes, one stating the unlock side effect. Zero fluff, but 'Unlocks app lifecycle tools' is somewhat vague jargon that could benefit from elaboration, and the connection logic is packed into a single sentence.

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?

No annotations and no output schema, so the description must carry the behavioral burden. It covers the invocation modes and a key side effect, but doesn't mention what a successful connection returns, what errors look like (host unreachable, unknown name), or whether the tool is idempotent. Adequate but with notable gaps for a connection tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters (host, name, platform) are documented in the schema itself. The description adds the relational constraint that platform is 'Required with host' (which the schema enum hint also implies) and that name comes from devices.yaml. It adds slight value by connecting parameters to the two invocation modes, but largely leans on the 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?

Clear verb+resource ('Connect to a TV') with explicit modes of identification (configured name or host+platform). It also notes a side effect ('Unlocks app lifecycle tools'), which adds purpose context, though it doesn't explicitly distinguish itself from siblings like list_devices.

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 description states the two identification modes (name or host+platform) which implicitly tells the agent how to invoke it, and the sibling list_devices suggests a workflow. However, there's no explicit guidance about when to choose name vs host+platform, or when NOT to use this tool. The 'Unlocks app lifecycle tools' hint implies it's a prerequisite step but doesn't spell out a decision rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

docsPlatform docsA

Deep docs for platform pain points (signing, dev mode, packaging, pairing). Call without a topic to list topics.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoOne of: device-setup, tizen-signing, webos-dev-mode, webos-packaging, remote-key-pairing

TDQS

A3.8/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 burden. The description does disclose that calling without a topic lists topics, which is a behavioral trait not derivable from the schema. However, it doesn't disclose the return format, whether content is paginated, or the depth/format of the documentation returned. For a read-only docs tool this is acceptable but could be richer.

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?

Two sentences, zero waste. The first sentence establishes purpose and topic domains; the second sentence gives the key usage behavior for the optional parameter. Every word earns its place and the most important operational detail (call without topic to list) is front-loaded into the second sentence.

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?

Given a simple single-optional-parameter tool with 100% schema coverage and no output schema, the description is fairly complete. It identifies the pain-point domains and the zero-argument behavior. A minor gap: it doesn't specify what the documentation content looks like when called with a topic, but the schema enumerates topics clearly. For the complexity level, this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the topic parameter is fully documented in the schema with its allowed enum values. The description adds the behavioral detail that omitting the topic lists available topics, which complements the schema. Since the schema does the heavy lifting on parameter meaning, baseline 3 is appropriate.

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 clearly states this is a docs tool for platform pain points (signing, dev mode, packaging, pairing) and distinguishes its purpose by noting it covers deep documentation topics. However, it doesn't explicitly differentiate from sibling tools list_devices and connect_device, though the context makes it fairly obvious docs is informational. The verb 'deep docs' and specific pain points give a clear, specific purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call without a topic to list topics,' which is a clear usage guideline for the zero-parameter case. It gives some guidance that topics map to specific pain points (signing, dev mode, packaging, pairing), though it doesn't explicitly state when NOT to use this tool versus alternatives like connect_device. The sibling tools are operational (list/connect), so context implies docs is for reference, but that contrast is not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_devicesList TVsA

List configured and live-discovered Samsung (Tizen) / LG (webOS) TVs with reachability.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It notes the tool handles both configured and live-discovered TVs, and includes reachability info, which adds some behavioral context. However, it doesn't disclose whether this performs network discovery, how long it may take, whether it requires prior configuration, or what 'reachability' entails (does it ping each TV?). The lack of annotations makes these gaps more significant.

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 sentence that fully captures the tool's purpose with zero wasted words. It front-loads the key information (what is listed) and adds the technical brand/platform detail (Samsung Tizen / LG webOS) plus the meaningful differentiator (reachability) that helps an agent understand the result set. Highly efficient.

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 zero-parameter, no-output-schema listing tool, the description is reasonably complete. It identifies the device brands/platforms and what the listing includes (reachability, configured and live-discovered). Minor gaps exist around what fields the returned list contains and whether discovery is active, but given the tool's simplicity, the description covers the essential context an agent needs.

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 has zero parameters, so there is nothing for the description to explain about arguments. By the rubric, 0 params earns a baseline of 4. The description appropriately needs no parameter elaboration since the schema is empty and coverage is 100%.

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 uses a specific verb ('List') plus a clear resource ('configured and live-discovered Samsung (Tizen) / LG (webOS) TVs with reachability'). It clearly communicates what is returned. It distinguishes itself from the sibling connect_device (which would be connection-oriented) by focusing on listing existing devices rather than establishing connections.

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 description implies this is used to enumerate TVs before connecting to one, but doesn't explicitly state when to use it vs connect_device or when not to use it. No explicit alternative is named or usage context (e.g., 'call this before connect_device') is given. The purpose is clear enough that usage is largely implied rather than stated.

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. 3 tool updatesv0.2.3
    • First observedconnect_device
    • First observeddocs
    • First observedlist_devices

TDQS

B3.3/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: discover devices, connect to a device, and access documentation. There is no overlap or ambiguity between these three tools.

Naming Consistency3/5

list_devices and connect_device follow a verb_noun pattern, but docs breaks the pattern by using a noun alone without a verb prefix like get_docs or list_topics.

Tool Count2/5

With only 3 tools and all descriptions mentioning that connecting 'unlocks app lifecycle tools', the server appears to gate functionality behind an initial connection step rather than exposing it directly. The set feels thin for a TV control server that presumably supports app lifecycle, pairing, and packaging operations that are only referenced in the docs tool.

Completeness1/5

The tool surface only covers discovery, connection, and documentation. Descriptions reference 'app lifecycle tools', 'pairing', 'dev mode', and 'packaging' as capabilities, but no tools exist to actually perform these operations—only docs describing them. This is a severely incomplete surface for the implied domain.

Maintenance

ActivitySlowing
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Unleashes LLM-powered agents to autonomously execute and debug web apps directly in your code editor, with features like webapp navigation, network traffic capture, and console error collection.
    2
    1,240
    Apache 2.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to develop, test, and certify Roku applications by providing direct control over device functions like app deployment, remote input, and SceneGraph inspection. It supports automated workflows including real-time log collection, media monitoring, and certification verification.
    1
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Turns AI assistants like Claude and ChatGPT into a remote control for LG webOS smart TVs, enabling power control, volume, app launching, input switching, and more, all locally without cloud APIs.
    1
    MIT