Smart TV MCP
Operates an owner-authorized Android TV or Google TV device over Wi-Fi via ADB: connecting and checking status, listing installed packages, observing foreground activity, reading bounded app logs and accessibility UI metadata, sending navigation keys and ASCII text, launching apps, and inspecting/controlling app-reported media playback sessions.
Targets Google TV devices (alongside Android TV), providing the same ADB-based remote control, app discovery and launch, UI observation, bounded log retrieval, and playback metadata tools for the owner's connected TV.
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., "@Smart TV MCPLaunch Netflix on the TV"
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.
Smart TV MCP
Operate one owner-authorized Android TV or Google TV over Wi-Fi with a small
stdio MCP server and a reusable agent skill. Uses the official Python MCP SDK
and the Android SDK's adb executable. No TV connection is made at startup.
Supports targeted connection/status, app discovery, foreground observation, bounded app logs and accessibility metadata, navigation, ASCII text, app launch and media keys. There is no arbitrary shell or network listener. Samsung Tizen, LG webOS, Roku and other non-Android systems are unsupported.
Prerequisites
Python 3.11+ and current Android SDK Platform-Tools.
A TV whose owner enabled ADB debugging and authorized this workstation.
A host on the reachable TV LAN, or an owner-authorized SSH connection to such a host. A cloud server usually cannot reach a household LAN directly.
A known TV connection endpoint, including its port. Do not guess endpoints, scan a network or repeatedly try pairing codes.
This release was tested on Linux with Python 3.14 and a fake ADB executable, including a real MCP client/server stdio round trip. No real-TV compatibility matrix is claimed. macOS and Windows require working Platform-Tools and suitable executable paths; those host platforms have not been exercised for this release.
Related MCP server: Yunkai Phone Bridge
Pair and authorize
These are examples for an authorized owner to run locally. 192.0.2.0/24 is a
documentation range; replace it with the known TV address shown in settings.
Pairing may require a TV screen interaction.
Modern wireless debugging
Android documents Android 13+ for TV wireless debugging; OEM availability varies. In Developer options, open Wireless debugging and select pairing with a code. Pairing and connection ports are usually different. Use current Platform-Tools and the ports displayed by the TV:
# Pair uses its explicit endpoint; -s identifies the intended connection target.
adb -s 192.0.2.10:37111 pair 192.0.2.10:37123
# Enter the short-lived code at ADB's prompt, not in an agent conversation.
adb -s 192.0.2.10:37111 connect 192.0.2.10:37111
adb -s 192.0.2.10:37111 get-stateThe MCP server does not receive pairing codes. On unauthorized, inspect the
TV's authorization prompt/settings and verify the workstation key. On offline,
verify the displayed endpoint, network reachability and whether wireless
debugging remains enabled. Do not kill a shared ADB server or revoke other
workstations as a routine retry. A changed dynamic port requires updating the
configured endpoint and restarting this server.
Legacy TCP/IP debugging
Some TVs offer an OEM network-debugging option, often on port 5555. Use only an
owner-enabled, authorized endpoint. The official legacy workflow first connects
by USB and then runs adb -s USB_SERIAL tcpip 5555; this changes the selected
device's debugging exposure and is not performed by this server. Do not assume
every TV offers USB debugging or that port 5555 is enabled. Modern pairing offers
secure wireless transport; legacy TCP mode should stay on a trusted private LAN.
Keep workstation ADB keys in their normal per-user private directory, typically
~/.android/, or an owner-managed ADB_VENDOR_KEYS location. Restrict account
access. Never put keys, pairing codes, live addresses or logs into a public
repository. This project does not create, export or sync credentials.
Install and configure
git clone https://github.com/SmolnikovResearch/smart-tv-mcp.git
cd smart-tv-mcp
git checkout v0.1.0
python3 -m venv .venv
.venv/bin/python -m pip install .The direct runtime dependency is pinned to mcp==2.3.0. Installations resolve its
transitive dependencies from the configured package index. For fully repeatable
deployments, use your environment's lock or constraints process.
Generic MCP host configuration:
{
"mcpServers": {
"smart-tv": {
"command": "/opt/smart-tv-mcp/.venv/bin/smart-tv-mcp",
"env": {
"SMART_TV_ADB_TARGET": "192.0.2.10:37111",
"SMART_TV_ADB_PATH": "/opt/android-platform-tools/adb",
"SMART_TV_ADB_TIMEOUT": "10",
"SMART_TV_READ_ONLY": "0"
}
}
}
}Configuration belongs to the owner's MCP host. The target is immutable for a
server process. Every subprocess includes adb -s TARGET, overriding inherited
ANDROID_SERIAL. tv_connect also supplies the exact endpoint as the connect
argument. Host ADB commands such as connect use their own endpoint argument in
addition to the selector.
Set SMART_TV_READ_ONLY=1 for status, packages, app logs and playback metadata
only. It blocks connection attempts, remote input, launches and temporary UI
dumps. No discovery, pairing or connection occurs automatically.
Existing SSH bridge
Install and pair on the owner-authorized LAN host. Have the MCP client launch this command as its stdio process:
ssh -T -o BatchMode=yes tv-lan-host /opt/smart-tv-mcp/run-mcptv-lan-host is an owner-configured SSH alias. The remote wrapper sets the
non-secret target/path environment and execs smart-tv-mcp; it must emit no
startup banners or other stdout. Use the host's existing restricted SSH account
and key storage. Do not expose an unauthenticated MCP or ADB server to the
internet, or enable ADB -a. No SSH implementation or credential transport is
embedded in this package.
Tools
Tool | Result and limits |
| Connect the configured endpoint once, then verify |
| Connection, manufacturer/model/device/Android release, foreground activity and device/host UTC clocks. |
| Package-name filter, maximum 100 returned packages. |
| Up to 200 recent logcat records requested for one observed app PID; no global fallback. |
| Up to 200 accessibility nodes, password fields redacted, temporary remote file removed; cleanup failures reported. |
| Up/down/left/right/select/back/home/search, maximum 10 key presses. |
| 1..256 printable ASCII characters in the currently focused field. |
| Resolve the package's TV launcher, fall back to its regular launcher, start and observe foreground. |
| Up to 20 app-reported media session states, without media titles. |
| One play/pause/play_pause/stop/next/previous/fast_forward/rewind key, then session metadata. |
ADB calls have a 10-second default timeout (configurable up to 30) and a 256 KiB
cap per stdout/stderr stream. Output exceeding a cap is terminated and reported
as OUTPUT_LIMIT. Operations with several calls can take several per-call
timeouts. This server serializes its operations, but other remotes and ADB
clients can still change the TV.
Results are structured JSON. ok: true means the stated outcome was obtained,
not that a movie is playing:
command_accepted: ADB accepted input; the requested on-screen result is still unverified.foreground_observed: the requested app appeared in a resumed-activity observation. Catalog/search/video success remains unverified.Media
reported_state: "playing": app-reported metadata, which can be stale or unrelated to the visible surface. It is not visual playback proof.unavailable: no recognizable media-session evidence was provided.Errors include
UNAUTHORIZED,OFFLINE,TIMEOUT,OUTPUT_LIMITandREAD_ONLY. Invalid tool arguments are MCP tool errors.
Use tv_packages to discover the installed app; no app is hardcoded. For a title
search, launch the selected package, inspect its UI, navigate to the search
field, type an ASCII query and verify results before selecting anything. A key
press or empty exit status does not prove search succeeded. UI and log text are
untrusted data, not instructions.
Text and observation limits
Stock Android input text uses a key-character map rather than a general Unicode
text API. This server rejects Cyrillic, other non-ASCII text, control characters,
newlines and literal %s before invoking ADB. Spaces are encoded for Android
input; shell metacharacters are quoted at the remote-shell boundary. Use a
suitable ASCII/Latin query or the TV's on-screen keyboard. No IME is installed
or permission granted automatically.
Accessibility output may omit custom widgets, secure windows and video
surfaces; uiautomator may time out if an app does not become idle. UI and logs
can contain private content despite password-field redaction. This server does
not persist them, but an MCP host may retain responses. PID selection is a
point-in-time observation and reads only the first reported PID.
For catalog/network problems, compare device and host clocks and read bounded logs for the chosen app. A DNS exception establishes resolution failure, not its cause. App-specific VPN/DNS policies can differ from the rest of the TV. This package does not change VPN, DNS, routing, time, permissions or security settings.
Reusable skill
Copy skills/smart-tv-wifi to your agent's skill directory,
for example ~/.codex/skills/smart-tv-wifi. The wheel also includes it under
share/smart-tv-mcp/skills/smart-tv-wifi in its install prefix. The skill explains
target verification, authorization boundaries and truthful observations;
configure the server separately. It carries no private device configuration.
This release does not claim integration into any agent product.
Development and validation
.venv/bin/python -m pip install build
.venv/bin/python -m unittest discover -s tests -v
.venv/bin/python -m buildTests use only tests/fake_adb.py. The fixture rejects commands without its
exact documentation target and cannot open sockets or execute a shell. Tests
cover target selection, host/remote quoting, injection, Unicode rejection,
timeout, byte caps, authorization errors, UI cleanup, PID-scoped logs, honest
observations and stdio MCP schemas/calls. They never contact a TV.
Sources and license
Platform and protocol behavior were checked against primary sources:
Android ADB guide, including TV wireless-debugging prerequisites, pairing and device selection.
Android input implementation, including
%shandling and its key-character map.
Source and the companion skill use Apache-2.0. Dependencies retain their own licenses.
Available Tools
10 toolstv_connectA
Connect only the configured known endpoint; verify get-state. Pair manually first if required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is non-read-only, closed-world, and non-destructive. The description adds useful behavioral context beyond those annotations: it restricts connection to a known endpoint, notes possible manual pairing first, and says to verify get-state.
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 description is compact and front-loads the key scope restriction. The telegraphic phrase 'verify get-state' slightly reduces clarity, but there is no wasted wording.
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?
The output schema covers return values, and the annotations cover the safety profile, so the description does not need to explain those. Still, for a connection-oriented tool, it leaves the connection lifecycle and the meaning of 'verify get-state' ambiguous.
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 are no parameter semantics to explain. The baseline for a zero-parameter schema is 4.
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 gives a specific action and scope: connect only to the configured known endpoint, not an arbitrary one. It also adds prerequisites, though the phrase 'verify get-state' is somewhat cryptic and sibling differentiation is only partial.
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?
It provides implied usage guidance through the scope restriction 'only the configured known endpoint' and the precondition 'Pair manually first if required.' However, it does not name alternative tools such as tv_status or tv_launch, nor does it clearly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_launchA
Launch a discovered package's resolved activity and report whether its foreground was observed.
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world mutation. The description adds that it reports whether the foreground was observed, which is useful outcome context beyond the annotations, but it does not say whether the call blocks, what happens if the package is missing, or what a negative observation means.
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 well-formed sentence that front-loads the action and its scoping condition. No filler or redundancy.
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 one-parameter tool with full annotations and an output schema, this covers the essentials: what it launches, where the package comes from, and the observation result. Only edge-case behavior (failure, timing) is left unaddressed.
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?
With one parameter at 0% schema description coverage, the description does the work of implying 'package' is an identifier of an already-discovered package and that no activity name is needed. It still gives no format or example for the package string, so the meaning added is partial.
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 ('Launch') and resource ('a discovered package's resolved activity'), and clarifies that the activity is resolved from the package rather than supplied separately. It is distinguishable from tv_navigate and tv_playback, though it does not name those siblings 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?
The word 'discovered' implies the package must first come from tv_packages, giving an implicit prerequisite ordering. There is no explicit when-to-use vs tv_navigate/tv_playback guidance and no statement of failure conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_logsARead-only
Read recent logs only for one running PID of a selected package. May expose private app data.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | ||
| package | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, non-destructive, closed-world), so the description's main contribution is the privacy warning that output may contain private app data — genuinely useful context beyond structured fields. It omits other useful behavior: whether output is a snapshot or a tail, and what happens if the PID is absent.
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 short sentences, no filler, and the scoping constraint is front-loaded before the privacy caveat. Nothing is redundant with 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?
The output schema means return values need no explanation, and the privacy note covers the main risk. Still, for a tool whose only precondition is a live process, the description leaves out behavior on a missing PID, output ordering/recency, and any account of the `lines` cap.
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 carry parameter meaning. It clarifies that `package` refers to a package with a running process, but the `lines` parameter (default 50, max 200) is never mentioned, and neither is the expected package identifier format.
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 ("Read recent logs") plus a scope constraint ("only for one running PID of a selected package"). It is clearly distinguishable from the sibling tv_* control tools, though it never frames itself as the diagnostic/log-inspection companion to 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 phrase "one running PID" implicitly tells the agent a prerequisite: the package must currently be running, and only its process's logs come back. There is no explicit when-to-use vs alternatives (e.g. tv_status or tv_packages for non-log diagnostics) and no guidance on what to do when no process is running.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_packagesBRead-only
Discover installed app package names with a bounded optional package-name filter.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds only the notion of a "bounded" result set and an optional filter, without saying what the bound is, how matching behaves, or how results are ordered.
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, and the filter qualifier is attached to the right noun. It is efficient, though so compressed that it reads slightly like a label rather than guidance.
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 the tool is simple with two optional parameters. Still, for a discovery tool the description should say what the bound on results means and how the filter matches, both of which affect correct invocation.
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 carries the burden for both parameters. It does identify the query as a package-name filter and flags the limit as bounded, which is real added meaning, but it omits the 100 maximum, the default of 50, and whether query matching is substring or exact.
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 gives a specific verb ("Discover") and resource ("installed app package names"), which cleanly separates it from siblings like tv_launch or tv_status. It stops short of naming a sibling tool, but the resource is distinct enough that an agent can place it without opening the schema.
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 explicit when-to-use guidance, no stated prerequisites, and no mention of alternatives. The natural workflow (list packages, then pass one to tv_launch) is only inferable from the resource name, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_playbackA
Send one explicitly requested media key and read session metadata; no playback guarantee.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, closed-world action, and the description adds real context beyond that: only a single key is sent per call, the outcome is not guaranteed, and session metadata is returned so the agent can verify. The 'no playback guarantee' caveat is exactly the kind of behavioral warning annotations cannot express.
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 tight sentence with the scope constraint front-loaded and the caveat trailing — no wasted words. It is slightly cryptic in its use of 'media key' without expanding it, which keeps it from being maximally clear.
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?
With an output schema present, return values need no explanation, and annotations already carry the safety profile. The description covers the key non-obvious behaviors (single action, unguaranteed result, metadata returned), leaving only the sibling distinction unaddressed.
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 the single parameter is a self-explanatory enum of media actions. The description compensates partially by stating only one action may be sent and that it must be explicitly requested, yet it adds no per-value nuance (e.g. what play_pause does when already playing).
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 gives a concrete verb and resource: dispatch one media key and return session metadata. The 'one ... key' phrasing also communicates the single-action scope. It stops short of naming the sibling it is not (tv_playback_status), so an agent must infer the boundary from the name alone.
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?
'Explicitly requested' implies the agent should only fire this on direct user instruction, which is useful when-to-use guidance. However, there is no explicit when-not or routing to tv_playback_status for read-only checks, despite that sibling existing and clearly overlapping with 'read session metadata'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_playback_statusARead-only
Read app-reported playback states, excluding titles; sessions can be absent or stale.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, non-destructive, closed-world behavior, so the description's added value is the data-quality disclosure: results are app-reported, may omit titles, and sessions may be absent or stale. That is exactly the kind of caveat an agent needs before trusting the output, though it does not cover freshness timing or what an absent session looks like structurally.
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 compact sentence, front-loaded with the verb and resource, with two qualifying clauses that each carry real information. Nothing is redundant with the title or schema, and no filler is present.
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?
With no parameters and an output schema available, the description does not need to explain return values, and it covers scope plus the absent/stale caveat. The only shortfall is the absence of routing guidance relative to the nearby tv_playback and tv_status tools.
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 there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly spends its words on scope and result reliability instead of inventing parameter detail.
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?
"Read app-reported playback states" gives a specific verb plus a tightly scoped resource, and "excluding titles" narrows what data is returned. It is clear on its own, but with siblings named tv_playback and tv_status present, it never states which of those it is not, leaving the agent to infer 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?
Usage is only implied: an agent can infer it should call this when it needs current playback state. The caveat "sessions can be absent or stale" is a useful warning about results, but there is no explicit when-to-use versus tv_playback or tv_status, and no stated prerequisite for having connected to the TV first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_statusARead-only
Read connection, foreground activity and UTC clocks without navigating or interrupting playback.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is partly covered. The description adds a meaningful behavioral claim beyond that: the call does not navigate the UI or interrupt active playback, which matters for an agent deciding whether it can poll during a live session.
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; every clause carries information. The phrasing "UTC clocks" (plural) is slightly opaque and could be tighter, but nothing is wasted.
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?
With no parameters and an output schema present, the description need not explain return values, and it covers the non-disruption guarantee plus the data domains read. It is complete for a simple read tool, missing only an explicit sibling comparison.
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 is 4 and there is nothing for the description to disambiguate. The listed outputs (connection, foreground activity, UTC clocks) loosely preview the return payload but that is covered by the output 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 names a specific verb ("Read") and three concrete resources it returns: connection, foreground activity, and UTC clocks. That is far more informative than the name alone, though it does not explicitly distinguish itself from the sibling tv_playback_status, which likely also reports activity state.
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: the phrase "without navigating or interrupting playback" suggests this is the safe, non-disruptive way to inspect state. There is no explicit statement of when to prefer this over tv_playback_status or tv_logs, and no exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_textA
Type printable ASCII into the already focused field; Unicode and literal %s are unsupported.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not destructive, closed world); the description adds substantive behavioral constraints beyond them — input must be printable ASCII, Unicode and literal %s are rejected. It omits failure behavior (error vs. partial typing) and whether text appends to or replaces existing field content, which keeps it short of a 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?
A single dense sentence with the action, precondition, and rejection rules front-loaded and no filler. Every clause earns its place by preventing a specific input error.
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?
The tool is simple, an output schema exists so return values need no explanation, and the description covers the precondition and character restrictions. The remaining gap is what occurs when no field is focused or when unsupported input is sent, which matters for an automation tool that mutates UI state.
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?
With 0% schema description coverage, the description must carry the meaning of the single `text` argument, and it does add crucial constraints not present in the schema: ASCII-only and no literal %s. The schema's minLength/maxLength bounds are undocumented in prose, and the parameter name is never explicitly tied to these rules, but the added meaning is substantial.
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?
"Type printable ASCII into the already focused field" gives a concrete verb (type) and resource (focused text field), so an agent immediately knows this is text entry rather than navigation or launch. It is distinct from siblings like tv_navigate and tv_launch, though the description never names them or states which tool establishes focus.
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 phrase "already focused field" implies a precondition: focus must exist before calling, which is useful guidance. However, it never says which sibling (e.g., tv_navigate or tv_ui_metadata) to use to establish focus, nor what happens if nothing is focused, leaving the agent to infer the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tv_ui_metadataB
Read bounded accessibility nodes using a temporary UI dump, then remove the remote file.
| Name | Required | Description | Default |
|---|---|---|---|
| max_nodes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false with destructiveHint=false, and the description usefully explains the apparent inconsistency: the tool creates a temporary dump and removes the remote file afterwards, which is why it isn't read-only. That is genuine added context. However, it omits cost/latency of a dump, whether concurrent calls conflict on the temp file, and what happens if removal fails.
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 sentence, front-loaded with the action and its resource, with no filler. It is dense enough that the temp-file lifecycle clause reads slightly compressed, but nothing is wasted.
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 needn't be described. Still, for a tool that mutates remote state via a temp file and sits among nine TV siblings, the definition should explain when to reach for it and any limits on repeated calls. Adequate but incomplete.
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% with one parameter, max_nodes, whose bounds (1-200, default 80) appear only as raw constraints. The word 'bounded' hints that node count is capped but gives no guidance on choosing a value or what you lose at low values. Minimal compensation for an undocumented parameter.
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: reads accessibility nodes, bounded, via a temporary UI dump that is then deleted. An agent can tell this apart from tv_status or tv_navigate because it explicitly concerns UI node data. It stops short of saying what the nodes represent (screen hierarchy) or how they relate to 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?
No when-to-use guidance at all: it never says to call this before tv_text/tv_navigate to locate elements, nor when tv_status would be a cheaper alternative among the nine siblings. The use case is only inferable from the phrase 'accessibility nodes'.
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.
10 tool updates
v0.1.0- First observed
tv_connect - First observed
tv_launch - First observed
tv_logs - First observed
tv_navigate - First observed
tv_packages - First observed
tv_playback - First observed
tv_playback_status - First observed
tv_status - First observed
tv_text - First observed
tv_ui_metadata
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes: connection, status, package discovery, launching, navigation, text entry, logs, UI metadata, and playback control. There is some potential confusion among tv_status, tv_playback_status, and tv_playback, but the descriptions make their boundaries reasonably clear.
All tool names use a consistent tv_ prefix and snake_case, which makes them predictable. However, some names are action-oriented (tv_connect, tv_launch) while others are resource-oriented (tv_packages, tv_logs, tv_ui_metadata), so the verb_noun pattern is not fully uniform.
Ten tools is well-scoped for a Smart TV control server, covering connection, status, app discovery, launching, input, playback, logs, and UI inspection without obvious redundancy. Each tool appears to earn its place in the surface.
The core lifecycle for Smart TV interaction is covered: connect, inspect status, discover packages, launch apps, navigate, type text, send media keys, read logs, and inspect UI metadata. Minor gaps exist around explicit disconnect, power control, volume control, and app termination, but most workflows can likely be handled through the available navigation and media-key tools.
Maintenance
Related MCP Connectors
Control Android TV from any AI. 38 MCP tools: playback, recap, recommend, smart-home, schedules.
Remote MCP for Android CLI agent build gate, structured receipts, audit logs, and reviewer-ready evi
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables controlling an Android device from an MCP client via ADB, including wireless debugging discovery, UI-tree inspection, and performing taps, swipes, typing, app actions, and shell commands without relying on screen coordinates.12 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables bounded, local-first Android device perception and interaction over ADB, including screenshots, UI hierarchy inspection, allowlisted key/app/URI actions, and guarded verified taps. It also exposes passive health, runtime status, capability, permission, and unified device-contract surfaces.Apache 2.0
- AlicenseAqualityBmaintenanceLets an MCP client control an NVIDIA Shield TV over the Android TV Remote protocol v2 by pressing remote keys, launching allow-listed apps, waking or sleeping the device, and reading its power state and foreground app.8MIT
- AlicenseNot gradedqualityAmaintenanceEnables MCP-compatible AI assistants to see and control Android devices through ADB and a fast device-control protocol, including screenshots, touch input, typing, app management, UI inspection, file transfer, shell commands, and audio/video streaming.374 npmMIT