About tvpilot
tvpilot is a CLI and stdio MCP server for controlling paired Android TV and Google TV devices. It supports remote input, app launching, title playback, and screen inspection through the TVWizard relay.
Key features
- 01List paired TVs and installed apps
- 02Send remote key events
- 03Launch apps, intents, and URLs
- 04Resolve and play streaming titles
- 05Inspect foreground screen elements
Use cases
- 01Check whether a paired TV is online
- 02Navigate a TV interface remotely
- 03Open an app or deep link on a TV
- 04Find and play a title from a provider
MCP support
Exposes tools to MCP clients for listing paired devices and apps, sending keys, launching apps, playing titles, and observing screen contents. Calls are forwarded through the TVWizard relay.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
6Saved tool list · updated 1w ago
This tool takes no parameters.
Details
From the project READMEtvpilot
tvpilot controls a paired Android TV or Google TV: it lists the paired device, sends remote key events, launches apps and intents, resolves a spoken-style title to the right streaming provider and plays it, and reads back what is on the screen. One binary serves a command-line interface and a stdio MCP server.
Calls go through the TVWizard relay, which forwards them over a WebSocket to the bridge app running on the TV, so no same-network, VPN, or port-forwarding setup is needed. Pairing is done once in the bridge app: it shows a code, you claim it, and you receive a bearer token for your TV.
Configuration
Two environment variables configure the tool:
TVWIZARD_TOKEN(required) — the bearer token issued when you paired your TV. Without it every call fails with an error naming the variable; there are no unauthenticated or fake results.TVWIZARD_MCP_URL(optional) — the relay endpoint. It defaults tohttps://tv.djwizard.ai/api/mcp. Note: the public TVWizard documentation describes the relay architecture and its bearer auth but does not publish the relay's raw HTTP path, so this default endpoint is a documented reconstruction; override it if the relay publishes a different path.
Install
npx @reneturcios/tvpilot devices
Or run the container image:
docker run -i ghcr.io/cloudcorprecords/tvpilot
The container defaults to the MCP server (see below). Pass CLI arguments to use it as a CLI instead.
CLI
tvpilot devices
tvpilot key POWER
tvpilot launch https://www.youtube.com/watch?v=jNQXAC9IVRw --package com.google.android.youtube.tv
tvpilot apps
tvpilot play Stranger Things --country US --season 2 --episode 3 --year 2016 --provider netflix
tvpilot observe
tvpilot --version
Commands print the relay's JSON payload. Exit codes: 0 on
success, 1 when a call fails (including a missing token or an
upstream relay error), 2 for usage errors.
Keys for tvpilot key are POWER, HOME, UP, DOWN, LEFT,
RIGHT, OK, BACK, VOL_UP, and VOL_DOWN. Providers for
--provider are netflix, disney_plus, prime_video, max,
hulu, apple_tv_plus, paramount_plus, peacock, fubo_tv,
youtube, and stremio.
tvpilot observe needs the Android AccessibilityService granted
to the bridge app. The first call without it returns an
accessibility_not_granted error explaining that a setup prompt
was posted on the TV; tap it, then retry.
MCP server
One bin serves both faces. The mcp subcommand starts a stdio MCP
server:
npx -y @reneturcios/tvpilot mcp
MCP client configuration:
{
"mcpServers": {
"tvpilot": {
"command": "npx",
"args": ["-y", "@reneturcios/tvpilot", "mcp"],
"env": { "TVWIZARD_TOKEN": "<your token>" }
}
}
}
Tools
| Tool | Input | What it returns |
|---|---|---|
tv.list_devices | (none) | The TVs paired with the caller's token, each with an id and online flag. |
tv.send_key | key (required) | Sends one key event: one of the ten keys listed above. |
tv.launch_app | data (required), package (optional) | Opens an Intent URI, deep link, or URL, optionally in a named package. |
tv.list_apps | (none) | Installed apps with package, label, and a leanback flag for TV launchers. |
tv.play_title | title (required); country, season, episode, year, provider (optional) | Resolves the title to a provider deep link and plays it. |
tv.observe | (none) | Foreground package/activity, the focused element, and visible clickable nodes. |
Upstream failures — a title that cannot be found, no provider for the title in the chosen country, a relay with its resolver disabled, or accessibility not yet granted — are returned as error results carrying the relay's own message.
Development
npm install
npm run build # tsc -> dist/
npm test # node test runner over test/*.test.ts, no network (fake fetch fixtures)
npm run dev # run the CLI from source via tsx
License
MIT — see LICENSE.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.