ios-agent-driver
The ios-agent-driver server lets an AI agent programmatically control and interact with the iOS Simulator, enabling automated app testing and UI-driven workflows through a perceive → decide → act → observe loop.
Simulator Lifecycle Management
List simulators: View all available devices with their UDID, name, state, and runtime.
Boot a simulator: Start a simulator by UDID, or default to the already-booted/first available iPhone.
Install, launch, terminate, and reset apps: Manage app lifecycle by bundle ID; reset uninstalls and reinstalls for a clean state.
Navigation & Permissions
Open deep links: Navigate directly to a specific screen via URL or universal link.
Set permissions: Grant, revoke, or reset privacy permissions (photos, camera, location, notifications, contacts, microphone, etc.).
UI Perception
Describe the UI (
describe_ui): Retrieve the full accessibility tree of the current screen as structured JSON (labels, types, values, enabled state, frames) — the primary way the agent reads the screen.Take a screenshot: Capture a PNG of the current screen as a visual fallback for custom-drawn views or general state verification.
UI Interaction
Tap: Tap a UI element by accessibility label (preferred) or by raw x,y coordinates; missing labels report nearest available labels instead of failing silently.
Type text: Enter text into the currently focused input field.
Swipe: Scroll or swipe by direction (up/down/left/right) or explicit from/to coordinates.
Press hardware buttons: Simulate HOME, LOCK, SIDE_BUTTON, SIRI, or APPLE_PAY presses.
Allows an AI agent to control the iOS Simulator, performing actions such as tapping, typing, swiping, and reading the accessibility tree to test iOS apps programmatically.
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-agent-driverOpen Settings and confirm Notifications is enabled"
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-agent-driver
An MCP server that lets an AI agent drive the iOS Simulator in a loop — so an agent can actually use your app: tap, type, swipe, read the screen, and verify what happened.
It bridges the gap between iOS development and agentic testing. The primitives to
control a simulator exist (xcrun simctl, Meta's idb), but
nothing packages them into tools an agent can call to close the
perceive → decide → act → observe loop. This does.
Accessibility-tree-first perception. The agent reasons over labeled UI elements (
describe_ui) and taps by label, not by guessing pixel coordinates — far more robust to layout changes.Screenshot fallback. For custom-drawn views that don't expose accessibility,
screenshotgives a vision fallback and a way to verify state.Loud failures. A tap on a missing label returns the nearest labels on screen, not a silent no-op.
How it works
Agent (Claude / any MCP client)
goal: "log a leg workout, confirm it appears in History"
observe → decide → act → observe (loop)
│ MCP (stdio)
ios-agent-driver
│ │
xcrun simctl idb (+ companion)
lifecycle, screenshots accessibility tree,
deeplinks, permissions tap / type / swipe by elementRelated MCP server: app-screen-mcp
Requirements
macOS with Xcode (provides
xcrun simctl)idb for UI perception and actions:
brew tap facebook/fb && brew trust facebook/fb brew install facebook/fb/idb-companion # source build — needs current Xcode Command Line Tools pip3 install fb-idb # the `idb` CLI; use pipx/venv if pip is externally-managed idb list-targets # confirm it sees your booted simIf the companion build errors with “Command Line Tools are too outdated”, update them (System Settings › Software Update, or
xcode-select --install). Lifecycle tools work without idb;describe_ui/tap/type_text/swiperequire it and will tell you how to install it if it's missing.Node.js ≥ 18
Install
git clone https://github.com/CodeJonesW/ios-agent-driver.git
cd ios-agent-driver
npm install # builds via the prepare scriptRegister with Claude Code
Add to your MCP config (user-level ~/.claude.json, or a project .mcp.json):
{
"mcpServers": {
"ios-agent-driver": {
"command": "node",
"args": ["/absolute/path/to/ios-agent-driver/dist/server.js"]
}
}
}Or with the Claude Code CLI:
claude mcp add ios-agent-driver -- node /absolute/path/to/ios-agent-driver/dist/server.jsTools
Tool | Backend | Purpose |
| simctl | List devices (udid, name, state, runtime). |
| simctl | Boot a sim (defaults to booted, else first iPhone). |
| simctl | Install a built |
| simctl | Launch an app by bundle id. |
| simctl | Terminate a running app. |
| simctl | Uninstall + reinstall for a clean state. |
| simctl | Open a URL / universal link. |
| simctl | Grant/revoke/reset a privacy permission. |
| idb | Primary perception — accessibility tree as JSON. |
| simctl | PNG of the current screen (vision fallback). |
| idb | Tap by accessibility label (preferred) or x,y. |
| idb | Type into the focused field. |
| idb | Swipe/scroll by direction or coordinates. |
| idb | Hardware buttons (HOME, LOCK, …). |
The loop, by example
A typical agent goal runs as a bounded loop:
GOAL: "open Settings and confirm Notifications is enabled"
1. boot_sim
2. launch { bundle_id: "com.apple.Preferences" }
3. describe_ui → see "Notifications" cell
4. tap { label: "Notifications" }
5. describe_ui → assert the toggle state
(re-read after each action; stop when the goal predicate holds
or a step budget is exhausted)The agent owns the loop and the success predicate; this server provides the primitives. That keeps the tool simple and the test logic where it belongs.
Development
npm run build # compile TypeScript → dist/
npm start # run the server on stdioLicense
MIT © Will Jones (CodeJonesW)
Available Tools
14 toolsboot_simB
Boot a simulator. Defaults to the already-booted sim, else the first available iPhone.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It does not disclose whether it waits for boot completion, what happens if the simulator is already booted, or any side effects. The behavioral transparency is minimal.
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 extremely concise with two sentences, no redundant information, and front-loaded with the action. 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 tool with one optional parameter and no output schema, the description covers the basic purpose and default behavior. However, it lacks details on error conditions, prerequisites, or the state after booting, making it minimally 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 100%, and the description adds no new information beyond what is in the schema for the single parameter. Baseline is 3, as the description does not enhance understanding of the 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 verb 'Boot' and resource 'simulator', and provides default behavior. It distinguishes from sibling tools like 'launch' which target apps. However, it could be more specific about the exact action of booting a simulator.
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 context by stating the default selection behavior, but does not explicitly say when not to use this tool or mention alternatives. It implicitly suggests use when wanting to start a simulator, but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deeplinkB
Open a URL / universal link in the simulator (jump straight to a screen).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. It describes the action but lacks details on side effects, prerequisites (e.g., simulator must be booted, implied by udid parameter), error handling, or whether it works only within an app or opens Safari. Adequate but not comprehensive.
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 is concise and front-loaded with the action. No unnecessary words. However, could be structured to include a brief usage note or prerequisite without sacrificing conciseness.
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 tool with 2 params and no output schema, the description covers the basic purpose but omits important context like expected URL format, behavior when simulator is missing or URL is invalid, and what happens after opening (e.g., app changes). Enough for basic understanding but not fully complete for error-free invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (only udid described). The tool description adds meaning to 'url' by stating it's a URL/link, but does not specify format or supported schemes. For 'udid', schema already describes it well; description adds nothing extra. Overall, compensates somewhat but could be more precise.
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?
Description clearly states 'Open a URL / universal link in the simulator', specifying a distinct action from sibling tools like 'launch' or 'tap'. The verb 'open' and resource 'URL/link' are 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?
No guidance on when to use this tool versus alternatives, no when-not-to-use conditions, and no mention of prerequisites like booted simulator. The description only states what it does, not when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_uiA
PRIMARY PERCEPTION. Return the accessibility tree of the current screen as a list of elements (label, type, value, enabled, frame). Reason over this and tap by label.
| Name | Required | Description | Default |
|---|---|---|---|
| interactive_only | No | If true, return only elements that have a label. | |
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It states the output format (label, type, value, enabled, frame) but lacks details on behavior like error handling, performance, or prerequisites (e.g., foreground app needed).
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 'PRIMARY PERCEPTION' for emphasis. The structure is clean and efficient, though it could be slightly more organized.
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 and simple parameters, the description adequately explains what is returned. However, it omits context about error conditions or prerequisites. The sibling tools list provides useful 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 100%, so baseline is 3. The description does not mention or elaborate on the parameters (interactive_only, udid); it relies entirely on the schema for their meaning.
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 that the tool returns the accessibility tree as a list of elements, which is a specific verb+resource. It distinguishes itself from sibling tools (tap, swipe, etc.) by focusing on perception rather than actions.
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 includes 'Reason over this and tap by label,' implying that the tool is used to gather information before performing a tap. However, it does not explicitly exclude other uses or provide conditions for when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
install_appB
Install a built .app bundle onto the simulator.
| Name | Required | Description | Default |
|---|---|---|---|
| app_path | Yes | Absolute path to the .app bundle. | |
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description does not disclose behavioral traits like overwrite behavior, dependency on booted simulator, or failure modes. Only states the 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?
Single, focused sentence with no unnecessary words. Effective and 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?
Given no output schema and sibling tools, description lacks essential context like prerequisites (simulator must be booted) and post-install steps (use 'launch'). Not complete for a deployment tool.
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 clear parameter descriptions. The description adds minimal but confirms the context of .app bundle and simulator, which is already implied by 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?
Description clearly states the verb 'install' and the resource 'built .app bundle onto the simulator'. It distinguishes from sibling tools like boot_sim, launch, etc.
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 on when to use vs alternatives, no prerequisites or exclusions. Agent may not know that simulator must be booted or that 'launch' is separate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launchA
Launch an installed app by bundle id. Returns the launch output (pid).
| Name | Required | Description | Default |
|---|---|---|---|
| bundle_id | Yes | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must cover behavior. It mentions returning the pid but omits side effects (e.g., app entering foreground, state changes) and error conditions (e.g., app not found).
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 action and resource, no wasted words. Efficient and clear.
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?
Adequate for a simple tool with two parameters, but lacks context on preconditions (e.g., simulator must be booted, app must be installed) and failure modes. Output schema is absent, but return value is mentioned.
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?
Description adds minimal extra meaning beyond schema: 'bundle id' is identified as app identifier. The udid's default behavior is explained. With only 50% schema coverage, the description partially compensates but does not fully detail parameter constraints.
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?
Clearly states the action ('launch'), resource ('installed app by bundle id'), and output ('pid'). Distinguishes from siblings like 'install_app' and 'deeplink' by specifying the launch mechanism.
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?
Implies the app must be installed first but does not explicitly guide when to use this tool versus alternatives. No mention of prerequisites like a booted simulator.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_simsA
List available simulator devices (udid, name, state, runtime).
| 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 full burden. It discloses that the tool lists devices returning udid, name, state, runtime. It does not explicitly state that the operation is read-only or non-destructive, but given the nature of listing, it is likely safe. Missing details on scope (e.g., all simulators) prevent a higher score.
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, clear sentence that directly states the tool's function and output fields. No unnecessary words, and it is front-loaded with the verb 'List'. Perfect conciseness.
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 the tool has no parameters, no output schema, and is a simple listing operation, the description is mostly complete. It explains what is returned (udid, name, state, runtime). A higher score would require mention of whether all simulators are returned or only those meeting certain criteria, but it is sufficient for a basic listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters with 100% description coverage (empty description). The description adds no parameter details, but since there are none to explain, the baseline is 4. The tool's simplicity means no further parameter semantics are needed.
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 purpose: 'List available simulator devices'. It specifies the exact fields returned (udid, name, state, runtime), which is a specific verb+resource. It distinguishes itself from sibling tools like boot_sim or install_app by focusing on listing, not manipulation.
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: use this to see available simulators. However, there is no explicit guidance on when to use this versus other tools, such as when you need to boot a sim. Since the tool is straightforward with zero parameters, the lack of explicit guidelines is acceptable but not ideal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_buttonC
Press a hardware button (HOME backgrounds the app; LOCK locks the screen).
| Name | Required | Description | Default |
|---|---|---|---|
| button | Yes | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It explains effects for HOME and LOCK but omits behavior for SIDE_BUTTON, SIRI, and APPLE_PAY. No mention of whether these actions are reversible or require special permissions.
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 sentence that is concise and front-loaded. However, it could be expanded to cover all button options without becoming overly verbose.
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 the tool has 5 enum values and no output schema or annotations, the description is incomplete. It only partially explains effects and lacks details on return values or side effects.
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 50% (only udid described). The description adds meaning for two button enum values (HOME and LOCK) but not the other three. It provides some value beyond the schema but does not fully compensate.
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 presses a hardware button and gives specific examples for HOME and LOCK. While it doesn't explicitly distinguish from sibling tools like tap or swipe, the verb 'press' and reference to 'hardware button' make the purpose reasonably clear.
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 on when to use this tool versus alternatives like tap or deeplink. No mention of prerequisites or context, 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.
reset_appC
Uninstall then reinstall an app for a clean state.
| Name | Required | Description | Default |
|---|---|---|---|
| bundle_id | Yes | ||
| app_path | Yes | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It states the tool does uninstall then reinstall, which is destructive, but does not mention side effects like data loss, permission resets, or prerequisites.
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 unnecessary words. It is front-loaded and 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?
Given the tool's destructive nature (reset) and lack of annotations or output schema, the description is incomplete. It does not explain what 'clean state' entails, return values, or behavioral details beyond the basic 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?
Only 1 of 3 parameters (udid) has a description in the schema, and the tool description does not add meaning for bundle_id or app_path. The description's 'uninstall then reinstall' does not clarify parameter usage.
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: uninstall then reinstall an app for a clean state. It distinguishes from similar tools like install_app (which only installs) and terminate (only stops), though not 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 explicit guidance on when to use this tool versus alternatives like install_app or terminate. The phrase 'for a clean state' implies a use case but lacks comparison or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotA
Capture a PNG screenshot of the current screen. Use as the vision fallback when an element is not exposed in the accessibility tree, or to verify state.
| Name | Required | Description | Default |
|---|---|---|---|
| udid | No | Target simulator UDID. Defaults to the booted sim. |
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 correctly indicates it captures a PNG screenshot, but it does not disclose the return format (e.g., base64 string, binary, file path) or any side effects. This is a notable gap for an output-less schema 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?
The description is two sentences long with no filler. Every word adds value, providing both the action and usage context efficiently.
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 tool with one optional parameter and no output schema, the description covers purpose, usage, and parameter. The only missing detail is the return format, but it is a minor gap given the tool's simplicity.
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 only parameter (udid) has 100% schema coverage, and the description adds no additional meaning beyond what the schema already provides. Baseline score of 3 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 clearly states the action ('Capture a PNG screenshot') and the resource ('current screen'). It distinguishes this tool from siblings like describe_ui (accessibility tree) and tap/swipe (interaction).
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 explicit usage context: 'Use as the vision fallback when an element is not exposed in the accessibility tree, or to verify state.' This tells the agent when to use the tool, though it does not name specific alternative tools or explicitly state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_permissionB
Grant/revoke/reset a privacy permission for an app (e.g. photos, camera, location, notifications).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| service | Yes | e.g. all, photos, camera, location, notifications, contacts, microphone | |
| bundle_id | Yes | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description does not disclose side effects, whether changes are immediate, scope of reset, or error states. Does not clarify behavior when app is not installed.
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, clear and front-loaded. No redundant information, though could expand slightly without 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?
Missing context about simulator environment (udid), return behavior, and implications of changes. For a tool with 4 parameters and no output schema, description is too sparse.
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 50%. Description adds example services (photos, camera) already in schema. No extra meaning for bundle_id or udid beyond schema. Acceptable but not compensative.
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 grants, revokes, or resets privacy permissions for apps, listing example services. It uses specific verbs and distinguishes from sibling tools like deeplink or install_app.
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 on when to use grant vs revoke vs reset, or prerequisites for the app or simulator. Does not mention alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swipeA
Swipe/scroll from one point to another. Either give a direction (auto-computed from screen center) or explicit from/to coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | ||
| from_x | No | ||
| from_y | No | ||
| to_x | No | ||
| to_y | No | ||
| duration_sec | No | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility for behavioral disclosure. It reveals that direction auto-computes from screen center, but does not mention duration behavior, return values, or whether the action 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?
Two concise sentences that front-load the core action and explain the two usage modes. No redundant words; every sentence 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?
The description covers the two main swipe modes but does not explain the duration_sec parameter or return behavior. Given no output schema and no annotations, some gaps remain for a complete understanding.
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 low (14%). The description adds meaning by explaining the relationship between direction and from/to coordinates, but omits details about duration_sec and udid (though udid has schema description).
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 performs a swipe/scroll gesture, distinguishing between direction-based (auto-computed from screen center) and explicit coordinate-based modes. This separates it from sibling tools like tap or press_button.
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 specifies when to use direction vs explicit coordinates, providing clear context for usage. However, it does not explicitly compare to alternatives like tap for single-point gestures or press_button for long presses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tapA
Tap an element by accessibility label (preferred) or by raw x,y coordinate (fallback). Provide either label or both x and y.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Accessibility label to match (exact, then case-insensitive, then substring). | |
| x | No | ||
| y | No | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It mentions the matching order for label (exact, case-insensitive, substring) but does not describe side effects, error handling (e.g., element not found, out-of-bounds coordinates), or the nature of the interaction beyond 'tap'.
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 that are front-loaded with the core purpose and provide essential parameter guidance without extraneous information. Every sentence is necessary and well-structured.
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 action tool with no output schema and four parameters, the description is largely sufficient. It covers the main usage scenarios and parameter constraints. Minor gaps include not explaining the return value or failure modes, but these are less critical for a 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?
The description adds value beyond the schema by clarifying the mutual exclusivity of label vs x/y and the preferred/fallback order. The schema covers 50% of parameters with descriptions (label and udid), and the description compensates for the undocumented x and y by stating they must be used together.
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 taps an element, specifying two methods: by accessibility label (preferred) or by raw x,y coordinate (fallback). It distinguishes from sibling tools like press_button, swipe, and type_text which are different interactions.
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 tells when to use each method ('preferred' vs 'fallback') and that either label or both x and y should be provided. However, it does not explicitly state when not to use this tool or compare it to alternatives like press_button.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terminateC
Terminate a running app by bundle id.
| Name | Required | Description | Default |
|---|---|---|---|
| bundle_id | Yes | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states 'terminate a running app' without explaining effects (e.g., process termination, cleanup actions, error behavior if app not found).
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 redundancy. However, it is borderline under-specified; a slightly longer description with key behavioral details would improve without losing conciseness.
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 annotations, no output schema, and minimal param descriptions, the description fails to cover essential context such as return values, error conditions, or what happens when the app is already terminated. It is not complete enough for a tool with two parameters.
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 50% (only udid has a description). The description adds no extra meaning beyond the schema; it does not explain what a bundle_id is or how the udid default works in detail.
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 ('terminate'), the resource ('running app'), and the identifier ('by bundle id'). It distinguishes the tool from siblings like launch or install_app.
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 on when to use this tool versus alternatives. For example, it does not mention when not to use it (e.g., if the app is already terminated) or note that reset_app might be an alternative for clearing app state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textB
Type text into the currently focused field. Tap the field first to focus it.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| udid | No | Target simulator UDID. Defaults to the booted sim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions the need for focus but does not describe what happens if the field is not focused, how text is input (e.g., character-by-character, paste), or any error handling. This is minimal disclosure.
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 extremely concise with two sentences, front-loading the primary action. Every word serves a purpose without redundancy.
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 the tool's simplicity and the presence of an input schema, the description covers the core action and a key precondition. However, it lacks details on behavior in edge cases (e.g., unfocused field, special characters) and does not explain return values or udid defaults beyond what the schema provides.
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 only indirectly references the 'text' parameter by stating 'Type text'. The 'udid' parameter is not mentioned at all. Since schema description coverage is 50% and the tool description adds no additional meaning beyond the schema, it provides insufficient parameter context.
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 ('Type text') and the target resource ('currently focused field'). It distinguishes the tool from siblings like tap or swipe by specifying text input into a focused field.
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 precondition ('Tap the field first to focus it'), which offers implicit guidance on when to use this tool in sequence. However, it does not explicitly state when to use this tool over alternatives or when not to use it.
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. Dates show when Glama detected each change.
14 tool updates
v0.1.0- First observed
boot_sim - First observed
deeplink - First observed
describe_ui - First observed
install_app - First observed
launch - First observed
list_sims - First observed
press_button - First observed
reset_app - First observed
screenshot - First observed
set_permission - First observed
swipe - First observed
tap - First observed
terminate - First observed
type_text
TDQS
Each tool has a clearly distinct purpose: simulator management (boot_sim, list_sims), app lifecycle (install_app, launch, terminate, reset_app), interaction (tap, swipe, type_text, press_button), perception (describe_ui, screenshot), and configuration (set_permission, deeplink). No two tools overlap in functionality.
All tool names follow a consistent lowercase underscore convention (snake_case) with imperative verbs (e.g., boot_sim, install_app, describe_ui). The pattern is uniform across all 14 tools, enhancing predictability.
14 tools is well-scoped for an iOS simulator driver, covering essential operations: setup, app management, interaction, perception, and configuration. The count is neither excessive nor insufficient for the domain.
The toolset covers core simulator workflows: app install/launch/terminate/reset, UI interaction (tap, swipe, type), perception (accessibility tree, screenshot), and permissions. Minor gaps exist (e.g., no dedicated uninstall or app state query), but agents can work around them.
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.
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Give your AI agent a memory and body on your iPhone: set alarms, ring your phone, over MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA MCP server that enables LLMs to interact with iOS simulators through natural language commands.309Apache 2.0
- AlicenseBqualityDmaintenanceAn MCP server for reliable iOS Simulator automation that enables agents to control devices, read accessibility UI trees, and capture screenshots. It supports deterministic grounded actions like tapping, typing, and swiping to create a closed-loop observe-reason-act cycle.15141MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that lets AI agents control iOS and Android devices (tap, scroll, type, take screenshots, read UI trees, and run code). Works with multiple devices at the same time.12344MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for iOS Simulator automation. Enables AI assistants to visually interact with iOS apps running in the simulator.411MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/CodeJonesW/ios-agent-driver'
If you have feedback or need assistance with the MCP directory API, please join our Discord server