Apple TV MCP
Provides tools for controlling and observing an Apple TV, including opening apps, navigating tvOS, controlling playback, typing text, adjusting volume, managing power, and capturing screenshots for visual verification.
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., "@Apple TV MCPOpen YouTube and search for OpenAI"
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.
Apple TV MCP: A local MCP server that lets AI agents control — and see — your Apple TV
Open apps, navigate tvOS, control playback, type searches, adjust volume, manage power, and take screenshots so a multimodal agent can actually inspect what happened.
You:
Open YouTube and search for OpenAI.
Agent:
→ opens YouTube
→ takes a screenshot
→ sees the current interface
→ navigates to Search
→ types "OpenAI"
→ takes another screenshot
→ verifies the resultsApple TV MCP turns your Apple TV into a locally controlled, visually observable device for MCP-capable AI agents.
No hosted backend. No custom Apple TV app. No cloud account.
Why Apple TV MCP?
Most Apple TV automation is blind.
A script can press Right or Select, but it usually has no idea what appeared on the screen afterward.
Apple TV MCP combines semantic control with point-in-time visual observation.
Traditional Apple TV automation | Apple TV MCP |
Send blind remote commands | Take screenshots between actions |
Build app-specific scripts | Navigate arbitrary tvOS interfaces |
Guess whether an action worked | Inspect the screen and verify |
Custom integration per AI system | Standard MCP tool interface |
Remote commands only | Apps, playback, text, power, volume, navigation, and vision |
The result is a feedback loop an AI agent can actually use:
screenshot
↓
model sees tvOS
↓
chooses an action
↓
press / type / open
↓
screenshot again
↓
verifySemantic tools are still preferred whenever possible. Screenshots make the difference when the task requires navigating an interface that does not expose a direct API.
Related MCP server: @qirabot/mcp
Install in seconds
Apple TV MCP requires Python 3.14.
Recommended
uv tool install appletv-mcpOr:
pipx install appletv-mcpThen pair your Apple TV:
atvremote wizardConfigure Apple TV MCP:
appletv-mcp configureCheck the setup:
appletv-mcp doctorAnd start the MCP server:
appletv-mcp serveFrom source
git clone https://github.com/trevor-nichols/appletv-mcp.git
cd appletv-mcp
uv sync --locked
uv run appletv-mcp configure
uv run appletv-mcp doctor
uv run appletv-mcp serveWhat can it do?
Apple TV MCP exposes fourteen tools grouped around what an agent actually wants to accomplish.
See
Take a screenshot of the current Apple TV screen
Read device, connection, playback, and media state
Inspect available Apple TV capabilities
Apps
List installed applications
Open an application by name
Open an application by bundle identifier
Open deep links and custom application URLs
Navigate
Up
Down
Left
Right
Select
Back
Home
Menu
Other supported remote actions
Remote navigation is intentionally treated as non-idempotent. Apple TV MCP does not blindly replay navigation commands after an uncertain connection failure.
Playback
Play
Pause
Toggle play/pause
Stop
Next
Previous
Seek to an absolute position
Skip forward or backward
Text
Type directly into a focused tvOS text field.
This is useful for:
Search
Usernames
App navigation
Query entry
Volume
Read volume when available
Set an absolute volume level
Adjust volume relatively
Power
Turn the Apple TV on
Turn the Apple TV off
Power operations use different retry semantics so a reconnect attempt cannot accidentally wake a device immediately after a successful power-off command.
Give your agent eyes
The optional screenshot backend is what makes Apple TV MCP more than a remote control.
The MCP tool:
apple_tv_screenshotreturns the current Apple TV screen as native MCP image content.
That means a multimodal MCP client can call the tool and inspect the returned image directly.
For example:
Agent:
apple_tv_screenshot()
→ sees the Apple TV Home Screen
→ sees YouTube highlighted
apple_tv_press(button="select")
apple_tv_screenshot()
→ sees the YouTube interfaceThe model does not need access to a local screen.png path and does not receive base64 inside a text response.
The PNG itself is returned through MCP.
Screenshots are point-in-time
Apple TV MCP does not continuously watch the screen.
A screenshot describes what was rendered at the moment it was captured.
If the agent performs another action afterward, the previous screenshot may already be stale.
The intended pattern is:
observe
→ act
→ observe
→ verifyEnable screenshots
Screenshot support is optional.
Apple TV control continues to work normally without it.
Install the separate helper:
uv tool install appletv-screenshotThe screenshot system uses a separate Apple developer / RemoteXPC pairing from the pairing used by pyatv.
Pair for developer access:
pymobiledevice3 remote pairThen configure the screenshot helper for one Apple TV:
appletv-screenshot configure --udid <UDID>Verify everything together:
appletv-mcp doctorA healthy installation will report both Apple TV control and screen capture.
The screenshot helper has its own configuration, dependencies, and lifecycle. pymobiledevice3 is not imported by the main appletv-mcp package.
For deeper screenshot setup and transport troubleshooting, see:
sidecars/appletv-screenshot/README.mdQuick start
The complete happy path is:
# Install
uv tool install appletv-mcp
# Pair for Apple TV control
atvremote wizard
# Choose the Apple TV
appletv-mcp configure
# Optional: install visual observation
uv tool install appletv-screenshot
# Optional: developer pairing for screenshots
pymobiledevice3 remote pair
appletv-screenshot configure --udid <UDID>
# Verify
appletv-mcp doctor
# Run the MCP server
appletv-mcp serveConnect your MCP client
Apple TV MCP uses local stdio MCP transport.
Any MCP client capable of launching a local stdio server can use it.
A typical configuration looks like:
{
"mcpServers": {
"appletv-mcp": {
"command": "appletv-mcp",
"args": ["serve"]
}
}
}If Apple TV MCP is running from a cloned repository instead:
{
"mcpServers": {
"appletv-mcp": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/appletv-mcp",
"run",
"appletv-mcp",
"serve"
]
}
}
}The server does not expose an HTTP endpoint and does not require OAuth.
Tools
Tool | Purpose |
| Read structured device and playback state |
| Inspect normalized feature availability |
| List launchable applications |
| Turn the Apple TV on or off |
| Open an application |
| Open a URL or deep link |
| Press Apple TV remote buttons |
| Control playback |
| Seek to an absolute playback position |
| Skip forward or backward |
| Replace focused keyboard text |
| Set an absolute volume |
| Adjust volume relatively |
| Return one screenshot as MCP image content |
The screenshot tool is the only tool that returns image content rather than a structured result.
How it works
Apple TV MCP keeps control and visual observation intentionally separate.
AI Agent
│
▼
Apple TV MCP
/ \
/ \
▼ ▼
semantic control screen capture
│ │
pyatv appletv-screenshot
│ │
│ pymobiledevice3
│ │
│ RemoteXPC / DVT
│ │
└──── Apple TV ─┘Control
Apple TV control is provided through pyatv.
Apple TV MCP adds a semantic application layer on top for:
deterministic app resolution
capability checking
connection lifecycle
safe retry behavior
non-idempotent command protection
normalized MCP results
The stable Apple TV identifier is authoritative.
The last known IP address is only an optimization. If the Apple TV changes addresses, Apple TV MCP can rediscover it by identifier and update the preferred host.
Vision
Screenshots use the separate appletv-screenshot helper.
The helper uses pymobiledevice3 to reach Apple's developer services over RemoteXPC and request a screenshot through DVT.
Its default transport strategy is:
macOS:
native → userspace → tunneld
Linux / Windows:
userspace → tunneldThe normal Wi-Fi userspace path does not require root or a permanently running tunnel daemon.
The helper exists as a separate process so its protocol stack, dependencies, pairing records, and failure modes remain isolated from Apple TV control.
pymobiledevice3 is confined to the separately distributed appletv-screenshot helper. The main appletv-mcp package does not import or bundle it; the two processes communicate through a narrow command-line/file contract.
Designed for agents
The MCP interface intentionally exposes semantic operations rather than raw Apple protocols.
An agent should think:
open YouTube
pause playback
seek to 2:00
type "Severance"
set volume to 35%
take a screenshotnot:
send Companion command
call MRP endpoint
construct RemoteXPC requestWhen a semantic operation exists, use it.
Visual navigation is the fallback for interfaces that require it.
Privacy and security
Apple TV MCP is designed to remain local.
No hosted Apple TV MCP backend
No cloud account
MCP uses local stdio transport
Apple TV pairing credentials stay on the user's machine
RemoteXPC pairing records stay with the screenshot helper
Credentials are never MCP parameters
Credentials are never returned to the model
Keyboard text is not emitted into normal logs
Screenshots are captured only when explicitly requested
Screenshot bytes are not logged
Screenshots are stored only in a private temporary directory during capture
Temporary screenshot files are deleted after the MCP result is created
Screenshot capture does not run automatically after commands
The helper is launched without a shell
No DRM circumvention is attempted
Debug mode also keeps raw pyatv protocol logging disabled because low-level Companion traffic can contain sensitive keyboard and pairing payloads.
Protected video
Streaming applications may protect video using DRM.
In that case, screenshots can contain:
black video
blank video
redacted videowhile menus or playback controls remain visible.
That is expected.
Apple TV MCP does not interpret a black protected video region as proof that:
playback failed
the Apple TV turned off
screenshot capture failed
and it does not attempt to bypass DRM.
Limitations
Apple TV MCP intentionally has a narrow initial scope.
One Apple TV
Each server configuration controls one Apple TV.
Multi-device routing is not currently part of the public MCP interface.
Screenshots are not video
apple_tv_screenshot captures one frame at a time.
There is no:
continuous stream
background screen monitoring
screen recording
automatic screenshot loop
Focus is visual, not semantic
pyatv does not provide a universal signal for the currently highlighted tvOS element.
An agent can use screenshots to infer focus where appropriate.
media_app is not foreground_app
Apple TV status may identify the application associated with current media metadata.
That does not independently guarantee which application is visually in the foreground.
Apple developer services can change
Screenshot support relies on Apple developer protocols exposed through pymobiledevice3.
tvOS changes may require future compatibility updates.
Screenshot support is optional
Every non-screenshot Apple TV MCP tool works without the screenshot helper installed.
Configuration
Apple TV MCP stores application configuration in the platform-standard config directory.
Typical settings include:
{
"device_identifier": "...",
"device_name": "Living Room",
"preferred_host": "192.168.1.10",
"scan_timeout_seconds": 5.0,
"command_timeout_seconds": 15.0,
"screen_capture": {
"command": "appletv-screenshot",
"timeout_seconds": 20.0,
"max_image_bytes": 33554432
}
}Pairing credentials are not stored in this file.
If an MCP host launches processes with a minimal PATH, set screen_capture.command to the absolute path of the screenshot helper.
Existing configuration files from Apple TV MCP v0.1 remain compatible.
Doctor
Run:
appletv-mcp doctorto diagnose the complete installation.
It checks areas such as:
configuration
pyatv storage
Apple TV discovery
stable device identity
connection
capabilities
screenshot helper
screenshot helper contract
screen-capture target
real screenshot captureScreenshot support is optional.
If the helper is not installed, Doctor reports it as skipped rather than treating Apple TV control as broken.
Troubleshooting
Apple TV not found
Confirm:
the Apple TV is powered on
the computer and Apple TV are on the same local network
atvremote wizardcompleted successfully
Then rerun:
appletv-mcp configure
appletv-mcp doctorApple TV IP changed
That is expected.
Apple TV MCP identifies the configured device by its stable identifier rather than trusting an old IP address.
App will not open
Use:
apple_tv_list_appsto see the applications currently exposed by the device.
Application-name matching is deterministic rather than fuzzy.
Text entry fails
A text field must already be focused on the Apple TV.
Screenshot helper not found
Install it:
uv tool install appletv-screenshotor configure Apple TV MCP with its absolute path.
Screenshot target is not configured
Run:
appletv-screenshot configure --udid <UDID>Screenshot pairing fails
Developer screenshot pairing is separate from atvremote.
Run:
pymobiledevice3 remote pairScreenshot is black
Protected content may intentionally hide its video frame.
Try opening a tvOS menu or application interface and capture again.
Development
Clone the repository:
git clone https://github.com/trevor-nichols/appletv-mcp.git
cd appletv-mcpInstall:
uv sync --lockedRun the complete root quality gate:
uv run ruff check .
uv run ruff format --check .
uv run pyright
uv run pytest
uv buildThe screenshot helper is a separate Python project:
cd sidecars/appletv-screenshot
uv sync --locked
uv run ruff check .
uv run ruff format --check .
uv run pyright
uv run pytestThe root package deliberately does not depend on or bundle pymobiledevice3.
Live tests
Normal tests use fakes and do not require Apple hardware.
Read-only Apple TV integration tests are explicitly opt-in:
APPLE_TV_INTEGRATION_TESTS=1 uv run pytest -m liveTests that can change Apple TV state require an additional opt-in:
APPLE_TV_INTEGRATION_TESTS=1 \
APPLE_TV_LIVE_WRITES=1 \
uv run pytest -m liveNever enable the live-write suite against a device you do not intend to control.
Contributing
Contributions are welcome.
Before opening a pull request:
uv run ruff check .
uv run ruff format --check .
uv run pyright
uv run pytest
uv buildIf your change affects the screenshot helper, run its independent quality gate as well.
Please preserve the project's core architecture:
control = pyatv
observation = external screenshot helper
MCP = semantic interface presented to the agentAvoid exposing raw Apple protocol details through the MCP contract unless there is a clear semantic reason.
License
This repository contains two separately distributed components.
Apple TV MCP
appletv-mcp is licensed under the MIT License.
It does not import, bundle, or distribute pymobiledevice3.
Apple TV Screenshot
The optional appletv-screenshot helper under
sidecars/appletv-screenshot/ is licensed under GPL-3.0-or-later.
The helper directly uses pymobiledevice3, which is also licensed
under GPL-3.0-or-later.
The two components communicate through a one-shot subprocess interface.
See LICENSING.md for the repository-wide map.
Built for a simple idea
AI agents are much more useful when they can verify the effects of their actions.
Apple TV MCP gives them both sides of that loop:
control the Apple TV
+
see the Apple TVSo instead of blindly pressing buttons, an agent can interact with tvOS, inspect the result, and decide what to do next.
Available Tools
14 toolsapple_tv_adjust_volumeA
Nudge volume up or down. Relative steps are not retried after uncertain failure.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Number of relative volume steps. | |
| direction | Yes | Relative volume direction. |
Output Schema
| Name | Required | Description |
|---|---|---|
| direction | Yes | |
| volume_percent | No | |
| completed_steps | Yes | |
| requested_steps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, non-destructive write, so the safety profile is covered. The description adds genuinely new behavioral context by disclosing retry semantics ('Relative steps are not retried after uncertain failure'), which the agent cannot learn from the annotations.
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 with no waste; the core relative-adjustment purpose is front-loaded and the retry caveat follows immediately.
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 two-parameter tool with full schema coverage, a complete annotation set, and an output schema, the description is nearly sufficient. The only omission is an explicit pointer to apple_tv_set_volume for absolute volume changes.
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 100%, so both the 'steps' and 'direction' parameters are already documented in the schema, setting the baseline at 3. The description's phrase 'Relative steps' reinforces the semantics but adds no range, default, or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Nudge volume up or down') and makes the relative nature of the operation clear, distinguishing it in spirit from the absolute-scaling sibling apple_tv_set_volume. However, it never names that sibling, so the differentiation relies on the agent inferring 'nudge' vs 'set'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Nudge' and 'Relative steps', which suggests this is for incremental changes rather than absolute levels, but there is no explicit when-to-use statement or mention of apple_tv_set_volume as the alternative for setting a specific level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_capabilitiesARead-only
Return current availability of semantic Apple TV operations.
Values are available, unknown, unavailable, or unsupported. This is not a screenshot or UI-hierarchy dump.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| next | Yes | |
| play | Yes | |
| seek | Yes | |
| stop | Yes | |
| pause | Yes | |
| toggle | Yes | |
| power_on | Yes | |
| previous | Yes | |
| text_set | Yes | |
| list_apps | Yes | |
| power_off | Yes | |
| volume_up | Yes | |
| launch_app | Yes | |
| volume_get | Yes | |
| volume_set | Yes | |
| navigate_up | Yes | |
| volume_down | Yes | |
| skip_forward | Yes | |
| navigate_back | Yes | |
| navigate_down | Yes | |
| navigate_home | Yes | |
| navigate_left | Yes | |
| skip_backward | Yes | |
| keyboard_focus | Yes | |
| navigate_right | Yes | |
| navigate_select | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), so the bar is lowered. The description adds genuine value beyond them by enumerating the possible availability states (available, unknown, unavailable, unsupported) and clarifying the output scope as semantic rather than a raw UI dump.
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?
Three short sentences, front-loaded with the core purpose and each sentence earning its place: the enumeration clarifies return semantics and the final sentence blocks a plausible misreading. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return structure, and zero parameters removes schema burden. The description is complete for a read-only capability probe, though a brief note on when to prefer it over apple_tv_status would fully close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document; per the rubric this sets a baseline of 4. The description correctly adds no misleading parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return current availability of semantic Apple TV operations') and explicitly differentiates from sibling-style tools by declaring 'This is not a screenshot or UI-hierarchy dump.' An agent can immediately tell this is a capability-discovery tool distinct from apple_tv_screenshot and apple_tv_status.
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 negative framing ('not a screenshot or UI-hierarchy dump') implies when this tool is preferable, but there is no explicit when-to-use statement or guidance on querying it before attempting other operations. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_list_appsARead-only
List launchable applications installed on the Apple TV.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional case-insensitive substring filter for name or bundle ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds little beyond that, only clarifying the scope to 'launchable' applications; it does not mention pagination, rate limits, or other behavioral traits. With annotations carrying the main burden, this is minimally viable.
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, well-structured sentence that is front-loaded and contains no wasted words. It efficiently conveys the essential purpose.
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 list tool with an optional filter, the description is complete enough: the output schema handles return values, the input schema documents the query parameter, and the annotations cover safety. No critical information for invoking the tool 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 100%, so the single query parameter is fully documented in the schema. The description does not add any meaning beyond what the schema provides, which is appropriate given the baseline for high coverage.
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 states a specific verb (list) and resource (launchable applications installed on the Apple TV), clearly distinguishing it from siblings like apple_tv_open_app. However, it does not explicitly name or contrast with any alternative tool, so it falls short of the top score.
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 on when to use this tool versus alternatives such as apple_tv_status or apple_tv_capabilities. While the purpose implies a straightforward listing operation, no explicit context, prerequisites, or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_open_appAIdempotent
Launch an installed application by exact bundle ID or exact display name.
Matching is deterministic. Typos do not auto-launch a similar application.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Exact bundle identifier, or exact application display name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| launched | Yes | |
| bundle_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (non-readOnly, idempotent, non-destructive), so the bar is lower. The description adds genuine behavioral context beyond annotations by stating matching is deterministic and typos will not auto-launch a similar app, clarifying the failure mode.
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, front-loaded with the core action and the exact-matching constraint. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations cover the safety profile. The description contributes the key determinism behavior, though it could mention prerequisites such as resolving the app via apple_tv_list_apps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented in the schema itself. The description restates 'exact bundle ID or exact display name' but adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Launch') and resource ('an installed application'), which cleanly distinguishes it from siblings like apple_tv_open_url (URLs) and apple_tv_list_apps (enumeration). It does not explicitly name a sibling to route against, so it falls just short of the top mark.
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 implies when to use it (launching an installed app) but gives no explicit when/when-not guidance or pointers to alternatives such as using apple_tv_list_apps first to resolve a valid bundle ID. Usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_open_urlA
Ask the Apple TV to open a URL or application deep link.
A successful result means the launch request was accepted. It does not prove that a specific screen or item is visible. Deep links are not retried after uncertain delivery because they may start playback or other side effects.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Application URL or deep link, including custom schemes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| accepted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as non-read-only, non-idempotent, and non-destructive, and the description adds genuinely useful context beyond that: a success only means the launch request was accepted, not that a screen is visible, and uncertain deliveries are deliberately not retried because of playback side effects. That side-effect and retry-semantics disclosure is exactly the kind of behavioral detail annotations cannot carry.
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?
Three short sentences, front-loaded with the action and followed by the two caveats that matter. No filler, though the sentences are line-broken in a way that reads slightly disjointed rather than as a single tight block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description correctly manages expectations about what success means. The one remaining gap is the absence of any pointer to apple_tv_open_app for the non-deep-link case, which matters in a 13-tool sibling set.
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 100% and the single url parameter is documented as accepting custom schemes. The description adds no format examples or scheme constraints beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (open a URL or application deep link on the Apple TV), which is unambiguous on its own. It does not explicitly contrast itself with the adjacent sibling apple_tv_open_app, so an agent must infer the URL-vs-app distinction from the parameter name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or named alternative. The note about deep links not being retried is a behavioral caveat rather than routing guidance, and the agent is never told to prefer apple_tv_open_app for plain app launches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_playbackB
Control playback with play, pause, toggle, stop, next, or previous.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Semantic playback action. toggle/next/previous are not retried. |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | |
| accepted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds no behavioral context beyond the action list; the useful 'toggle/next/previous are not retried' note lives in the schema, not the description, so nothing here enriches the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the resource and lists the actions with zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and a 1-param tool is inherently simple. But the omission of sibling differentiation (especially versus apple_tv_skip) leaves a real navigational gap for an agent choosing among 14 playback-related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum parameter is fully documented in the schema, so the baseline is 3. The description merely restates the same enum values, adding no syntax, ordering, or semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Control playback') and enumerates the six actions, so an agent knows exactly what it does. However, it does not differentiate from siblings like apple_tv_skip, which overlaps with the 'next'/'previous' actions, leaving ambiguity between tools.
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 lists allowed actions but gives no when-to-use guidance, no conditions selecting this tool over alternatives, and no exclusions. The overlap with apple_tv_skip is left unresolved, so the agent must infer when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_powerB
Turn the Apple TV on or off and report the observed power state.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | Requested power state. |
Output Schema
| Name | Required | Description |
|---|---|---|
| power_state | Yes | |
| requested_state | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent operation, so the safety profile is covered. The description adds that it reports the observed power state, but says nothing about whether it waits for the state to settle, what happens on failure, or any device-permission 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?
A single front-loaded sentence with no filler; the action and the reporting behavior are both stated economically and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the lone parameter is fully documented. The definition is nearly sufficient, with the only gap being the absence of any note on how the observed state is confirmed or what failure looks like.
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 100% and the single 'state' parameter is documented with a PowerTarget type. The description's 'on or off' mirrors the enum rather than adding new meaning, so baseline 3 applies.
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?
Specific verb+resource: it sets the Apple TV power state and reports the observed result, which is clear and distinct from the sibling apple_tv_status (read-only) and playback/volume tools. It does not, however, explicitly name or contrast itself with apple_tv_status, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use/when-not guidance and no pointer to apple_tv_status for reading only. Usage is only implied by the 'on or off' phrasing, leaving the agent to guess whether this is preferable to apple_tv_status for state queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_pressA
Press a remote button. Navigation is non-idempotent.
The press itself has no visual feedback and does not report which UI element has focus. Use apple_tv_screenshot separately when visible UI state needs to be inspected or verified. Uncertain transport failures are not retried automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of sequential presses. | |
| action | No | Tap, double-tap, or hold. | tap |
| button | Yes | Remote button to press. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| action | Yes | |
| button | Yes | |
| completed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=false and readOnlyHint=false, but the description adds genuinely new context: presses have no visual feedback, do not report focus, and are not auto-retried on uncertain failures. That is material for an agent planning a navigation sequence.
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?
Front-loaded purpose followed by behavioral caveats and an alternative tool, with no filler. The two sentences about lacking visual feedback and not reporting focus overlap slightly, but overall it is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description need not explain return values; it instead supplies the operational caveats (no focus reporting, no retries) an agent needs. What remains unstated is how the non-idempotent navigation interacts with the count parameter.
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 100% with documented count, action, and button fields, so the schema already carries parameter meaning. The description adds nothing about button/action semantics beyond what is in the schema, making 3 the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Press a remote button'), which is unambiguous and distinct from the playback/seek/skip siblings. It does not, however, enumerate the button set in prose, leaving that to the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to apple_tv_screenshot when visible UI state must be inspected or verified, and warns that uncertain transport failures are not retried automatically. It gives no guidance on when to prefer other navigation siblings (seek, skip, playback) over pressing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_screenshotARead-onlyIdempotent
Capture the Apple TV screen as one PNG image.
The image is point-in-time evidence of what the Apple TV rendered when the capture ran. It may be stale after any later action; capture again to verify. Protected DRM video can appear black while surrounding UI stays visible; a black region alone does not mean the TV is off or playback failed. Requires the optional screen-capture helper; without it the tool reports that screen capture is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds real behavioral context beyond them: the capture is a frozen snapshot that can go stale, DRM-protected video may render black while surrounding UI stays visible, and the tool depends on an optional screen-capture helper whose absence is reported rather than silently failing. These are exactly the caveats an agent needs to interpret results.
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 primary action is front-loaded in the first sentence, and the following sentences each cover a distinct failure/interpretation case (staleness, DRM black regions, missing helper). It is mildly longer than strictly necessary for a no-argument tool, but no sentence is filler.
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?
Given no output schema, the description carries the return-value burden well by stating the result is a single PNG and by pre-empting the two most likely misreadings (stale capture, black DRM region). It also discloses the helper dependency, so an agent knows what an unavailable-capture response means.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is 100%, so per the baseline no parameter guidance is required. The description correctly adds nothing about arguments and instead spends its words on output interpretation.
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 first sentence states a specific verb and resource ('Capture the Apple TV screen') plus the output form ('one PNG image'), which is unique among siblings that otherwise control playback, volume, power, or apps. An agent can distinguish it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies clear usage context: 'point-in-time evidence of what the Apple TV rendered when the capture ran' and 'capture again to verify' after later actions. It does not name an alternative tool or state when-not to use it, but with no sibling offering similar functionality there is little to exclude.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_seekBIdempotent
Seek to an absolute playback position in seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| position_seconds | Yes | Absolute playback position in seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| accepted | Yes | |
| requested_position_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, covering the safety profile. The description adds the useful 'absolute position' framing versus relative seeks, but does not say whether the video must be playing, whether seeking preserves play state, or anything beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly-scoped sentence with zero filler, and the key concept ('absolute') is front-loaded.
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 single-parameter tool with full schema coverage, an output schema, and safety annotations, the definition is nearly sufficient. The main missing piece is routing versus the relative apple_tv_skip sibling, but no return-value explanation is needed given the output schema.
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 100%, so the single parameter is already documented with type, minimum, and meaning. The description merely restates the schema's 'Absolute playback position in seconds' phrasing and adds no new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (seek) and resource (playback position) plus the unit (seconds). It distinguishes itself from the relative-motion sibling apple_tv_skip by specifying 'absolute', though it doesn't name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no mention of the alternative apple_tv_skip for relative seeking. The agent must infer that 'absolute' position implies this over the relative skip tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_set_textAIdempotent
Replace text in a focused Apple TV text field.
Requires an active virtual keyboard. An empty string clears the field.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Replacement text for the focused field. Empty string clears it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| accepted | Yes | |
| characters | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it non-read-only, idempotent and non-destructive; the description adds genuine context beyond that by stating the virtual-keyboard precondition and that an empty string clears the field — a behavior an agent could otherwise trigger by accident. It does not say what happens if no keyboard is focused (error vs no-op).
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, front-loaded with the action, followed by the precondition and the edge case. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the mutation semantics, precondition and empty-string behavior are covered. The only real gap is failure behavior when the precondition is unmet.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, and the property description already says 'Empty string clears it.' The description restates that same fact rather than adding format or length constraints, so the schema is doing the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace text in a focused Apple TV text field'), making it immediately distinguishable from the press/seek/playback siblings. An agent can tell this is the text-entry tool without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use ('Requires an active virtual keyboard') and the edge-case semantic for an empty string. It does not name an alternative (e.g. apple_tv_press for individual key presses), 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.
apple_tv_set_volumeAIdempotent
Set absolute volume percent when the device supports volume control.
| Name | Required | Description | Default |
|---|---|---|---|
| percent | Yes | Absolute volume percent from 0 to 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| volume_percent | No | |
| requested_percent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, idempotent write (readOnlyHint=false, idempotentHint=true, destructiveHint=false), consistent with setting an absolute value. The description's added value is the capability precondition ('when the device supports volume control'), but it says nothing about failure behavior when unsupported or whether the call blocks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the operation front-loaded and the capability condition trailing. Nothing is wasted, though it is arguably a touch sparse for a routing-sensitive volume tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a simple one-parameter schema, an output schema present, and annotations covering the safety profile, the description supplies the essential capability caveat. The only meaningful omission is disambiguation from apple_tv_adjust_volume.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented with a 0-100 range and 'Absolute volume percent' description. The tool description adds no syntax, unit, or boundary detail beyond what the schema already provides, so the baseline 3 applies.
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 states a specific verb and resource ('Set absolute volume percent'), immediately conveying the operation. 'Absolute' implicitly contrasts with the relative sibling apple_tv_adjust_volume, but that sibling is never named, so an agent must infer the distinction itself.
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 one condition for use ('when the device supports volume control'), which is useful gating context. However, it never names apple_tv_adjust_volume as the alternative for relative changes, leaving the key routing decision (absolute vs. relative volume) to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_skipA
Skip forward or backward. Relative skips are not retried after uncertain failure.
| Name | Required | Description | Default |
|---|---|---|---|
| seconds | No | Skip interval in seconds. Zero lets the device choose its default. | |
| direction | Yes | Skip direction. |
Output Schema
| Name | Required | Description |
|---|---|---|
| accepted | Yes | |
| direction | Yes | |
| requested_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false and idempotentHint=false, but the description adds a genuinely non-obvious trait: relative skips are not retried after uncertain failure. That retry/failure semantic is not derivable from the annotations or schema and materially affects how an agent should handle errors.
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, purpose front-loaded and the caveat second. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the retry caveat covers the main behavioral risk. However, with apple_tv_seek as a direct sibling, the definition never clarifies which one to call, leaving a real routing gap.
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 100%, so both parameters are already documented, including that seconds=0 lets the device pick a default. The description adds no syntax or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Skip forward or backward') and the phrase 'Relative skips' signals this is a relative-position operation. It does not explicitly name apple_tv_seek as the absolute-position alternative, so the sibling distinction is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no mention of apple_tv_seek, the obvious alternative for absolute jumps. The agent must infer the relative-vs-absolute split from the word 'Relative' alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_tv_statusARead-only
Read current device, power, playback, volume, and keyboard state.
media_app is the application associated with currently playing media, not a guaranteed foreground or visible application. Status does not capture the screen; use apple_tv_screenshot to inspect what is currently rendered.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| device | Yes | |
| playback | No | |
| media_app | No | |
| connection | Yes | |
| power_state | No | |
| keyboard_focus | No | |
| volume_percent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds real behavioral context beyond them by stating that media_app does not guarantee foreground/visible application and that status does not capture the screen. It does not describe refresh timing or determinism of the snapshot, which would be the next useful detail.
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?
Front-loads what is read in the first clause, then spends the remaining two sentences on the two cases most likely to cause misuse (media_app semantics, screen capture). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, and the description covers purpose, one clear alternative, and the key field caveat. It stops short of stating the freshness/cost of the read or how it relates to the other state-mutating siblings, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description still adds meaning about a returned field (media_app), which is more than the empty input schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (current device/power/playback/volume/keyboard state), and enumerates the state domains covered so an agent can distinguish it from apple_tv_power, apple_tv_playback, or apple_tv_set_volume. It explicitly names apple_tv_screenshot as the sibling for a different need.
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?
Gives a clear when-to-use-else clause: for rendered screen content, use apple_tv_screenshot instead. It also clarifies that media_app is not a foreground-app indicator, steering the agent away from a wrong inference. It does not cover the other read-ish siblings (capabilities, list_apps), but the main boundary is drawn.
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.
14 tool updates
v0.2.0- First observed
apple_tv_adjust_volume - First observed
apple_tv_capabilities - First observed
apple_tv_list_apps - First observed
apple_tv_open_app - First observed
apple_tv_open_url - First observed
apple_tv_playback - First observed
apple_tv_power - First observed
apple_tv_press - First observed
apple_tv_screenshot - First observed
apple_tv_seek - First observed
apple_tv_set_text - First observed
apple_tv_set_volume - First observed
apple_tv_skip - First observed
apple_tv_status
TDQS
Scored across 14 tools
Most tools target clearly distinct actions (power, list_apps, open_app, press, screenshot). There is minor overlap between apple_tv_playback (play/pause/next/previous) and apple_tv_skip (relative forward/back) and between apple_tv_seek (absolute) and apple_tv_skip (relative), but the descriptions explicitly distinguish absolute vs relative and idempotency, so selection is resolvable.
All tools share the apple_tv_ prefix, giving a strong namespace. The suffixes mix verbs (seek, press, skip) with nouns (status, capabilities, power, playback, screenshot), which is slightly less uniform than a strict verb_noun scheme but remains readable and internally consistent.
14 tools is well-scoped for a full device-control surface, with each tool earning its place across power, app launch, navigation, playback, volume, text entry, and screen capture. Nothing feels redundant or padded.
The surface covers the key lifecycle: status/capabilities discovery, power, app listing/launch, playback control, volume, text input, and screenshot verification. Minor gaps exist (e.g. no read-back of focused text field contents or current playback position), but agents can work around these via status/capabilities.
Maintenance
Related MCP Connectors
Control Android TV from any AI. 38 MCP tools: playback, recap, recommend, smart-home, schedules.
Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to develop, test, and certify Roku applications by providing direct control over device functions like app deployment, remote input, and SceneGraph inspection. It supports automated workflows including real-time log collection, media monitoring, and certification verification.1-
- AlicenseAqualityBmaintenanceEnables AI assistants to control mobile and desktop devices with natural language, including running automation tasks, taking screenshots, and managing devices.65MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to inspect and control Roku devices—query UI elements, send remote input, launch channels, and run tests—using the Model Context Protocol or a CLI.94MIT
- AlicenseBqualityBmaintenanceEnables AI agents to control Android TV/Android devices through ADB, including screen capture, remote control, app management, and more.2444MIT