tv-mcp
The tv-mcp server enables AI agents to build, deploy, and debug web applications on physical Samsung Tizen and LG webOS smart TVs. It orchestrates vendor toolchains and leverages the Chrome DevTools Protocol.
Capabilities are unlocked in tiers:
Always available (Tier 0): list discovered/configured TVs, connect to a device by name/host/platform, and retrieve in-depth documentation (device setup, Tizen signing, webOS developer mode, packaging, remote key pairing).
After connecting (Tier 1): build & sign apps, install, launch, stop, and uninstall apps, retrieve device logs, and inject remote control key presses.
After launching in debug mode: take screenshots, read JavaScript console logs, and evaluate JavaScript directly in the running app’s webview.
Provides tools for building, installing, and debugging Samsung Tizen smart TV web apps, including packaging, signing, deployment, screenshots, console logs, JS evaluation, and remote control.
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., "@tv-mcpBuild the app, install it on the webOS TV, and open the JS console"
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.
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/sdbandares-*CLIs), anda 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 |
|
1 | device connected |
|
2 | debug launch |
|
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 ( | Node ≥ 20 · webOS TV CLI: |
On the TV, once | Developer mode: Apps → type | 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 ( | 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 projectClaude Code:
claude mcp add tv -- node /path/to/tv-mcp/dist/index.js --config /path/to/devices.yamlThen, 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
Available Tools
3 toolsconnect_deviceConnect TVB
Connect to a TV by configured name or by host+platform. Unlocks app lifecycle tools.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | TV IP address (when not configured) | |
| name | No | Configured device name from devices.yaml | |
| platform | No | Required with host |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | One of: device-setup, tizen-signing, webos-dev-mode, webos-packaging, remote-key-pairing |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v0.2.3- First observed
connect_device - First observed
docs - First observed
list_devices
TDQS
Scored across 3 tools
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.
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.
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.
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
Related MCP Connectors
Deploy and manage your apps, databases, storage, and scheduled jobs from your AI agent
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Build and deploy websites, Telegram and Discord bots from chat via the DreamAgent platform.
Build, validate, and deploy multi-agent AI solutions from any AI environment.
Related MCP Servers
- AlicenseAqualityFmaintenanceUnleashes 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.21,240Apache 2.0
- AlicenseAqualityAmaintenanceEnables AI assistants to build, test, and debug Tauri v2 applications with UI automation, IPC monitoring, mobile device management, and real-time access to screenshots, DOM state, and console logs.20301MIT
- FlicenseNot gradedqualityDmaintenanceEnables 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-
- AlicenseNot gradedqualityBmaintenanceTurns 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.1MIT