CouchPilot
Allows control of an Apple TV, including power, playback, app launching, navigation, typing, and picture settings, with optional screen and UI inspection for visual tasks.
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., "@CouchPilotFind and play the next episode of Ted Lasso."
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.
🛋️ CouchPilot
Let your agent control your Apple TV.
I got sick of screwing around with Apple TV settings, hunting down shows across streaming apps, and relaying an agent’s troubleshooting advice through the remote. CouchPilot lets you ask your agent in plain English to queue up shows, change settings, and navigate apps—especially useful with a projector, where fixing the picture can take longer than picking a movie.
“Find Breaking Bad and get an episode ready.”
“Help me fix the washed-out picture.”
“Find and install Crossy Road.”
A local, open-source bridge for Codex, Claude Code, and other MCP agents. No jailbreak. No separate model API key.
How it works
flowchart TD
You["You"] -->|"Plain English"| Agent["Your agent"]
Agent <-->|"MCP tools and results"| Bridge["CouchPilot<br/>on your computer"]
Bridge <-->|"pyatv<br/>Direct commands"| TV["Apple TV"]
Bridge <-->|"Optional WDA helper<br/>Screen and UI"| TVpyatv handles power, playback, app launches, and typing over your local network. For tasks that need the screen, a signed WebDriverAgent helper on the Apple TV returns UI labels, focus, and screenshots. Your existing agent chooses the next action and checks the result, using compact text observations first and images when needed.
Related MCP server: homekit-mcp
Why CouchPilot?
I started this because I hadn’t found the full watch-and-troubleshoot workflow I wanted, and recently discovered Apple TV MCP as an alternative. Its visual route requests individual screenshots; CouchPilot uses a signed WDA helper for structured UI labels and focus, text-first observations, and freshness-checked actions. We’ve verified that loop on a real Apple TV. Comparison and tradeoffs →
Get started → · What works today · MIT license
Early preview: playback, app navigation, and a picture-setting change have been tested on a real Apple TV. Full visual control currently needs a Mac and a signed helper; free signing requires occasional renewal. Cross-service show discovery and seamless setup are still works in progress.
Available Tools
6 toolsactC
Act once, then observe. UI inputs need observation_id.
Select activates a unique, already focused label without moving focus.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Cell | |
| image | No | ||
| value | Yes | ||
| action | Yes | ||
| device | Yes | ||
| expected_app | No | ||
| expected_label | No | ||
| observation_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It adds useful details: the tool acts once, requires observation_id for UI inputs, and select activates a focused label without moving focus. But it omits effects of press/type/launch, return behavior, permissions, or side effects.
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: two sentences, no filler, and the core 'act once, then observe' premise is front-loaded. It sacrifices detail for brevity, but every sentence provides some value.
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 complex with 8 parameters and no output schema or annotations, yet the description does not explain return values, how targets are matched, when expected fields are needed, or what happens after each action. Essential context for correct invocation is missing.
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% across 8 parameters, so the description must compensate. It only adds meaning for observation_id and select, leaving value, device, role, image, expected_app, and expected_label unexplained.
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 indicates the tool performs an action ('Act once') and clarifies the select action, but it never explicitly states that it executes UI actions like press/type/launch on a device or element. It is more than a tautology, yet remains vague and does not clearly distinguish itself from siblings like control or observe.
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?
'Act once, then observe' implies a workflow and 'UI inputs need observation_id' gives a prerequisite. However, there are no explicit when-to-use or when-not-to-use instructions, and no alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appsB
List installed apps and their bundle IDs through paired control.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It clearly indicates a read-only listing operation and mentions 'paired control' as a contextual prerequisite, but it does not explain failure modes, whether a device must be actively connected, or any additional side effects or requirements.
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 a single concise sentence with no filler or redundant wording. It front-loads the core purpose and includes a relevant contextual qualifier without going overboard.
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 simple read-only list tool, the description covers the core action and result focus, especially with an output schema present. However, the lack of parameter explanation and usage guidance leaves some gaps, though these are less critical for such a simple operation.
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 schema description coverage is 0%, and the description does not mention the required 'device' parameter at all. The schema only provides the property name 'device' and title 'Device', which gives a minimal hint but no format, validation, or relationship to 'paired control' is explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a specific resource ('installed apps and their bundle IDs'), making the tool's function immediately clear. It also distinguishes itself from sibling tools like devices, observe, act, status, and control, none of which are about listing installed apps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to use this tool versus alternatives or when not to use it. It implies use when you need a list of installed apps, but does not mention prerequisites, exclusions, or how it relates to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
controlD
Paired control. Use press for explicit buttons; observe agent-chosen navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| value | No | ||
| device | Yes | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It provides no information about side effects, permissions, whether operations are reversible, what happens on failure, or what the tool returns. 'Paired control' hints at a relationship with observe but is too opaque to inform an agent about consequences.
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 brief and front-loaded, but it is under-specified rather than effectively concise. Both sentences are short, but the second is cryptic and the first adds little actionable meaning.
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?
Despite the presence of an output schema, the description lacks essential context for a tool with three parameters and no annotations. An agent cannot determine when to use it, what each operation entails, how to construct parameters, or what behavior to expect. This is not enough for 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% and the description does not explain device, value, or any operation besides press. The agent is left without guidance for what value means, how to specify a device, or how operations like transport or open_url should be formatted.
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 says only "Paired control" and gives a navigation hint, but never explicitly states that the tool performs device control operations such as wake, sleep, transport, press, open_url, launch, or type. The resource and overall verb are left to inference from the schema, so the purpose remains vague.
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 sentence 'Use press for explicit buttons; observe agent-chosen navigation' gives one concrete usage rule: choose press when an explicit button should be pressed, and use observe for navigation decisions. However, it does not explain when to use control vs. sibling tools like act, status, or apps, or how to select among the other operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devicesC
List routes and freshly inspect local cached helper-profile expiry evidence.
| 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?
No annotations are provided, so the description must disclose behavior on its own. It reveals that the operation involves local cache and inspection, but it does not state whether this triggers a refresh or fetch, whether permissions are required, or what side effects, if any, exist.
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 short and free of filler, but it crams two distinct actions into one unpunctuated sentence with unexplained jargon. It is compact but not a model of clear front-loading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the main missing piece is the core concept: what 'devices' means and how 'routes' and 'helper-profile expiry evidence' relate to it. Without that, an agent cannot confidently select or invoke the tool correctly.
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 input schema has zero parameters, so parameter documentation is not needed; schema coverage is trivially 100%. There are no parameter meanings for the description to clarify.
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 two actions, 'List routes' and 'inspect local cached helper-profile expiry evidence,' but neither clearly maps to a 'devices' tool. It is not a tautology, but the resource and intended purpose are obscure, and it does not distinguish the tool from siblings like status or apps.
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 guidance on when to use this tool versus observe, act, status, apps, or control. The word 'freshly' hints at an on-demand refresh, but there is no explicit context, prerequisite, or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
observeA
Read fresh app, focus, labels, and values. Request an image only when useful.
| Name | Required | Description | Default |
|---|---|---|---|
| image | No | ||
| device | Yes | ||
| expected_app | No | ||
| expected_label | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It communicates that this is a read operation and that images are optional, which is useful. However, it does not explain what happens when expected_app or expected_label are provided, what the response structure is, or whether any state is altered.
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 carry the main purpose and a useful behavioral hint with no wasted words. The core action is front-loaded and the optional-image guidance is placed second, which is an efficient structure.
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 simple observation tool, the description is minimally viable: it states what is read and warns about image usage. However, there is no output schema and no explanation of the optional expected_app/expected_label parameters, so an agent cannot fully anticipate all behaviors or return values.
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 needed to compensate. It only adds meaning for image ('only when useful'); device, expected_app, and expected_label are left to inference from their names. This is a clear gap for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('read') and names precise resources ('app, focus, labels, and values'). 'Fresh' clarifies it is about current UI state, which clearly separates it from action-oriented siblings like act and control and list-oriented siblings like devices and apps.
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 gives a clear conditional guideline: 'Request an image only when useful.' It also implies the tool should be used when fresh UI state is needed. It does not explicitly name alternatives or when-not-to-use cases, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusC
Read power and now-playing metadata through paired control; no screenshots needed.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It accurately states the operation is a read ('Read') and clarifies that no screenshots are involved, which is useful. However, it does not explain prerequisites like device pairing, failure behavior, or whether this consumes any resources, leaving significant behavioral ambiguity.
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 definition is a single short sentence, which is efficient and front-loads the verb 'Read'. The phrase 'through paired control; no screenshots needed' is compressed but packs a distinction; however, some wording is ambiguous rather than simply concise.
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 (one param, output schema present), but the one required parameter is entirely undocumented in both schema and description, and usage context relative to siblings is missing. The description gives no sense of what 'paired control' means operationally, so an agent would struggle to invoke this correctly without external knowledge.
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 input schema contains one required string parameter 'device' with zero description coverage, and the tool description never mentions the device parameter. The agent receives no guidance on what value to pass (device ID, name, URI) or how it relates to 'paired control'. This is a complete gap.
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 read operation ('Read power and now-playing metadata') and adds a differentiator ('no screenshots needed') that hints at what the tool is not for. However, 'through paired control' is vague and does not clearly tie to any sibling tool's role, so it is not a fully precise sibling distinction.
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 explicit when-to-use or alternative selection is provided. The phrase 'no screenshots needed' only implies a contrast with a screenshot-based workflow, but it never names an alternative tool or states a condition for choosing this one. An agent is left to infer usage from the tool name.
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.
6 tool updates
v0.1.0- First observed
act - First observed
apps - First observed
control - First observed
devices - First observed
observe - First observed
status
TDQS
Scored across 6 tools
The tools split into discovery (devices/apps), screen reading (observe), UI actions (act), hardware state (status), and remote presses (control). Act vs control and observe vs status have some surface overlap, but their descriptions and inputs are distinct enough for an agent to choose correctly.
All names are single lowercase words, but they mix bare nouns (devices, status, apps) with bare verbs (observe, act, control) and do not follow a predictable verb_noun pattern. The names are readable but not consistent in style.
Six tools is well-scoped for a media-device remote-control and UI-automation server. Each tool covers a distinct aspect—discovery, UI state, UI action, device status, installed apps, and button control—without bloat.
The set covers the core lifecycle of piloting a device: list devices/apps, observe the UI, act on it, check power/media status, and send remote button presses. There is no explicit app-launch or volume/media-seek operation, but agents can work around this via act/control and observe.
Maintenance
Related MCP Connectors
Control Android TV from any AI. 38 MCP tools: playback, recap, recommend, smart-home, schedules.
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables controlling macOS applications via accessibility APIs, supporting actions like clicking, typing, and keyboard input through MCP commands.65 npm354MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to control Apple Home devices, scenes, and automations through MCP.16 npm64MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to control macOS via accessibility and screen recording, providing tools to list apps, observe UI, click, type, press keys, and scroll.MIT
- AlicenseNot gradedqualityAmaintenanceExposes native iPhone device services and UI automation through MCP, enabling agents to inspect and control trusted iPhones via a unified interface.2GPL 3.0