Skip to main content
Glama

🛋️ 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"| TV

pyatv 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 tools
actC

Act once, then observe. UI inputs need observation_id.

Select activates a unique, already focused label without moving focus.
ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoCell
imageNo
valueYes
actionYes
deviceYes
expected_appNo
expected_labelNo
observation_idNo

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNo
deviceYes
operationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

D1.8/5.0
Behavior1/5

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.

Conciseness2/5

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.

Completeness1/5

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.

Parameters1/5

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.

Purpose2/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose2/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageNo
deviceYes
expected_appNo
expected_labelNo

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

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

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 6 tool updatesv0.1.0
    • First observedact
    • First observedapps
    • First observedcontrol
    • First observeddevices
    • First observedobserve
    • First observedstatus

TDQS

C2.9/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers