Skip to main content
Glama

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-state

The 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-mcp

tv-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

tv_connect()

Connect the configured endpoint once, then verify get-state.

tv_status()

Connection, manufacturer/model/device/Android release, foreground activity and device/host UTC clocks.

tv_packages(query="", limit=50)

Package-name filter, maximum 100 returned packages.

tv_logs(package, lines=50)

Up to 200 recent logcat records requested for one observed app PID; no global fallback.

tv_ui_metadata(max_nodes=80)

Up to 200 accessibility nodes, password fields redacted, temporary remote file removed; cleanup failures reported.

tv_navigate(key, count=1)

Up/down/left/right/select/back/home/search, maximum 10 key presses.

tv_text(text)

1..256 printable ASCII characters in the currently focused field.

tv_launch(package)

Resolve the package's TV launcher, fall back to its regular launcher, start and observe foreground.

tv_playback_status()

Up to 20 app-reported media session states, without media titles.

tv_playback(action)

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_LIMIT and READ_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 build

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

Source and the companion skill use Apache-2.0. Dependencies retain their own licenses.

Available Tools

10 tools
tv_connectA

Connect only the configured known endpoint; verify get-state. Pair manually first if required.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_logsA
Read-only

Read recent logs only for one running PID of a selected package. May expose private app data.

NameRequiredDescriptionDefault
linesNo
packageYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/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 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.

Purpose4/5

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.

Usage Guidelines3/5

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_navigateC

Send explicit remote navigation for the requested task; can interrupt the current TV activity.

NameRequiredDescriptionDefault
keyYes
countNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare this is not read-only, so mutation is expected; the description adds real value by warning it 'can interrupt the current TV activity'. It stops short of saying what is interrupted (playback? an open menu?) or whether the prior state is recoverable, so the disclosure is useful but shallow.

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 short sentence with the core action front-loaded and no redundant wording. It is terse to the point of under-specification, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/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 described, but for a non-read-only input tool with 0% schema coverage the definition is too thin: no repeat/count semantics, no connection prerequisites, and no detail on the interruption it flags as a risk.

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

Parameters2/5

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

Schema description coverage is 0% for two parameters, so the description must compensate and does not. The 'key' enum is self-documenting, but 'count' (default 1, max 10) is never explained anywhere — an agent gets no confirmation that it repeats the key press, or why the cap is 10.

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+resource ('Send explicit remote navigation') and the schema enum confirms it emits directional/select/back/home/search key presses, which separates it from siblings like tv_text and tv_launch. However, the trailing phrase 'for the requested task' is vague filler that adds no precision.

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 when-to-use guidance, no exclusion of alternatives (e.g. tv_text for text entry, tv_launch for apps), and no stated preconditions such as whether a connection via tv_connect must exist first. The only implicit hint is that it disrupts current activity.

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

tv_packagesB
Read-only

Discover installed app package names with a bounded optional package-name filter.

NameRequiredDescriptionDefault
limitNo
queryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

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

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
actionYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_statusA
Read-only

Read app-reported playback states, excluding titles; sessions can be absent or stale.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

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 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_statusA
Read-only

Read connection, foreground activity and UTC clocks without navigating or interrupting playback.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

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

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
textYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
max_nodesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

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

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 10 tool updatesv0.1.0
    • First observedtv_connect
    • First observedtv_launch
    • First observedtv_logs
    • First observedtv_navigate
    • First observedtv_packages
    • First observedtv_playback
    • First observedtv_playback_status
    • First observedtv_status
    • First observedtv_text
    • First observedtv_ui_metadata

TDQS

A3.6/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    A
    quality
    B
    maintenance
    Lets 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.
    8
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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 npm
    MIT