ios-simulator-mcp
Provides control over the iOS Simulator and Device Hub on macOS, allowing an AI assistant to see and interact with apps running in the simulator.
Supports launching and interacting with Expo/React Native dev-client apps in the iOS Simulator, including opening the correct deep links and Metro dev server.
Uses Facebook's idb tooling to send taps, swipes, typing, key presses, home button, and accessibility tree queries to the iOS Simulator.
Used to install dependencies like idb-companion on macOS; mentioned as a prerequisite rather than an integration target.
Targets the iOS Simulator, providing tools to boot devices, take screenshots, launch apps, and interact with the UI via accessibility tree and touch input.
Runs on macOS and shells out to Xcode command-line tools to control the iOS Simulator and Device Hub.
Provides the idb companion and Python client used for UI automation of the iOS Simulator.
Probes for a running Metro dev server on ports 8081/8082 to determine which dev server to open in the simulator.
Runtime used to run the MCP server; mentioned as a prerequisite rather than an integration target.
Used to create the idb virtual environment; mentioned as a prerequisite rather than an integration target.
Developed against an Expo/React Native dev-client app, but works with any app installed in the simulator.
Can open Storybook in the simulator by probing port 8082 for a Storybook server.
Implementation language of the MCP server; not an integration target.
Provides simctl and devicectl command-line tools used to control simulators, take screenshots, launch apps, and rotate devices.
Click on "Install 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., "@ios-simulator-mcpTake a screenshot of the current simulator screen and describe it"
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.
ios-simulator-mcp
⚠️ Disclaimer
This project is entirely vibe-coded. Every line of it was written by AI — specifically DeepSeek V4 Flash running inside GitHub Copilot — through back-and-forth conversation. It was not designed, hand-written, reviewed, or audited by a human engineer. Assume there are bugs, questionable decisions, and design flaws that a person would have caught.
It exists for one simple reason: I wanted a way to control the iOS Simulator and Device Hub from an AI assistant, and this was the fastest path there. It is a personal tool that I'm sharing in case it's useful to someone else — not production software, and not something anyone should depend on.
Use it at your own risk. Read the code before trusting it with anything that matters. No warranty, no support, and no affiliation with Apple.
If you want to understand what AI-written code looks like, or you just need to poke at a simulator from a chat window, you're in the right place. 🙂
An MCP server that gives an AI assistant (e.g. VS Code Copilot) "eyes and hands" on the iOS Simulator — the same idea as browser automation, but for your simulator:
See — screenshots, returned as images the assistant can view directly.
Act — taps, swipes, typing, key presses, home button, app launch.
Target — an accessibility tree with element frames and computed centers.
Built and verified on macOS with Xcode 27 / iOS 27, Node 24, and Homebrew 6. Xcode ≤ 26 is supported too — see Xcode version support below; only the device-UI app and rotation differ. Developed against an Expo / React Native dev-client app, but it works with any app installed in a simulator.
Xcode version support (26 and 27)
The server runs on both. Only the device-UI app and rotation differ:
Xcode ≤ 26
Xcode 27
Device UI app
Simulator.app, underContents/Developer/ApplicationsDevice Hub, under
Contents/Applications/DeviceHub.app
open -a Simulator✅ works
❌ "Unable to find application named 'Simulator'"
set_orientation/get_orientation❌ unavailable
✅ via
devicectlEverything else — screenshot, boot, tap/swipe/type, accessibility tree
✅
✅
The UI app is found by probing the active developer dir (
xcode-select -p) and testing both locations on disk, so neither version needs configuration — including the fact that Device Hub lives in a non-standard path that LaunchServices does not reliably index. Override withDEVICE_UI_APPif your Xcode lives somewhere unusual.On Xcode ≤ 26 the two orientation tools stay registered but return a clear "not available" error rather than disappearing, so the same
.vscode/mcp.jsonworks on both machines.Xcode 27 separately made
xcrun devicectlsimulator-aware — it lists simulated devices (Reality: simulated) and adds capabilitiessimctlnever had, notably rotation.simctlandidbthemselves are unchanged.
Related MCP server: Shotter
How it works
A thin stdio MCP server (Node + TypeScript, @modelcontextprotocol/sdk)
that shells out to existing macOS CLIs — no iOS code and no app changes required:
Capability | CLI |
Screenshot, list/boot/shutdown simulators, launch/terminate apps, open URLs, light/dark mode |
|
Tap, swipe, type, key press, home button, accessibility tree | |
Orientation (rotate / query) |
|
Device UI window |
|
The assistant is multimodal, so a screenshot returned from the screenshot tool
is directly visible — no OCR needed.
Prerequisites
Tool | Check with |
macOS + Xcode (provides |
|
Homebrew |
|
Python 3.9–3.12 (for the |
|
Node.js 18+ (20+ recommended) |
|
VS Code with Copilot Chat (or any MCP client) | — |
Setup on a fresh Mac
1. Install idb (the touch-input layer)
xcrun simctl cannot send taps/swipes/typing, so we add Facebook's idb
(open source, from Meta — https://github.com/facebook/idb):
brew tap facebook/fb
brew trust facebook/fb # Homebrew 6+ requires tap trust; skip on older Homebrew
brew install idb-companion
python3 -m venv ~/.local/idb-venv
~/.local/idb-venv/bin/pip install --upgrade pip fb-idb
~/.local/idb-venv/bin/idb list-targets # sanity check — should list simulatorsApple Silicon vs Intel:
idb-companioninstalls to/opt/homebrew/binon Apple Silicon and/usr/local/binon Intel. Both are searched automatically; override withIDB_COMPANION_DIRif needed (see Configuration).
2. Install and build the server
cd ios-simulator-mcp
npm install
npm run build # compiles src/ → dist/To move to another machine you only need src/, dist/, package.json,
package-lock.json, tsconfig.json, and this README (node_modules/ is reinstalled).
3. Register with VS Code Copilot
Shortcut: this repo ships a setup skill that automates all of the below — run
node .github/skills/setup-ios-simulator-mcp/scripts/doctor.mjsto check the whole install (prerequisites, build freshness, MCP registration, a live server handshake) and print the fix for anything that's wrong. See.github/skills/setup-ios-simulator-mcp/SKILL.md.
Create a .vscode/mcp.json in your workspace (or add the server via
Copilot Chat → MCP settings) using absolute paths:
{
"servers": {
"ios-simulator": {
"type": "stdio",
"command": "/usr/local/bin/node",
"args": ["/absolute/path/to/ios-simulator-mcp/dist/index.js"]
}
}
}No env block is needed — see Point it at your app below.
Find your Node path with
which nodeand use that exact value.VS Code launches GUI processes with a minimal
PATH, so absolute paths are required — don't rely on nvm/Homebrew being onPATH.Reload the window, then approve the new ios-simulator server in Copilot Chat → MCP settings.
4. Point it at your app (optional)
You shouldn't normally need to configure anything. The server is app-agnostic — no defaults for any particular app, and no paths to your codebase — but it works out what to target by inspecting the simulator:
Which app — the only non-system app running in the simulator, else the only one installed.
launch_app/terminate_appuse it automatically. If several apps are candidates it says so and asks for an explicitbundleIdrather than guessing.Which dev server — probes
127.0.0.1:8081(and:8082for Storybook) for a Metro server that's actually listening.Which deep link — reads the URL schemes the installed app registers, so an Expo dev client gets the
exp+<slug>://expo-development-client/?url=...link it actually accepts.
Why the deep link is read from the app: a bare
exp://127.0.0.1:8081only works with Expo Go. Anexpo-dev-clientbuild registersexp+<slug>instead, and opening the wrong scheme fails withLSApplicationWorkspaceerror 115 ("Simulator device failed to open"). Reading it from the bundle is what makesopen_appwork without configuration.
The environment variables below exist only to override that detection, for when it can't work it out: an app that isn't installed or running yet, several candidate apps, or a dev server on a non-standard port.
5. Running on more than one Mac
mcp.json uses absolute paths, so a config copied between machines may point
at a node that doesn't exist there. On the second machine, run which node and
update command (and the args path to this repo). Nothing else needs changing:
the Xcode 26/27 differences are detected at runtime, and idb/Homebrew paths are
already overridable via env vars.
Configuration (environment variables)
Set these in the env block of .vscode/mcp.json (recommended) or your shell.
Values in bold are the ones most likely to differ on another Mac.
Variable | Default | Notes |
| (auto-detected) | Overrides which app |
| (auto-detected) | Overrides the |
| (auto-detected) | Overrides the |
|
| Fallback device name (Xcode-version dependent) |
| (auto) | App name or absolute |
|
| Device Hub bundle id (Xcode 27+); only used if the name lookup fails |
|
| Usually identical everywhere. Also used to reach |
|
| Where you installed |
|
| Intel Mac → |
| temp dir + | Where PNGs are saved |
Using it
Start Metro in your app:
npm start(app on 8081) ornpm run storybook:server(Storybook on 8082).Boot a simulator with
boot_device, thenopen_app(oropen_storybook).screenshotto see the screen.get_accessibility_treeto find an element's center point.tap/swipe/type_textto drive it, thenscreenshotagain to confirm.
Tools
Tool | What it does |
| Capture the screen; returns PNG + path + pixel size + logical (point) size + scale |
| Dump elements with labels, roles, frames, and computed centers |
| Simulator lifecycle |
| Start/stop an app by bundle id (auto-detected, or |
| Deep links. |
| Tap at (x, y) in points |
| Tap at a 0..1 fraction of the screen |
| Swipe between two points |
| Type into the focused field |
| Send a HID key code (40 = Return, 42 = Backspace, 44 = Space) |
| Press the Home button |
| Rotate: |
| Report the current physical orientation |
| Light/dark mode |
Coordinate conventions: tap/swipe use points (same space as the
accessibility tree). Screenshots are 3× that (pixel size ÷ 3 = points on modern
iPhones). tap_normalized sidesteps scale entirely.
Rotating via set_orientation swaps the screenshot's width/height (e.g.
1206×2622 portrait ↔ 2622×1206 landscape) and the point space with it, so
re-read the accessibility tree after rotating rather than reusing old
coordinates.
Troubleshooting
Symptom | Fix |
| Run |
| Run |
| Use the full path |
| Set |
MCP server won't start in VS Code | Use |
Tools don't appear in chat | Reload window; approve the server in Copilot Chat → MCP settings |
| Run |
| The URL scheme isn't registered by any installed app. Detection reads the scheme from the bundle — if you've overridden |
| Several apps installed/running. Pass |
| Start Metro ( |
| Expected on Xcode 27 — Simulator.app is gone. The server uses Device Hub; set |
| Leftovers from uninstalled runtimes. They're tagged |
Rotation has no effect |
|
| Xcode ≤ 26 has no simulator rotation — expected. Everything else still works |
Screenshot shows the old screen right after a tap | Wait ~300ms for the navigation animation |
Element has no label in the tree | Add |
Project layout
ios-simulator-mcp/
├── src/
│ ├── index.ts # MCP server + tool definitions
│ ├── config.ts # paths, app identity, ports (env-overridable)
│ ├── exec.ts # child-process runner (adds Homebrew to PATH)
│ ├── simctl.ts # xcrun simctl helpers (screenshot, boot, launch…)
│ ├── devicectl.ts # xcrun devicectl helpers (orientation; Xcode 27+)
│ └── idb.ts # idb ui helpers (tap/swipe/type/tree)
├── dist/ # compiled output (npm run build)
├── package.json
└── tsconfig.jsonDevelopment
npm run dev # tsx watch — edits to src/ restart the server
npm run build # type-check + compile to dist/Available Tools
19 toolsboot_deviceBoot a simulatorA
Boot a simulator by name or udid (defaults to the configured device) and open the Simulator app.
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUdid | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden and does disclose a key side effect ('open the Simulator app') beyond booting. It does not mention behavior when the simulator is already booted or failure modes.
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?
Single sentence, front-loaded with the action, and no redundant restatement of the tool name. It packs the default behavior and side effect into minimal space.
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 one-parameter boot operation, the description is nearly complete: action, parameter semantics, default, and side effect. It does not mention the return value or error conditions, but those are secondary for this kind of command.
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 likely provides only a generic string type with no per-parameter description, so the description adds essential meaning: the parameter can be a simulator name or UDID, and omitting it selects the configured device.
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 ('Boot') and resource ('a simulator'), and adds the accepted input forms ('by name or udid'). This clearly distinguishes it from sibling tools such as list_devices and shutdown_device.
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 explains the invocation conditions: supply a name or UDID, or fall back to 'the configured device'. It could explicitly contrast with sibling tools like shutdown_device, but the usage context is still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accessibility_treeDump the accessibility treeA
Return the simulator accessibility tree (elements with labels, roles, frames and computed center points). Use this to find exact tap coordinates for an element.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral burden. 'Return' implies a read-only operation, and the description usefully lists what data is returned. However, it does not mention snapshot freshness, whether hidden/off-screen elements are included, or the coordinate space of the center points, so some important behavioral details remain implicit.
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 two short sentences with no redundancy. The first sentence states what the tool returns, and the second immediately gives the practical use case. Every word earns its place.
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, zero-parameter read-only tool, the description adequately covers what is returned and why an agent would call it. Since there is no output schema, the description's enumeration of the returned fields is especially valuable. It could be slightly more explicit about coordinate system or hierarchy, but the core information is present.
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 has zero parameters, and the schema is empty with 100% coverage by default. The description therefore has no parameter burden to carry, and the baseline score of 4 is appropriate.
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 the specific verb 'Return' with the clear resource 'simulator accessibility tree' and enumerates its contents (labels, roles, frames, center points). It strongly differentiates this tool from UI interaction siblings like tap and swipe by focusing on inspection rather than action.
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 explicitly states the intended use: 'Use this to find exact tap coordinates for an element.' This gives clear context for when the tool is useful. It does not mention when not to use it or name alternatives, but the use case is concrete enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orientationGet the device orientationB
Report the simulator's current physical orientation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden of behavioral disclosure. The word 'Report' conveys a read-only, non-mutating operation, but the description does not disclose what happens if the simulator is not booted, what orientation values are returned (e.g., portrait/landscape labels vs. degrees), or whether any side effects occur.
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 8-word sentence with no wasted words; the key action and object are front-loaded. It is appropriately sized for a zero-parameter tool, though a touch more behavioral detail would fit without bloating it.
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 read tool, the description covers the basic purpose, but with no output schema and no annotations, it fails to explain what the reported orientation looks like (value format/enum) or how it behaves when the simulator is not running. An agent can infer the tool picks up the current orientation but must guess the return shape.
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 has 0 parameters, so there is nothing for the description to add beyond the schema — the baseline 4 applies. The description neither confuses nor repeats parameter-related 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?
The description states a specific verb ('Report') and resource ('the simulator's current physical orientation'), making the core action clear. It implicitly distinguishes itself from the sibling set_orientation through the read-oriented verb 'Report', though it never names the 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?
No guidance is given on when to use this tool versus set_orientation — an agent must infer that 'get' is for reading and 'set' for changing. There are no exclusions, prerequisites, or conditions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launch_appLaunch an appA
Launch an app by bundle id on the booted simulator. Bundle id defaults to the only non-system app running in the simulator, else the only one installed; pass bundleId or set SIM_APP_BUNDLE_ID to override.
| Name | Required | Description | Default |
|---|---|---|---|
| bundleId | 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 compensates well by explaining the default app selection logic (only non-system running app, else only installed app) and the SIM_APP_BUNDLE_ID override. It does not mention failure modes or behavior when multiple apps are running.
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 focused sentences with no filler. Every clause adds information: target, context, default behavior, and override mechanism.
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 a simple one-parameter tool with no output schema, this description covers invocation context, default selection, and override options. Minor gaps remain around error cases (multiple non-system apps, nothing to launch), but the core usage is complete enough.
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 provides only a bare bundleId string, but the description clarifies its meaning, that it is optional, and how the default is determined. It stops short of giving an example or specifying bundle-id format.
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 ('launch') and target ('app by bundle id on the booted simulator'), making the core action clear. It does not explicitly distinguish itself from the sibling open_app, so it stops short of a 5.
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 conveys the intended context: launching an app on the booted simulator by bundle id, with automatic defaults. However, it gives no explicit guidance on when to prefer this over sibling tools like open_app or open_storybook.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesList simulatorsA
List available iOS simulators with udid, name and state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool lists simulators, which implies a read-only operation, but it does not disclose any side effects, prerequisites (e.g., Xcode runtime), or whether it returns only booted devices. For a simple list tool this is acceptable but not rich.
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 sentence with no filler, directly stating the action and output fields. It is appropriately front-loaded and earns every word.
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 no parameters and no output schema, the description provides all necessary context: what it lists and the key attributes included in the result. There is nothing an agent needs to know to call it correctly that 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?
There are zero parameters, and the description adds no parameter-specific information because none exists. Per the rubric, a zero-parameter tool gets a baseline of 4, and the description does not need to compensate for any schema gaps.
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' with a clear resource 'available iOS simulators' and explicitly enumerates the fields returned (udid, name, state). It is distinct from all sibling tools, which are actions (tap, swipe, launch, etc.), making its purpose unambiguous.
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 – to enumerate simulators – but does not explicitly contrast it with any alternative or state exclusions. However, given the sibling set contains no other listing tool, the usage context is clear enough without explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_appOpen the appA
Open the app on the booted simulator. For an Expo / React Native dev client this opens its dev-server URL, detected from a listening Metro server (port 8081) and the scheme the app registers. For a regular app, prefer launch_app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure. It explains the Expo/React Native dev-client path (Metro on port 8081 and the app's registered scheme), which is genuinely helpful. However, it does not state failure behavior, such as what happens when no simulator is booted, no Metro server is listening, or the app is not an Expo dev client.
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 just two sentences. The core action is front-loaded, and the conditional Expo behavior is stated in a compact second sentence with no wasted words, making it easy to scan.
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 no annotations and no output schema, the description covers the main call scenario and the important dev-client exception. It does not mention failure cases, which is a moderate gap, but the essential context for invoking the tool is present.
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 is empty, so there are zero parameters to document and schema coverage is trivially complete. With no parameters, the description correctly adds no parameter-specific semantics, and the baseline of 4 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 clearly states what the tool does: opens the app on the booted simulator. It also distinguishes itself from the sibling tool launch_app by calling out the Expo/React Native dev-client case, so an agent can separate roles without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'For a regular app, prefer launch_app,' giving the agent a direct routing rule. It also implies the favorable scenario for open_app — Expo/React Native dev clients — and where the tool fits relative to launch_app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_storybookOpen StorybookA
Open Storybook on the booted simulator, via a listening Metro server on port 8082 (unless SIM_STORYBOOK_URL is set).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden and does well by specifying the booted simulator requirement, the default port, and the SIM_STORYBOOK_URL environment override. It stops short of describing failure modes or return behavior, but that is acceptable for a zero-parameter open action.
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 dense sentence with no filler. Every clause adds useful information: target, environment, mechanism, port, and environment variable override.
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 no-parameter tool with no output schema, the description captures target, precondition, port, and configuration override, which is sufficient to invoke it correctly. It could mention what happens on success or if Metro is not running, but that is not essential for a simple open action.
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?
There are zero parameters and 100% schema description coverage, so the schema and description leave nothing ambiguous about arguments. The baseline of 4 applies because the tool requires no inputs.
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 clearly states the action ('Open'), target resource ('Storybook'), and environment ('booted simulator'), while adding the concrete mechanism of a Metro server on port 8082. This makes it readily distinguishable from sibling tools like open_app or open_url.
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 implies when to use the tool: when you need Storybook on a booted simulator via Metro. However, it does not explicitly contrast this with sibling tools such as open_app, open_url, or launch_app, leaving when-not-to-use guidance to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_urlOpen a URL / deep linkA
Open a URL on the booted simulator (e.g. an exp:// deep link or custom scheme).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It conveys the target scope (booted simulator) and the nature of the action (opening a URL), but it does not state what happens with an unhandled or malformed scheme, whether the handling app is launched as a side effect, or what a successful or failed invocation looks like.
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, focused sentence that immediately states the action and target before providing a usable example. It contains no filler, front-loads the essential information, and is appropriately sized for a one-parameter 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?
For a simple one-parameter action tool with no annotations and no output schema, the description covers the core behavior and precondition but leaves edge cases uncovered—invalid schemes, fallback behavior, and what the caller should expect afterward. It is adequate but not comprehensive.
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 0%, meaning the 'url' property is otherwise undocumented. The description adds real meaning by suggesting the expected format through examples like 'exp:// deep link or custom scheme'. This compensates somewhat, but it still leaves the full set of accepted schemes and any format restrictions unspecified.
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 plus resource ('Open a URL') with an explicit scope ('on the booted simulator') and grounding examples (exp:// deep link or custom scheme). This clearly distinguishes it from siblings such as launch_app, open_app, and open_storybook, which open applications rather than URLs.
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 the main use case through examples like exp:// deep links and custom schemes, and it hints at a precondition with 'booted simulator'. However, it never explicitly says when to prefer this tool over alternatives or names sibling tools as fallbacks, so the roadmap selecting between open_url and open_app/launch_app is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_homePress the home buttonA
Press the device Home button.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description is the only source of behavioral information. It accurately states the action but adds no context about consequences (e.g., navigating to the home screen, minimizing the current app) or whether it waits for the action to complete. This is adequate for a trivial action but lacks depth.
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 sentence, 'Press the device Home button,' with no wasted words. It is as concise as possible while still being clear and 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 tool with no parameters, no output schema, and no annotations, the description fully covers the operation. The action is simple and self-contained; nothing an agent needs to invoke it correctly 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?
The input schema is empty (0 parameters), so the description has no parameter burden. The baseline for 0 parameters is 4, and the description does not need to mention parameters.
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 ('Press') and resource ('device Home button'), clearly identifying the action. It does not explicitly differentiate from the sibling 'press_key', but the dedicated home-button scope is unambiguous.
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 alternatives like 'press_key' or 'tap'. The description provides no contextual conditions or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keyPress a keyA
Press a single HID key code. Common codes: 40 = Return/Enter, 42 = Backspace/Delete, 43 = Tab, 44 = Space, 41 = Escape, 4-29 = a-z, 30-38 = 1-9, 39 = 0.
| Name | Required | Description | Default |
|---|---|---|---|
| keyCode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that it presses a single HID key code, which implies a low-level input action. It doesn't mention whether the key press is a tap (down+up) or a hold, or whether it requires a device to be connected. However, the description is honest about what it does, and the key code list adds useful context. It doesn't contradict any annotations (none 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 two sentences: the first states the action, the second provides a compact, useful reference. No wasted words. The key code list is front-loaded and easy to scan.
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 one-parameter tool, the description is quite complete. It explains the parameter and gives common values. It doesn't mention return values (no output schema), but for a key press tool, the return is likely trivial. It could mention whether the key press is a tap or hold, but that's a minor gap. The sibling list shows this is part of a device control suite, and the description fits that context.
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 0%, so the description must compensate. It explains the keyCode parameter by providing a mapping of common codes to keys, which adds significant meaning beyond the bare integer type. It doesn't explain the full range or all possible codes, but it gives enough for common use cases. This is strong compensation for a single parameter.
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 clearly states the tool's function: 'Press a single HID key code.' It specifies the resource (HID key code) and the action (press), and the title reinforces it. It distinguishes from siblings like type_text (which types text) and tap (which touches the screen) by focusing on HID key codes.
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 provides a list of common key codes, which implicitly tells the agent when to use this tool (e.g., for Enter, Backspace, Tab, Space, Escape, letters, numbers). It doesn't explicitly state when not to use it or name alternatives, but the context of siblings like type_text and tap makes the usage context clear. The key code list is practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotTake a screenshot of the simulatorA
Capture the booted simulator screen as a PNG. Returns the image plus the saved file path, pixel dimensions, and logical (point) dimensions/scale so tap coordinates can be derived.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the disclosure burden. It clearly states capture behavior, PNG output, saved file path, pixel dimensions, and logical dimensions/scale. It does not mention failure behavior when no simulator is booted, but overall it is transparent about what the tool does and returns.
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 sentences with no filler: the first gives the action and output format, the second enumerates the returned data and explains why it is useful. The key information 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?
Given there is no output schema and no annotations, the description does well by enumerating the main return fields and connecting them to tap coordinates. Minor omissions are exact failure behavior and file lifecycle, but for a zero-parameter tool this is still largely complete.
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 has zero parameters, so a baseline of 4 applies. There is nothing additional the description needs to explain for invocation, and invoking without arguments is self-explanatory.
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 ('Capture') and resource ('booted simulator screen') plus the output format ('as a PNG'). It is clearly distinct from sibling tools like tap, get_accessibility_tree, or list_devices.
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 booted precondition and the coordinate-derivation motivation imply when to call it, but it does not name any alternative or exclusion. It never tells an agent when to prefer get_accessibility_tree or another inspection tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_orientationSet the device orientationA
Rotate the simulator to portrait, portraitUpsideDown, landscapeLeft or landscapeRight. Uses devicectl (the Device Hub toolchain) since simctl has no rotation support. Screenshots reflect the rotation, so tap coordinates change accordingly.
| Name | Required | Description | Default |
|---|---|---|---|
| orientation | Yes | target orientation |
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 discloses that screenshots reflect the rotation and that tap coordinates change accordingly, which is critical for an agent to understand downstream effects. It also explains the underlying toolchain. It does not mention prerequisites like booted simulator or potential errors, but the key behavioral consequence is well covered.
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 sentences with no wasted words. The action and values are front-loaded, followed by a relevant technical note and a practical consequence. The structure is tight and scannable.
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 one-parameter tool with no output schema, the description covers the core behavior and the important side effect on coordinates. It omits potential prerequisites like simulator boot status, but given the sibling tool set includes boot_device and the action is straightforward, the completeness is strong but not exhaustive.
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% with a clear enum description ('target orientation'). The description repeats the enum values but adds no new semantic meaning beyond what the schema already provides, so it meets the baseline of 3 but does not exceed it.
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 clearly states the verb (rotate) and resource (simulator) and enumerates the four possible values, making the action unambiguous. It distinguishes itself from the sibling get_orientation and other device tools by specifying the exact operation.
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 usage by naming the toolchain (devicectl) and noting why simctl isn't used, but it does not explicitly state when to choose this tool over alternatives or provide exclusion conditions. The presence of get_orientation as a sibling makes the read/write distinction obvious, but no direct guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shutdown_deviceShut down a simulatorA
Shut down a simulator by name or udid (defaults to the booted one).
| Name | Required | Description | Default |
|---|---|---|---|
| nameOrUdid | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It reveals that the tool targets a simulator optionally specified by name/udid and falls back to the booted one, but it does not mention side effects, error behavior for unknown names, or confirmation. The primary behavior is still clear enough for a simple shutdown command.
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?
One short sentence that immediately states the action, the target, and the default behavior. There is no filler or redundant information.
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 one-parameter tool with no output schema, the description covers the main call contract: what it does, how to select the target, and the default behavior. It could add error or response details, but those are unlikely to be essential for an agent to invoke it 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 schema provides only a bare string property with no description, so the phrase 'by name or udid (defaults to the booted one)' adds essential meaning and clarifies that the parameter is optional. This compensates well for 0% schema coverage, though it omits example formats.
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 action ('Shut down') and resource ('a simulator'), and clarifies selection by name, udid, or default to the booted one. It does not explicitly contrast with the sibling boot_device, but the intent is unambiguous.
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 says what the tool does but gives no guidance on when to use it over alternatives such as boot_device, nor does it mention prerequisites or exclusions. The default-to-booted note is selection behavior, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swipeSwipe between two pointsA
Swipe from (x1, y1) to (x2, y2) in POINTS.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | ||
| x2 | Yes | ||
| y1 | Yes | ||
| y2 | Yes | ||
| durationMs | No | swipe duration, default 300ms |
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 states the action and coordinates but does not mention side effects like scrolling, whether it requires the screen to be on, or how the duration parameter affects the gesture. It is not misleading, but it lacks depth beyond the basic mechanics.
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 sentence with zero redundancy. It front-loads the core action and coordinate context, making it easy to scan. It is appropriately concise for a simple 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?
For a basic gesture tool with no output schema and no annotations, the description covers the essential function and parameters. It lacks minor details like coordinate origin or duration default, but these are either common knowledge or provided in the schema for durationMs. Overall, an agent can correctly call this tool with the given information.
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 description embeds the four required parameters (x1, y1, x2, y2) in the action sentence, giving them context as start and end points. However, it does not explain the optional durationMs parameter or the coordinate system's origin (e.g., top-left corner). Given that schema coverage is only 20%, the description should compensate more, but the parameter names and sentence provide some clarity.
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 clearly states the action (swipe) and the resource (coordinates in points). It distinguishes from siblings like tap and tap_normalized by specifying a continuous gesture between two points, and the 'in POINTS' clarifies the coordinate system. This is specific and unambiguous.
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 the tool (when a swipe gesture is needed) but does not explicitly mention alternatives or exclusion criteria. It does not say 'use tap for discrete taps' or 'use tap_normalized for normalized coordinates,' so the agent must infer the appropriate choice from sibling names. No explicit when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tapTap a pointA
Tap at (x, y) in POINTS (logical coordinates — the same space as accessibility-tree frames).
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | x coordinate in points | |
| y | Yes | y coordinate in points |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the coordinate space and that it taps at a point, but doesn't mention whether the tap is a discrete event, whether it waits for UI to settle, or any side effects. The description is adequate but minimal for a simple input tool.
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?
One sentence, front-loaded with the action and coordinate space, and the parenthetical adds the critical frame-of-reference detail. Zero waste.
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 two-parameter tap tool, the description covers the essential context: coordinate space and its relationship to accessibility-tree frames. It doesn't describe return values, but no output schema exists and a tap typically returns nothing meaningful. The main gap is not naming tap_normalized as the alternative for normalized coordinates.
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%, so the schema already documents both parameters. The description adds the key context that coordinates are in POINTS and align with accessibility-tree frames, which is valuable beyond the schema's 'x coordinate in points'.
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 ('Tap') and resource ('at (x, y) in POINTS'), which clearly identifies the action. It distinguishes itself from the sibling tap_normalized by explicitly noting the coordinate space, though it doesn't name the sibling directly.
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 clarifies that coordinates are in POINTS and the same space as accessibility-tree frames, which is essential context for when to use this tool versus tap_normalized. It doesn't explicitly state when not to use it, but the coordinate-space clarification implies the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tap_normalizedTap a normalized pointA
Tap at a normalized position where (0,0) is the top-left and (1,1) the bottom-right of the screen. Useful when tapping from a screenshot without knowing the scale.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | fraction of screen width | |
| y | Yes | fraction of screen height |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It describes the normalized coordinate mapping, which is the main behavioral trait, but it doesn't mention possible side effects, device focus requirements, or error behaviors. For a simple tap, this is adequate but not rich.
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 sentences, front-loaded with the action and coordinate definition. Every phrase adds useful context, with 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?
For a tool with only 2 parameters and no output schema, the description plus schema gives the agent enough to call it correctly. Slightly incomplete in that it omits outcome/error expectations, but this is a very simple tap action.
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 already describes x and y as fractions of screen width/height; the description adds the valuable mapping of (0,0)=top-left, (1,1)=bottom-right and the screenshot-scaling motivation, meaning beyond the schema's min/max bounds.
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 clear verb and resource: taps at a normalized position. Defines the coordinate system explicitly and explains the scaling context, distinguishing it from the likely absolute-coordinate sibling 'tap'.
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?
Provides a clear context: 'useful when tapping from a screenshot without knowing the scale'. However, it does not explicitly name the alternative tool or say when not to use this one, so it lacks the full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terminate_appTerminate an appA
Terminate an app by bundle id on the booted simulator. Bundle id defaults to the only non-system app running in the simulator, else the only one installed; pass bundleId or set SIM_APP_BUNDLE_ID to override.
| Name | Required | Description | Default |
|---|---|---|---|
| bundleId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description itself must convey behavior. It discloses meaningful behavior beyond the name: the default selection logic (only running non-system app, else only installed app), the ability to override via bundleId or SIM_APP_ID, and the simulator environment. It does not describe failure modes when multiple apps match, but the defaulting logic is clearly stated.
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, information-dense sentence that front-loads the action and environment, then explains the parameter defaulting behavior. There is no filler or repetition.
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 one-parameter tool, the description gives enough context for an agent to invoke it correctly in common cases: target simulator, optional parameter, fallback behavior, and override mechanism. It could mention what happens when no app matches or when multiple apps are running, but this is a minor gap and not likely to block correct use in typical scenarios.
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 only defines 'bundleId' as a string with no description, so the tool description adds needed meaning. It explains that bundleId is optional from the agent's perspective when defaults apply)Skip and that it can also come from an environment variable. The format of a bundle id is not elaborated, but the meaning and optionality are clear.
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 ('terminate') and a clear object ('an app by bundle id on the booted simulator'), so the tool's function is unambiguous. It is distinct from sibling tools like launch_app, open_url, or shutdown_device because it performs a shutdown of an app process.
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 clear operating context: it targets apps on the booted simulator and explains the bundleId default behavior, including the fallback from running apps to installed apps. It does not explicitly contrast with alternatives, but the usage context is strong enough to guide the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toggle_appearanceToggle light/dark modeA
Set the simulator appearance to dark or light.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the core effect (appearance changes to dark or light) but does not mention whether the setting persists across launches, affects all apps on the simulator, or requires a running simulator. Minimal transparency is present, but richer behavioral context is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single declarative sentence with no filler. It front-loads the action and includes the acceptable values, making it maximally efficient.
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 tool with one enum-only parameter, no output schema, and no annotations, the description covers the essential calling contract: what it does and what the parameter accepts. It omits usage conditions and persistence info, but the tool is simple enough that the included information is close to sufficient.
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 must compensate. The text maps the single mode parameter directly to 'dark or light,' which clarifies the semantic effect of the enum values. The main gap is that it doesn't state which value is default or how the mode relates to a system-level setting; otherwise, the parameter meaning is well conveyed.
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/resource pair — 'Set the simulator appearance to dark or light' — which clearly conveys the tool's purpose. None of the sibling tools address appearance, so it is immediately distinguishable without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives, no prerequisites (e.g., a booted simulator), and no exclusionary conditions. There are no sibling tools that compete directly, but the description doesn't mention that it applies only to a running simulator or that it overrides the user's settings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textType textA
Type text into the focused field on the simulator.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations provided, so the description must carry the full transparency burden, but it only states the primary action. It doesn't disclose whether text is appended or replaced, what happens if no field is focused, or if any special characters are supported.
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?
One sentence, exactly as concise as the tool needs. Every word earns its place and it entirely avoids redundant or technical fluff.
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 tool with a single parameter, no output schema, and no nested complexity, this description materially cover: main function, target verb, and target resource. It doesn't include all edge-case behavior, but the core context is present and sufficient.
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?
With 0% schema description coverage, the description compensates by making it clear that the text parameter is the content to be typed. It does not add further detail like length limits, newline handling, or whether the text is sent as-is.
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 ('type') and resource ('text into the focused field on the simulator'), which is clear and unambiguous. It is also distinguishable from siblings like press_key and tap, which serve different functions, even though it doesn't name them 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?
The description clearly implies a usage condition: the target must already be focused. However, it gives no explicit guidance about when to prefer this tool over alternatives, nor does it mention required preconditions like focusing a field first.
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.
19 tool updates
v1.0.0- First observed
boot_device - First observed
get_accessibility_tree - First observed
get_orientation - First observed
launch_app - First observed
list_devices - First observed
open_app - First observed
open_storybook - First observed
open_url - First observed
press_home - First observed
press_key - First observed
screenshot - First observed
set_orientation - First observed
shutdown_device - First observed
swipe - First observed
tap - First observed
tap_normalized - First observed
terminate_app - First observed
toggle_appearance - First observed
type_text
TDQS
Scored across 19 tools
Each tool has a clear, distinct purpose: device management, app lifecycle, input events, and UI inspection are cleanly separated. Even overlapping tools like open_app vs launch_app are explicitly differentiated by their description.
All tool names follow a consistent verb_noun pattern in snake_case, such as boot_device, tap_normalized, and toggle_appearance. This makes the API predictable and easy to navigate.
With 19 tools, the set is on the heavier side for a simulator control server. While each tool serves a specific function, the count falls into the 16-25 range that feels somewhat bloated compared to typical MCP servers.
The tool surface covers core simulator operations: device management, app launching/termination, input simulation, screenshots, accessibility tree, and orientation/appearance control. Missing operations like installing apps or simulating location are notable but not critical for basic UI automation workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
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.
Build, run, and inspect iOS apps in disposable hosted Simulators from cloud coding agents.
Drive real Android & iOS devices and web browsers from natural language for mobile + web QA. 290+ tools across device control, app management, automation sessions, browser automation, and flow recording / replay. Bearer-auth — get a token at robotactions.com → Profile → API Tokens.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables interaction with iOS simulators by providing tools to inspect UI elements, control UI interactions, and manage simulators through natural language commands.174,5062,168MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to automate iOS Simulator interactions including device management, UI element interaction (tap, swipe, type), screenshot capture, and execution of YAML-defined navigation workflows.3MIT
- AlicenseNot gradedqualityFmaintenanceEnables AI agents to control real iPhones and simulators on macOS, allowing for UI interaction, testing, and automation.7587MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to control iOS simulators through WebDriverAgent, supporting taps, swipes, typing, screenshots, recording, and app actions with a real-time dashboard for visual feedback.Apache 2.0