Skip to main content
Glama
conorluddy

XC-MCP: XCode CLI wrapper

by conorluddy

XC-MCP

npm version npm downloads codecov License: MIT

An MCP server that lets AI agents build, run and drive iOS apps — without drowning in Xcode's output.

XC-MCP wraps xcodebuild, simctl and idb as 77 tools. Its job is not just to expose those commands but to make their output fit in a model's context: summaries first, full detail on demand, and the accessibility tree instead of screenshots wherever the app allows it.


Why it exists

Xcode tooling produces output at a scale no context window survives. Measured against a real app (Grapla, Xcode 27, iPhone 17 Pro simulator):

Operation

Raw output

XC-MCP response

Reduction

One incremental xcodebuild build

1.67 MB · ~419,000 tokens

1.1 KB · ~285 tokens

~1,470×

xcrun simctl list --json

131 KB · ~32,800 tokens

1.5 KB · ~370 tokens

~90×

One crash report (.ips)

10.7 KB

1.4 KB summary

~7.5×

A single raw build log would overflow a 200k-token context on its own. The full output is never thrown away: it is cached and returned as an MCP resource link, so an agent can drill into the exact errors it needs.


Related MCP server: mcp-compressor

Quick start

Claude Code:

claude mcp add xc-mcp -- npx -y xc-mcp

Codex CLI:

codex mcp add xc-mcp -- npx -y xc-mcp

or add it to ~/.codex/config.toml directly:

[mcp_servers.xc-mcp]
command = "npx"
args = ["-y", "xc-mcp"]

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "xc-mcp": { "command": "npx", "args": ["-y", "xc-mcp"] }
  }
}

Then ask your agent to build and run your app. rtfm({}) lists the tool categories.


Requirements

Requirement

Version

Needed for

macOS

13+

everything

Node.js

20+ (CI tests 22 and 24)

running the server

Xcode + Command Line Tools

15+ (26+ for iOS 26/27 simulators)

xcodebuild, simctl

idb CLI + companion

1.5.1+

every idb-* tool: tapping, typing, accessibility

xcode-select --install

# idb — required for all UI automation
brew tap facebook/fb
brew install facebook/fb/idb-companion facebook/fb/idb-cli

brew install idb-companion no longer works — it moved from Homebrew core to Meta's facebook/fb tap.

Run idb-doctor whenever UI automation misbehaves. It checks the CLI, the companion version, the Xcode framework layout, and stale companion registrations.

Xcode 27

idb-companion must be 1.5.1 or newer. Xcode 27 moved SimulatorKit.framework, and older companions fail silently: the accessibility tree reads correctly and every tap reports success, while the simulator discards the events. idb-ui-tap, idb-ui-gesture and idb-ui-input detect this and refuse to run rather than pretend.

brew upgrade facebook/fb/idb-companion
brew list --versions idb-companion   # expect >= 1.5.1
  • There is no Simulator.app — Xcode 27 replaced it with DeviceHub.app. simctl-boot with openGui opens whichever this Xcode ships.

  • If every idb call fails with Connection refused, a dead companion is still registered in /tmp/idb/state. Run idb disconnect <udid>; idb-doctor detects this.


How it works

Summaries first, detail on demand

Tools that produce large output return a summary plus an ID. The full output stays in a 30-minute cache and is exposed two ways: an MCP resource at xcmcp://response/{id}, and the matching *-get-details tool for clients without resource support.

xcodebuild-build({ projectPath: "./MyApp.xcodeproj", scheme: "MyApp" })
// → { buildId, success: false, errorCount: 3, warningCount: 1, durationMs: 18000 }

xcodebuild-get-details({ buildId, detailType: "errors-only" })
// → the three errors, not the 419k-token log

The accessibility tree before screenshots

For UI automation, reading the accessibility tree is cheaper and faster than sending an image, and it gives exact coordinates instead of visual estimates. Measured on the same screen:

Approach

Response

Latency

idb-ui-find-element

~450 tokens of JSON

~270 ms

screenshot (half size)

~22.5 KB image

~1,700 ms

The first idb call in a session takes several seconds while the target cache warms.

This only works when the app is accessible — which is the point. An app VoiceOver can navigate is an app an agent can navigate. accessibility-quality-check says which path to take; accessibility-audit says what to fix.

idb-ui-find-element({ query: "Sign In" })
// → { centerX: 201, centerY: 572, visible: true }

idb-ui-tap({ x: 201, y: 572 })

Coordinates are not always tappable. The tree reports frames in scrolled-content space, so an element can sit below the fold. Every match carries visible and, when off-screen, an offscreenReason naming the gesture that brings it into view.

Tools that declare their risk

Every tool carries MCP annotations — readOnlyHint, destructiveHint, idempotentHint — so a client can ask before running simctl-erase, idb-crash-delete or idb-clear-keychain, and run simctl-list freely. Build, test, audit and crash tools also declare an outputSchema and return validated structuredContent.


Tools

77 tools. TOOL_SIGNATURES.md indexes every tool with its annotations; parameters come from the server itself via rtfm({ toolName: "..." }).

Area

Tools

Build & test

xcodebuild-build, -test, -clean, -list, -version, -showsdks, -get-details, -inspect-scheme, -validate-capabilities

Simulators

simctl-list, -get-details, -suggest, -health-check, -boot, -shutdown, -create, -delete, -erase, -clone, -rename

Apps

simctl-install, -uninstall, -launch, -terminate, -openurl, -get-app-container, -container

UI automation

idb-ui-describe, -find-element, -tap, -input, -gesture, idb-targets, idb-list-apps, idb-install, -uninstall, -launch, -terminate

Accessibility

accessibility-quality-check, accessibility-audit

Diagnostics

idb-doctor, idb-crash-list, -show, -delete, hang-start, -stop, -get-details, -list

Test setup

simctl-privacy, -push, -pbcopy, -addmedia, -status-bar, -stream-logs, -appearance, -location, idb-simulate-memory-warning, idb-clear-keychain, idb-xctest-list

Capture & analysis

screenshot, simctl-io, visual-diff, localization-audit, xcode-model-inspect

Workflows

workflow-build-and-run, workflow-fresh-install, workflow-tap-element, test-record-step, test-record-report

Cache & docs

cache-get-stats, -get-config, -set-config, -clear, persistence-enable, -disable, -status, rtfm


Configuration

Flag

Effect

--mini, -m

One-line tool descriptions; rtfm supplies the detail

--build-only, -b

Registers 18 build-focused tools instead of 77

Flags combine: ["-y", "xc-mcp", "--mini", "--build-only"] — the same args array works in Claude Desktop and Codex's config.toml. Both matter mainly for clients that load every tool description upfront; see the history below.

Environment variable

Default

Controls

XC_MCP_CACHE_DIR

~/.xc-mcp (honours XDG_CACHE_HOME)

Disk persistence for caches

XC_MCP_HANG_DIR

~/.xc-mcp/hang-sessions

HangBuster capture sessions

XC_MCP_RECORDINGS_DIR

~/.xc-mcp/test-recordings

Test recording reports


How context cost shaped this server

XC-MCP has been rebuilt three times, and each rebuild answered the same question — what does a tool cost in context? — differently, because the answer kept changing underneath it. The tool count went 51 → 28 → 77, and each time the right number was set by what clients and the protocol could do.

v1 · Aug 2025 — 51 tools, every description paid upfront

MCP clients of the time loaded every tool's name, description and input schema when they connected, and kept them in context for the whole session. Tool count was a tax on context, paid before the agent did any work.

v1.3.2 cut the tax per tool: descriptions shrank to a few words and the real documentation moved behind rtfm, fetched only when asked for. A separate, smaller xc-mini-mcp package was also published — and reverted shortly after.

v2 · Nov 2025 — 28 tools, consolidated into routers

If the count is the tax, cut the count. v2 folded 21 tools into six operation-enum routers — simctl-device({ operation: "boot" }) instead of simctl-boot — sharing one schema per router.

That bought a debt nobody could see yet. A router is a single tool, so it carries a single description and a single set of properties for every operation behind it. That cost nothing while tools had no per-tool properties worth losing.

v3 · Nov 2025 — betting on deferred loading

v3 set defer_loading: true on every tool, expecting tools to load on demand and baseline cost to fall toward zero. The goal was right; the mechanism could not work.

defer_loading is a field of the Messages API. It belongs on tool definitions sent to the model, alongside the tool-search server tools, and an MCP server has no way to set it. The MCP SDK also drops unrecognised keys from a tool's registration, so the flag never reached a client — a live tools/list later showed 0 of 77 tools carrying it.

Deferral did arrive, on the client side. Clients with tool search, Claude Code among them, began listing only tool names at startup and fetching a tool's schema when it is first used. No server flag was involved.

v4 · Jun 2026 — 70 tools, routers dissolved

Two developments reversed the v2 trade-off.

  • Client-side tool search made tool count cheap. With schemas deferred, 77 tools cost roughly what their names cost — about 1,240 tokens at startup, server instructions included.

  • The protocol gained per-tool metadata. Revision 2025-03-26 added tool annotations (#185). Revision 2025-06-18 added structured tool output (#371), resource links in tool results (#603), and a human-readable title (#663).

Annotations are precisely what a router cannot express. simctl-device hid both boot, which is harmless, and erase, which destroys a simulator, behind one tool — so no client could tell them apart. The routers were dissolved into discrete tools that each declare their own risk and output shape, and resource links replaced ad-hoc cache IDs as the way to return large output. The server negotiates protocol 2025-06-18.

v4.1 · Sep 2026 — 71 tools, Xcode 27 readiness

Xcode 27 broke idb in a way that failed silently: older companions read the accessibility tree correctly but dropped every tap while reporting success. v4.1 added idb-doctor, a 1.5.1 companion floor, and a preflight that makes HID-writing tools refuse to run rather than pretend.

v4.2 · Sep 2026 — 77 tools, tested against a real app

Driving a real app end-to-end found four bugs that had passed 1,456 tests, all in parsing idb's output. The tests mocked a format idb never emits — newline-delimited objects with label fields — where idb really returns one JSON array using AXLabel. So accessibility-quality-check rated every screen unusable and idb-ui-find-element never matched anything, each while returning well-formed, plausible JSON. Fixtures now use captured idb output, and reintroducing one of those bugs fails ten tests.

The same pass added crash reporting, element visibility and test-isolation tools, and removed the inert defer_loading flag.

The trade-off, version by version

Version

Tools

What set the context cost

v1.0

51

Every description loaded at connect

v1.3.2

51

Descriptions trimmed; documentation moved behind rtfm

v2.0

28

Tool count cut by consolidating into routers

v3.0

30

A server-side deferral flag that never took effect

v4.0

70

Client-side deferral; routers dissolved for per-tool annotations

v4.1

71

Unchanged model; Xcode 27 support

v4.2

77

Unchanged model, verified against real idb output

Two lessons carried forward. Context cost is the client's call — a server should describe its tools honestly and let the client decide how to spend context on them. And a structured response can hide a broken tool — test against the real command, not a mock of it.

Release detail is in CHANGELOG.md.

Migrating from v2/v3 routers

Drop the operation field and call the matching tool. Operation-specific parameters are unchanged.

Removed router

Replacement tools

simctl-device

simctl-boot, -shutdown, -create, -delete, -erase, -clone, -rename

simctl-app

simctl-install, -uninstall, -launch, -terminate

idb-app

idb-install, -uninstall, -launch, -terminate

cache

cache-get-stats, -get-config, -set-config, -clear

persistence

persistence-enable, -disable, -status

idb-targets keeps its operation enum. rtfm({ toolName: "simctl-device" }) still suggests the replacements.


Development

git clone https://github.com/conorluddy/xc-mcp.git
cd xc-mcp && npm install
npm run build     # compile to dist/
npm test          # jest
npm run lint      # eslint

Point any MCP client at a local build with node /path/to/xc-mcp/dist/index.js. A running server holds dist/ in memory, so restart the client session after rebuilding.

CLAUDE.md covers the architecture, how to add a tool, and the rules learned the hard way.

Contributing

WARNING

Contributions are welcome but reviewed slowly — this repo sits well down my priority list. Forking and adapting it is usually the faster route.

Pull requests need a passing build, tests and lint.

License

MIT, as declared in package.json.

Available Tools

77 tools
accessibility-auditAccessibility (WCAG) AuditA
Read-onlyIdempotent

accessibility-audit

WCAG-aligned accessibility audit of the live iOS simulator accessibility tree.

Overview

Fetches the full accessibility tree via idb ui describe-all, flattens it, and evaluates every element against a tiered rule set (critical → warning → info). Returns a severity summary and either the full issue list (verbose mode) or the top issues grouped by rule.

Distinct from accessibility-quality-check, which only scores tree richness. This tool diagnoses what is broken and how to fix it.

Parameters

Optional

  • udid (string): Target identifier — auto-detects if omitted

  • verbose (boolean): Return all issues instead of grouped top-10 (default: false)

Rules

Critical — blocks assistive technology users

Rule

Condition

Fix

missing_label

Button or Link with no AXLabel

Add accessibilityLabel

empty_button

Button with no AXLabel AND no AXValue

Set button title or accessibilityLabel

image_no_alt

Image with no AXLabel

Add accessibilityLabel with description

Warning — degrades UX

Rule

Condition

Fix

missing_hint

Slider or TextField with no help text

Add accessibilityHint

missing_traits

Element has type but no traits

Set appropriate accessibilityTraits

small_touch_target

Tappable frame < 44×44pt

Increase tappable area to at least 44×44pt

Info — best-practice suggestions

Rule

Condition

Fix

no_identifier

Element missing AXUniqueId

Add accessibilityIdentifier for testing

deep_nesting

Element depth > 5

Simplify view hierarchy

Returns

  • summary: { total, critical, warning, info }

  • issues (verbose mode): Full issue list

  • topIssues (default): Issues grouped by rule, sorted by severity then count, capped at 10

Structured Content

{ "total": 3, "critical": 1, "warning": 1, "info": 1 }

Examples

// Quick audit — top issues only
const result = await accessibilityAuditTool({});

// Full details for CI reporting
const result = await accessibilityAuditTool({ verbose: true });
  • accessibility-quality-check: Richness score — use before deciding accessibility vs screenshot

  • idb-ui-describe: Full accessibility tree for manual inspection

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
infoYes
totalYes
warningYes
criticalYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds value by explaining the underlying implementation (fetches via `idb ui describe-all`) and the non-destructive analysis pipeline, which aligns with the annotations. There is no contradiction, and the description enriches the behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but meticulously structured with headers, tables for rules, JSON examples, and code snippets. It front-loads the core purpose and parameter details, then provides reference tables. Every section earns its place, making it easy to scan and parse without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema is present (illustrated via JSON example), the description still fully covers the return structure (summary, issues, topIssues), rules, parameter options, and related tools. All necessary information for correct invocation and interpretation is provided, and the examples clarify both default and verbose usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries full parameter documentation. It clearly explains 'udid' (auto-detects if omitted) and 'verbose' (returns all issues vs grouped top-10) with defaults, adding meaning beyond the bare types. While concise, it fully covers what the agent needs to know.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('audits') and resource ('live iOS simulator accessibility tree'), and explicitly distinguishes from 'accessibility-quality-check' by noting it diagnoses what is broken and how to fix it. The overview, rule tables, and return types make the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context by contrasting with 'accessibility-quality-check' (richness score) and listing related tools with brief guidance. It implies when to use this tool (when you need to diagnose accessibility issues) but does not explicitly state when not to use it or alternative conditions, so it falls short of a perfect 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

accessibility-quality-checkAccessibility Quality CheckA
Read-onlyIdempotent

accessibility-quality-check

Quick assessment of accessibility tree richness - decide whether to use accessibility or screenshots.

Overview

Rapidly queries the accessibility tree and assesses data richness without returning full element details. Returns a quality score and recommendation (accessibility-ready or screenshot-fallback) in ~80ms with minimal token cost. Prevents agents from wasting tokens on expensive screenshots when accessibility data is sufficient.

Parameters

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • screenContext (string): Screen name for semantic tracking (e.g., "LoginScreen")

Returns

  • quality: "rich" | "moderate" | "minimal"

  • recommendation: "accessibility-ready" | "consider-screenshot"

  • elementCounts: Total elements, tappable elements, text fields, element types

  • queryTime: Query execution time in milliseconds

  • queryGuidance: Next steps based on quality assessment

Examples

Quick check of current screen

const check = await accessibilityQualityCheckTool({
  screenContext: 'LoginScreen'
});

if (check.quality === 'rich') {
  // Use accessibility: idb-ui-describe
} else {
  // Fall back to screenshot
}

Check before deciding automation approach

const assessment = await accessibilityQualityCheckTool({
  udid: 'DEVICE-UDID'
});

// Workflow guided by quality

Quality Levels

Rich (✅ Use accessibility)

  • 3 tappable elements, OR

  • Text input fields detected

  • Recommendation: Use idb-ui-describe and accessibility-based navigation

Moderate (⚠️ Try accessibility first)

  • 2-3 tappable elements

  • Some custom UI that may not be recognized

  • Recommendation: Try accessibility tree first, fall back to screenshot if needed

Minimal (📸 Use screenshot)

  • ≤1 element, OR

  • No tappable elements found

  • Recommendation: Take screenshot for visual analysis

How It Works

  1. Quick query: Calls idb ui describe-all (~80ms)

  2. Assess richness: Counts tappable elements, text fields

  3. Return score: Quality assessment + recommendation

  4. No elements returned: Just the counts and guidance

Cost Comparison

  • accessibility-quality-check: ~80ms, 30 tokens

  • Full idb-ui-describe: ~120ms, 50 tokens

  • screenshot: ~2000ms, 170 tokens

  • idb-ui-describe: Full accessibility tree with element details

  • idb-ui-find-element: Search for specific element by name

  • screenshot: Visual fallback when accessibility insufficient

Notes

  • Returns quality assessment only (not full element tree)

  • Recommended as first step before choosing automation approach

  • Saves tokens by preventing unnecessary screenshots

  • Identifies when UI has minimal accessibility support

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
screenContextNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
qualityYesrich | moderate | minimal
successYes
textFieldsYes
totalElementsYes
recommendationYesaccessibility-ready | consider-screenshot
tappableElementsYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent, but the description goes further by disclosing the underlying mechanism ('Calls idb ui describe-all'), expected latency (~80ms), token cost comparison, and that it 'Returns quality assessment only (not full element tree).' This gives agents an accurate model of behavior and side effects beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-organized with clear headings, code examples, and a decision table. Some redundancy exists between Overview, How It Works, Cost Comparison, and Notes, but the structure helps an agent quickly extract the decision logic without losing important detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a decision-support tool with two optional parameters and no required inputs, the description is complete: it explains parameters, return values, quality thresholds, recommendations, cost trade-offs, and relationships to sibling tools. An agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does: udid is explained as 'Target identifier - auto-detects if omitted,' and screenContext as 'Screen name for semantic tracking' with an example value. The meaning is clear, though it could have specified expected formats or constraints more precisely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Quick assessment of accessibility tree richness - decide whether to use accessibility or screenshots.' It clearly differentiates this tool from similar siblings like idb-ui-describe and screenshot by framing it as the decision gate before those tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool ('Recommended as first step before choosing automation approach') and provides a concrete decision rule: use accessibility when quality is rich, fall back to screenshot when minimal. It also names related tools and how they relate, giving clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cache-clearClear CacheA
DestructiveIdempotent

cache-clear

🗑️ Clear cached data to force fresh retrieval and resolve stale state - Purge cache systems.

Removes all entries from the specified cache system(s). Forces fresh data retrieval on the next operation. Useful for troubleshooting stale cache issues, resetting learned patterns, or clearing memory after major project changes. Can target individual caches or clear all at once.

Advantages

• Force fresh data after major Xcode project changes (new targets, schemes, build settings) • Resolve issues caused by stale cached simulator or project data • Clear memory before performance testing to establish baseline • Reset learned patterns when switching between project configurations

Parameters

Required

  • cacheType (string): Which cache to clear - "simulator", "project", "response", or "all"

Optional

  • (None)

Returns

  • Tool execution results with clear operation confirmation

  • Results per cache type showing successful clearing

  • Timestamp of cache clearing

  • cache-get-stats: Monitor cache before clearing

  • cache-set-config: Configure cache retention

  • cache-get-config: View cache configuration

Notes

  • Tool is auto-registered with MCP server

  • Operation is immediate and irreversible

  • Clearing all caches forces fresh retrieval on all tools

  • Use before performance benchmarking

ParametersJSON Schema
NameRequiredDescriptionDefault
cacheTypeNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as destructive and idempotent, but the description goes further by stating the operation is 'immediate and irreversible' and that clearing all caches forces fresh retrieval on all tools. This adds meaningful behavioral context beyond the structured metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with headings and front-loads the core behavior. However, it repeats the same ideas ('force fresh data', 'purge cache systems', 'clearing all caches forces fresh retrieval') and includes an irrelevant 'Tool is auto-registered with MCP server' note, so not every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool, the description covers the parameter, return structure, side effects, use cases, and related tools. The main gap is the contradictory required/optional labeling and thin per-cache-type semantics, but the essential invocation details are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description merely restates the enum values already present in the input schema and adds little semantic depth about what 'simulator', 'project', or 'response' caches actually contain. It also labels cacheType as Required while the schema/context signals report zero required parameters, which is misleading rather than helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific action ('Removes all entries') on a clear resource ('cache system(s)') and states the outcome ('force fresh retrieval'). It also distinguishes itself by listing cache-get-stats, cache-get-config, and cache-set-config as related tools, making the role of cache-clear unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Advantages' section provides concrete scenarios: stale cache issues, major Xcode project changes, performance baseline testing, and switching configurations. It lacks explicit when-not-to-use guidance or direct comparisons with cache-set-config/cache-get-stats, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cache-get-configGet Cache ConfigurationA
Read-onlyIdempotent

cache-get-config

🔍 Get current cache retention configuration settings - View cache policies.

Retrieves the current cache retention policies for simulator, project, and response caches. Shows both millisecond values and human-readable durations. Essential for understanding your current cache configuration before making adjustments or troubleshooting performance.

Advantages

• Verify cache retention settings before tuning for specific workflows • Understand current configuration when troubleshooting stale data issues • Document cache settings for team collaboration or CI/CD configuration • Compare settings across different environments (development vs production)

Parameters

Required

  • (None)

Optional

  • cacheType (string): Which cache config to retrieve - "simulator", "project", "response", or "all". Defaults to "all"

Returns

  • Tool execution results with current cache configuration

  • Retention times in both milliseconds and human-readable format

  • Fixed response cache duration (30 minutes)

  • cache-set-config: Configure cache retention times

  • cache-get-stats: Monitor cache performance

  • cache-clear: Clear cached data

Notes

  • Tool is auto-registered with MCP server

  • Shows default configurations before any customization

  • Response cache duration is fixed at 30 minutes

  • Use to verify config changes after using cache-set-config

ParametersJSON Schema
NameRequiredDescriptionDefault
cacheTypeNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral details: it returns both millisecond values and human-readable durations, shows default configurations before customization, and notes the fixed 30-minute response cache duration. This goes beyond the annotations, though it includes a minor irrelevant note about auto-registration.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections, but it includes non-essential content like an 'Advantages' bullet list and a 'Related Tools' list that duplicate information available from siblings. While the core information is front-loaded, the verbosity could be trimmed without losing value. It's not as concise as the high-scoring examples.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter, no output schema), the description is complete. It explains the parameter, the return format, default behavior, and fixed characteristics. It also mentions related tools for further context. 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage (no descriptions in the input schema properties), so the description must compensate. It does so thoroughly: 'cacheType (string): Which cache config to retrieve - "simulator", "project", "response", or "all". Defaults to "all"' — this documents the parameter's purpose, allowed values, and default, fully exceeding what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Retrieves the current cache retention policies for simulator, project, and response caches.' It uses a specific verb (retrieves) and resource (cache retention configuration). While it doesn't explicitly contrast with siblings, the purpose is unambiguous and easily distinguished from related tools like cache-set-config or cache-clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Essential for understanding your current cache configuration before making adjustments or troubleshooting performance' and 'Use to verify config changes after using cache-set-config.' It implies when to use the tool but doesn't explicitly state when not to use it or contrast with alternatives beyond listing related tools. This is slightly below the explicit guidance in the calibration example.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cache-get-statsGet Cache StatisticsA
Read-onlyIdempotent

cache-get-stats

📊 Get comprehensive statistics across all XC-MCP cache systems - Monitor cache performance and effectiveness.

Retrieves detailed statistics from the simulator cache, project cache, and response cache systems. Shows hit rates, entry counts, storage usage, and performance metrics across all caching layers. Essential for monitoring cache effectiveness and identifying optimization opportunities.

Advantages

• Monitor cache performance across all simulator, project, and response caches • Understand cache hit rates to optimize build and test workflows • Track memory usage and identify tuning opportunities • Debug performance issues by analyzing cache patterns

Parameters

Required

  • (None - retrieves statistics from all cache systems automatically)

Optional

  • (None)

Returns

  • Tool execution results with structured cache statistics

  • Statistics for each cache system (simulator, project, response)

  • Hit rates, entry counts, and performance metrics

  • Timestamp of statistics collection

  • cache-set-config: Configure cache retention times

  • cache-get-config: Get current cache configuration

  • cache-clear: Clear cached data

Notes

  • Tool is auto-registered with MCP server

  • Statistics are calculated in real-time

  • Use regularly to monitor cache effectiveness

  • Export statistics for performance analysis across time

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds useful context: statistics are calculated in real time and cover all cache systems. There is no contradiction between the description and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear summary but is padded with repetitive marketing-style bullets and vague notes such as 'Export statistics for performance analysis across time' and 'Tool is auto-registered with MCP server'. A zero-parameter read-only tool does not need this much prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description appropriately explains what the agent should expect: hit rates, entry counts, storage usage, performance metrics, and timestamps. It also names related cache tools, making the call context sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the description explicitly lists 'Required: None' and 'Optional: None'. This confirms the schema and removes any ambiguity, though there is no deeper parameter semantics to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: it retrieves statistics from the simulator, project, and response cache systems. It is readily distinguishable from sibling cache tools like cache-get-config and cache-clear, though it does not explicitly say 'use this for stats, not config'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says to use the tool for monitoring cache effectiveness and identifying optimization opportunities, giving clear context. However, it does not provide explicit when-to-use versus alternatives or when-not-to-use guidance, leaving some selection reasoning to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cache-set-configSet Cache ConfigurationA
Idempotent

cache-set-config

⚙️ Configure cache retention times to optimize for your workflow - Fine-tune cache policies.

Fine-tune cache retention policies for simulator, project, and response caches. Allows you to balance performance (longer cache retention) against freshness (shorter retention). Default is 1 hour for most caches. Supports specifying duration in milliseconds, minutes, or hours for convenience.

Advantages

• Optimize for development workflows (longer cache = faster repeated operations) • Optimize for CI/CD environments (shorter cache = fresher data, less stale state) • Reduce memory usage by lowering retention times for infrequently-accessed caches • Extend retention for slow-changing projects to maximize performance gains

Parameters

Required

  • cacheType (string): Which cache to configure - "simulator", "project", "response", or "all"

Optional

  • maxAgeMs (number): Cache retention in milliseconds

  • maxAgeMinutes (number): Cache retention in minutes (alternative to maxAgeMs)

  • maxAgeHours (number): Cache retention in hours (alternative to maxAgeMs)

Note: Specify exactly one of maxAgeMs, maxAgeMinutes, or maxAgeHours. Minimum 1000ms (1 second).

Returns

  • Tool execution results with configuration update confirmation

  • Results per cache type with human-readable durations

  • Timestamp of configuration change

  • cache-get-config: Get current cache configuration

  • cache-get-stats: Monitor cache performance

  • cache-clear: Clear cached data

Notes

  • Tool is auto-registered with MCP server

  • Changes apply immediately

  • Response cache is currently fixed at 30 minutes

  • Use with cache-get-stats to verify effectiveness

ParametersJSON Schema
NameRequiredDescriptionDefault
maxAgeMsNo
cacheTypeYes
maxAgeHoursNo
maxAgeMinutesNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds behavioral context: 'Changes apply immediately', 'Response cache is currently fixed at 30 minutes', and the constraint 'Specify exactly one of maxAgeMs, maxAgeMinutes, or maxAgeHours'. This goes beyond the annotations and helps the agent understand side effects and constraints. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (Advantages, Parameters, Returns, Related Tools, Notes) and front-loaded with a clear summary. Some marketing language like '⚙️ Configure cache retention times to optimize for your workflow' is slightly fluffy, but the core content is relevant and organized, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description lists expected returns ('Tool execution results', 'Results per cache type with human-readable durations', 'Timestamp of configuration change'). It also covers constraints (response cache fixed, minimum duration) and relationships. Everything an agent needs to configure cache retention correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully explain parameters. It does: cacheType (with enum values), maxAgeMs, maxAgeMinutes, maxAgeHours, and the note about exactly one and minimum 1000ms. This completely compensates for the lack of schema descriptions, making parameter usage unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Configure cache retention times' and 'Fine-tune cache retention policies for simulator, project, and response caches.' It is specific about the verb (configure/fine-tune) and the resource (cache retention). It distinguishes itself from siblings via the Related Tools section (cache-get-config, cache-get-stats, cache-clear), making clear this is the setter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides guidance on when to use: 'Optimize for development workflows (longer cache = faster repeated operations)' and 'Optimize for CI/CD environments (shorter cache = fresher data)'. It also lists Related Tools like cache-get-config and cache-get-stats, giving clear alternatives. However, it does not explicitly state when not to use it or contrast with each sibling, so it's not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hang-get-detailsGet Hang Capture DetailsA
Read-onlyIdempotent

hang-get-details

Return the full L2 summary for a stopped HangBuster session, or the per-event detail of a specific cluster.

Parameters

  • sessionId (required)

  • cluster (optional, 1-indexed): drill into one cluster's events

Returns

Formatted L2 summary (severity histogram, bursts, process distribution) or cluster detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
clusterNo
sessionIdYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as readOnly, idempotent, and non-destructive. The description adds useful context beyond that: it requires a stopped session and reveals whether the agent gets a summary or a per-cluster detail view. It does not describe failure modes for active sessions, but no contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly structured with a front-loaded purpose sentence followed by concise Parameters and Returns sections. Every element earns its place; the Returns section adds specific value by naming 'severity histogram, bursts, process distribution.'

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the key invocation context: stopped sessions, required and optional parameters, and expected return shapes even without an output schema. It is nearly complete for a simple read-only tool; a small gap is not saying what happens if the session is still active.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for parameters. It explains that sessionId is required and that cluster is optional, 1-indexed, and 'drill[s] into one cluster's events.' This adds real meaning beyond the schema, though sessionId format/source is not detailed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource: 'Return the full L2 summary for a stopped HangBuster session, or the per-event detail of a specific cluster.' This is clear and specific, but it never explicitly contrasts with siblings like hang-list or hang-stop, so the differentiation is left to the agent rather than stated outright.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context by saying the target is a 'stopped HangBuster session' and offers a conditional branch for a 'specific cluster.' It does not name alternative tools or exclusions explicitly, but the conditions for using this tool are clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hang-listList Hang Capture SessionsA
Read-onlyIdempotent

hang-list

List all HangBuster capture sessions (newest first) with status, device, and timestamps.

Parameters

None.

Returns

Array of sessions with sessionId/status/udid/createdAt/stoppedAt.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds ordering and return fields, which is useful but not extensive. It does not mention pagination, error behavior, or empty results. Given the annotations carry the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured with clear sections (Parameters, Returns), and every sentence provides value. It is front-loaded with the core action and immediately lists the return format. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the exact fields (sessionId/status/udid/createdAt/stoppedAt) and ordering. This is sufficient for a simple list tool. It lacks details on status values or error handling, but these are not critical for invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and the schema is empty. The description adds 'Parameters: None' which echoes the schema. Per the baseline rule for 0 params, a score of 4 is correct since no parameter explanation is needed beyond the schema already being empty.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('List'), the resource ('all HangBuster capture sessions'), and the ordering ('newest first'), along with the output fields. This distinguishes it from siblings like hang-get-details, which presumably fetches a single session. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (list all sessions) but does not explicitly mention alternatives or when not to use it. Sibling tools like hang-start, hang-stop, and hang-get-details exist, but no guidance is given on choosing this tool over them. The context is clear but lacks explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hang-startStart Hang CaptureA

hang-start

Begin a HangBuster capture session. Spawns a detached simctl log stream filtered to hang/stall/watchdog/jetsam events, writing to the session's raw log. Reproduce the hang, then call hang-stop to parse, cluster, and rank the results.

Parameters

  • udid (optional): simulator UDID (default: booted)

  • predicate (optional): override the os_log predicate

  • minHangMs (optional, default 250): drop hang events shorter than this at stop time

Returns

sessionId (pass to hang-stop / hang-get-details), pid, and guidance.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
minHangMsNo
predicateNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate false hints; the description adds real behavioral context by stating that a detached process is spawned, logs are written to the session's raw log, and shorter hang events are dropped at stop time per `minHangMs`. It does not enumerate cleanup or failure behavior, but it goes beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with purpose, and organized with Parameters and Returns sections. It avoids fluff and every sentence adds operational value for selecting and calling the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly documents the return fields (`sessionId`, pid, guidance) and the follow-up tool. It covers the core invocation workflow, though it omits details such as session cleanup, concurrency, and what happens if no booted simulator is available.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry parameter meaning, and it does: `udid` defaults to booted, `predicate` overrides the os_log predicate, and `minHangMs` defaults to 250 and controls the filtering threshold at stop time. This is meaningful and more than the bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a precise verb-resource pairing: 'Begin a HangBuster capture session' and explains the concrete mechanism (spawns a detached `simctl log stream` filtered to hang/stall/watchdog/jetsam events). It also mentions the paired `hang-stop` tool, which distinguishes it from sibling simctl and idb tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description lays out a clear workflow: start capture, reproduce the hang, then call `hang-stop` to parse/cluster/rank. This gives the agent an explicit usage sequence, though it does not explicitly state when alternatives like `simctl-stream-logs` or `hang-list` should be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hang-stopStop & Analyze Hang CaptureA
Idempotent

hang-stop

Stop a HangBuster session, parse its captured log through the clustering pipeline (parse → normalise → threshold → fingerprint → cluster → rank), persist the summary, and return a token-budgeted view (L0/L1/L2 auto-selected).

Parameters

  • sessionId (required): the session from hang-start

  • topN (optional): number of top clusters to keep (default 3)

  • budgetTokens (optional): cap output size; picks L0/L1/L2 to fit

Returns

Hang/cluster counts and a formatted summary. Drill deeper with hang-get-details.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNNo
sessionIdYes
budgetTokensNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds genuinely useful behavioral context beyond that: it discloses persistence ('persist the summary'), the full processing pipeline, and the auto-selected token-budget view (L0/L1/L2). No contradiction with annotations; the 'stop' mutation aligns with readOnlyHint=false and idempotentHint=true is plausible for a stop-and-analyze.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly structured into Parameters and Returns sections with headers. The pipeline enumeration (parse → normalise → threshold → fingerprint → cluster → rank) adds slight verbosity but each element earns its place by clarifying behavior. No wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Moderately complex tool (3 params, multi-stage pipeline, summary output) with no output schema, so the Returns section is the only source for return info. It explains counts and a formatted summary plus a drill-down pointer. Minor gap: the exact summary structure isn't specified, but the lifecycle pointer and full parameter documentation make it adequate for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden and fully compensates. All three parameters are documented with real semantics: sessionId tied to the hang-start session, topN with its default of 3, and budgetTokens explained as a size cap that selects L0/L1/L2. Every parameter is meaningfully covered despite the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb chain ('Stop... parse... persist... return') with an explicit resource (HangBuster session). The clustering pipeline is enumerated, and it clearly distinguishes from siblings by referencing hang-start as the origin and hang-get-details as the follow-up. An agent can tell exactly what this does 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Establishes the lifecycle context ('the session from hang-start') and gives an explicit post-call pointer ('Drill deeper with hang-get-details'). It doesn't spell out explicit when-not-to-use conditions or alternative selection rules, but the lifecycle framing plus sibling pointer provides clear contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-clear-keychainClear Simulator KeychainA
DestructiveIdempotent

idb-clear-keychain

Clear a simulator's keychain, for test isolation.

Overview

Keychain entries survive app uninstall — that is the point of the keychain, and it is why a "fresh install" test can still start logged in. Clearing it gives a genuinely clean credential state before an onboarding or authentication test.

Parameters

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • scenario (string): Test scenario name, recorded in the audit entry

  • step (number): Step number within the scenario

Returns

Confirmation with an audit entry (timestamp, action, scenario, step).

Examples

// Genuinely clean login state — uninstalling the app alone would not do this
await idbClearKeychainTool({ scenario: 'First-run onboarding' });
await workflowFreshInstallTool({ projectPath: './MyApp.xcodeproj', scheme: 'MyApp' });
  • workflow-fresh-install: Wipes app data, but NOT the keychain

  • simctl-erase: Factory-resets the whole simulator (heavier; also clears the keychain)

  • simctl-privacy: Reset permission grants, the other thing that survives reinstall

Notes

  • Destructive: clears credentials for EVERY app on the simulator, not just yours.

  • Cheaper and more targeted than simctl-erase when credentials are all you need reset.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepNoStep number within the scenario
udidNo
scenarioNoTest scenario name for the audit entry

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry destructiveHint=true, readOnlyHint=false, and idempotentHint=true, but the description adds genuinely valuable context beyond them: 'clears credentials for EVERY app on the simulator, not just yours' — scoping exactly what gets destroyed, which the annotation cannot convey. It also discloses cost/weight relative to simctl-erase ('Cheaper and more targeted'). Nothing contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear headers (Overview, Parameters, Returns, Examples, Related Tools, Notes), and the key behavioral insight (uninstall doesn't clear keychain) is front-loaded in the overview. Each section earns its place — examples illustrate a real composed workflow and the destructive scope warning is critical. Slightly verbose for such a simple tool, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a destructive 3-param tool with no output schema. The description documents the return format (confirmation with audit entry: timestamp, action, scenario, step), covers all parameters, provides a worked example, routes to related tools, and warns about the destructive scope. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; the schema documents step and scenario but not udid. The description's Parameters section lists all three and adds one useful fact — udid 'auto-detects if omitted' — plus notes the scenario is recorded in the audit entry. This is modest added value that mostly echoes the schema rather than deeply enriching parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (clear), resource (simulator keychain), and purpose (test isolation). The overview explains why this matters — keychain entries survive app uninstall, so a fresh-install test can still be logged in. It clearly distinguishes from siblings: workflow-fresh-install (wipes data but not keychain), simctl-erase (heavier factory reset), and simctl-privacy (permission grants).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Related Tools section explicitly names alternatives and the precise condition that selects this tool versus them, including what each sibling does and does not do (e.g., 'workflow-fresh-install: Wipes app data, but NOT the keychain'). The example pairs it with workflow-fresh-install to demonstrate the correct composed workflow for a clean-login test.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-crash-deleteDelete Crash ReportsA
DestructiveIdempotent

idb-crash-delete

Delete crash reports from a simulator.

Overview

Mainly useful for establishing a clean baseline before a test run, so that any crash found afterwards is known to belong to that run. Deletion is permanent.

Parameters

Optional (exactly one selector required)

  • name (string): Delete one specific report, by name from idb-crash-list

  • bundleId (string): Delete all reports for one bundle

  • all (boolean): Delete every crash report on the target

  • udid (string): Target identifier - auto-detects if omitted

Returns

Confirmation with the selector used and the raw idb output.

Examples

Clean baseline before a test run

await idbCrashDeleteTool({ bundleId: 'com.example.MyApp' });
// ... run the test ...
await idbCrashListTool({ bundleId: 'com.example.MyApp' }); // anything here is from this run
  • idb-crash-list: Inspect before deleting

Notes

  • Destructive and irreversible: clients may gate this behind confirmation.

  • Requires exactly one of name / bundleId / all, to avoid deleting more than intended.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoDelete every crash report on the target
nameNoDelete one report by name
udidNo
bundleIdNoDelete all reports for this bundle id

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description transparently states deletion is permanent and irreversible, warns clients may want confirmation, and clarifies that exactly one selector is required to prevent deleting more than intended. It adds meaningful behavior beyond the destructiveHint annotation without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized into clear sections: Overview, Parameters, Returns, Examples, Related Tools, and Notes. Information is front-loaded and every section contributes actionable guidance without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing what the tool returns. It covers why to use it, which selector to use, the deletion side effects, related tools, and an example workflow. The description is complete enough for an agent to invoke the tool correctly and safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The parameter section explains each parameter's meaning, including udid which lacks a schema description. It adds the crucial 'exactly one selector required' constraint and provides concrete examples tying parameters to real usage, going well beyond the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and object: 'Delete crash reports from a simulator.' The Overview further clarifies its purpose as establishing a clean test baseline, which clearly distinguishes it from sibling tools like idb-crash-list and idb-crash-show.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly describes when to use the tool ('establishing a clean baseline before a test run'), states constraints ('exactly one selector required'), and points to idb-crash-list as the tool to inspect before deleting. The example demonstrates a complete workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-crash-listList Crash ReportsA
Read-onlyIdempotent

idb-crash-list

List crash reports on a simulator, so an agent can tell a crash from a no-op.

Overview

Without this, a failed interaction is ambiguous: an agent cannot distinguish "my tap did nothing" from "the app crashed and is gone". Crash reports are written by the OS and persist across app launches and reboots.

Simulators accumulate crashes from unrelated system processes. An unfiltered list is mostly noise from other apps and extensions. The useful question is scoped: "did MY bundle crash since I launched it?" — so pass bundleId and since.

Parameters

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • bundleId (string): Only crashes for this bundle (e.g. "com.example.MyApp")

  • since (number): Unix timestamp in SECONDS - only crashes newer than this

  • before (number): Unix timestamp in SECONDS - only crashes older than this

  • limit (number, default 20): Maximum crashes to return, newest first

Returns

crashCount, a crashes array (name, bundleId, processName, timestamp, occurredAt) and the filters that were applied. Pass a name to idb-crash-show for the full report.

Examples

Did my app crash during this test run?

const launchedAt = Math.floor(Date.now() / 1000);
// ... drive the app ...
await idbCrashListTool({ bundleId: 'com.example.MyApp', since: launchedAt });

Everything recent, regardless of app

await idbCrashListTool({ since: Math.floor(Date.now() / 1000) - 3600 });
  • idb-crash-show: Full report for one crash

  • idb-crash-delete: Remove reports (e.g. to get a clean baseline before a test)

  • simctl-stream-logs: Live log stream, which catches non-fatal errors a crash report will not

  • hang-start: Main-thread hangs, which produce no crash report at all

Notes

  • Timestamps are unix SECONDS, not milliseconds.

  • An empty list is a meaningful result: the app did not crash.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
limitNoMax crashes to return, newest first (default 20)
sinceNoUnix timestamp in SECONDS - crashes newer than this
beforeNoUnix timestamp in SECONDS - crashes older than this
bundleIdNoOnly crashes for this bundle id

Output Schema

ParametersJSON Schema
NameRequiredDescription
crashesYes
successYes
crashCountYesCrashes returned after applying limit
totalMatchedYesCrashes matching the filters before limit

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower, but the description adds valuable behavioral context beyond those hints: crash reports persist across launches/reboots, simulators accumulate unrelated system crashes, unfiltered lists are mostly noise, and an empty list is a meaningful non-crash result. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: Overview, Parameters, Returns, Examples, Related Tools, and Notes. It is front-loaded with the core purpose and scoping guidance, and examples are compact and directly illustrative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 5-parameter optional surface, existing output schema, and rich sibling set, this description is fully sufficient. It explains return shape, filter semantics, time units, common pitfalls, and how to route to related tools. An agent can correctly select and invoke this tool without additional inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, but the description goes well beyond the schema by clarifying udid auto-detection, emphasizing Unix SECONDS for timestamps, explaining the default limit, and providing concrete example values like 'com.example.MyApp'. The 'Returns' section also explains how filters map to results, which the schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'List crash reports on a simulator,' and immediately frames the operational purpose ('so an agent can tell a crash from a no-op'). It also distinguishes itself from related tools like idb-crash-show and idb-crash-delete, making sibling differentiation explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use context: it resolves ambiguity between 'tap did nothing' and 'app crashed'. It also provides exclusions and alternatives, noting that simctl-stream-logs catches non-fatal errors and hang-start catches hangs that produce no crash report. It even prescribes the scoped pattern: pass bundleId and since.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-crash-showShow Crash ReportA
Read-onlyIdempotent

idb-crash-show

Fetch one crash report, summarized, with the full report available on demand.

Overview

Crash reports are large — 10KB for a trivial one and far more with full thread backtraces — so this returns a summary plus a cache ID rather than dumping the report into context. The full text is retrievable as an MCP resource at xcmcp://response/{cacheId}.

An .ips file is TWO concatenated JSON documents: a single-line header followed by a pretty-printed body. This tool parses both and merges the useful parts.

Parameters

Required

  • name (string): Crash report name from idb-crash-list (e.g. ".MyApp-2026-09-12-104512.ips")

Optional

  • udid (string): Target identifier - auto-detects if omitted

Returns

Summary with appName, bundleId, timestamp, osVersion, exception type/signal, termination reason, and the top frames of the faulting thread — usually enough to identify the cause without reading the full report. Plus cacheId and a resource link to the complete text.

Examples

const crashes = await idbCrashListTool({ bundleId: 'com.example.MyApp' });
await idbCrashShowTool({ name: crashes.crashes[0].name });
  • idb-crash-list: Find crash report names

  • xcodebuild-get-details: The same progressive-disclosure pattern for build logs

Notes

  • Symbol names appear only where the binary is symbolicated; unsymbolicated frames show the image and offset instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCrash report name from idb-crash-list
udidNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and idempotent, and the description adds substantial behavioral context: it returns a summary plus cache ID instead of a huge report, explains the .ips dual-JSON format, and documents symbolication limitations. This goes well beyond what the annotations alone convey. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but tightly organized into Overview, Parameters, Returns, Examples, Related Tools, and Notes. Each section earns its place, and the most important behavioral fact—summary plus cache ID—is front-loaded. No filler or redundant restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully documents the return content: appName, bundleId, timestamp, exception type, termination reason, top frames, cacheId, and resource link. It also includes an example call pattern and a note about unsymbolicated frames, making the tool's behavior and output interpretable without needing the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, but the description compensates by explaining both parameters: name is sourced from idb-crash-list with an example, and udid auto-detects when omitted. This adds practical meaning beyond the bare schema, though it does not define udid's exact format or validation rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first line states a specific action and resource: 'Fetch one crash report, summarized, with the full report available on demand.' This clearly distinguishes idb-crash-show from idb-crash-list (finding names) and other crash-related tools. The overview reinforces the tool's unique progressive-disclosure behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes a clear workflow: use idb-crash-list to find crash report names, then pass one to idb-crash-show. The example concretely demonstrates this progression and the Related Tools section names idb-crash-list. It lacks an explicit 'when not to use' statement, but the context and example make the intended usage unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-doctorDiagnose idb EnvironmentA
Read-onlyIdempotent

Diagnose whether idb can drive simulator UI on this machine.

Checks the idb CLI and companion, the companion version against the 1.5.1 floor, the Xcode framework layout, and stale companion registrations.

Run this first when taps, swipes or typing appear to succeed but nothing happens on screen - on Xcode 27 an idb-companion older than 1.5.1 drops every HID event while still reporting success, and reads continue to work normally.

Returns a JSON report plus remediation commands.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds valuable behavioral context: what is checked (CLI, companion, version floor, Xcode framework, stale registrations) and that it returns a JSON report plus remediation commands. It also explains a specific failure mode, giving the agent a clear mental model without contradicting the safe, read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and efficient. It front-loads the purpose, then lists checks, provides a specific usage scenario, and states the return value. Each sentence adds value without redundancy. It is concise enough to parse quickly but detailed enough to be useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the zero-parameter complexity, existing annotations, and the description of the return format (JSON report plus remediation commands), the description is complete. It covers the tool's purpose, checks performed, when to use it, and expected output. No critical information is missing for an agent to decide when and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to explain any parameter details since none exist. It correctly focuses on the tool's behavior and return value instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Diagnose whether idb can drive simulator UI on this machine.' It clearly distinguishes from siblings by focusing on environment diagnostics rather than direct UI interaction (idb-ui-*) or build/install operations. The specific checks listed further clarify the scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Run this first when taps, swipes or typing appear to succeed but nothing happens on screen.' It also provides a concrete scenario (Xcode 27, idb-companion <1.5.1). However, it does not mention alternatives or explicitly state when not to use it, so it falls short of a perfect 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-installInstall App (IDB)A
Idempotent

idb-install

Install application to iOS target - deploy .app bundles or .ipa archives for testing.

Overview

Transfers and registers application bundles (.app) or archives (.ipa) to iOS targets. Validates app path format before transfer, handles installation process (transfer, registration, signature validation), extracts bundle ID from output for launching, and provides detailed error guidance for common failures (code signing, architecture mismatch, already installed).

Parameters

Required

  • appPath (string): Absolute path to .app bundle or .ipa archive

Optional

  • udid (string): Target identifier - auto-detects if omitted

Returns

Installation status with success indicator, app path, extracted bundle ID (if available), installation output, and context-specific troubleshooting guidance (code signing issues, architecture mismatches, already installed, file not found).

Examples

Install simulator build

const result = await idbInstallTool({
  appPath: '/path/to/DerivedData/Build/Products/Debug-iphonesimulator/MyApp.app'
});

Install signed IPA to physical device

await idbInstallTool({
  appPath: '/path/to/MyApp.ipa',
  udid: 'DEVICE-UDID-123'
});
  • idb-list-apps: Find bundle ID after installation

  • idb-launch: Launch installed app by bundle ID

  • idb-uninstall: Remove app for clean reinstall

Notes

  • Supports .app bundles (from Xcode build) and .ipa archives (signed/unsigned)

  • Installation can take 10-60 seconds depending on app size

  • Simulators accept unsigned .app bundles

  • Physical devices require valid provisioning profile

  • Auto-terminates running apps before installation

  • Extracts bundle ID from output when available

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
appPathYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, and the description adds meaningful behavioral context: it validates app path format before transfer, auto-terminates running apps before installation, extracts bundle ID from output, and can take 10-60 seconds. It also discloses failure modes (code signing, architecture mismatch, already installed) with troubleshooting guidance. This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes) and front-loads the core purpose. It is somewhat long, but every section earns its place by covering installation behavior, examples, and troubleshooting. The Notes section is slightly redundant with the Overview but still adds operational details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with no output schema, the description is quite complete: it covers input formats, target selection, return values, timing, platform constraints, and failure guidance. The only minor gap is that it doesn't describe the exact output schema or error response structure, but the prose description of returns is sufficient for an agent to invoke and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It explains appPath as an absolute path to .app or .ipa, and udid as a target identifier that auto-detects if omitted. This adds real meaning beyond the bare schema properties, though it doesn't specify udid format or how auto-detection resolves ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Install'), resource ('application to iOS target'), and the exact artifact types (.app bundles or .ipa archives). It clearly distinguishes from siblings like simctl-install and idb-launch by focusing on the transfer/registration/validation workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (deploying .app or .ipa for testing) and notes platform differences (simulators accept unsigned .app, physical devices require provisioning). It doesn't explicitly say 'use simctl-install instead for X' or list exclusions, but the Related Tools section routes to idb-list-apps, idb-launch, and idb-uninstall for adjacent steps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-launchLaunch App (IDB)A

idb-launch

Launch application on iOS target - start apps with optional output streaming and environment control.

Overview

Launches installed applications by bundle ID with optional stdout/stderr streaming, command-line arguments, and environment variables. Extracts process ID for tracking, streams app output when debugging is needed, and provides detailed error guidance for launch failures (app not installed, already running, crashed on launch).

Parameters

Required

  • bundleId (string): App bundle identifier (from idb-list-apps or app installation)

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • streamOutput (boolean): Enable stdout/stderr capture with -w flag

  • arguments (string[]): Command-line arguments to pass to app

  • environment (object): Environment variables to set (KEY=VALUE format)

Returns

Launch status with success indicator, bundle ID, extracted process ID, streaming status, captured stdout/stderr (if streaming enabled), error details if failed, and troubleshooting guidance (app not found, already running, crash logs).

Examples

Simple launch for UI automation

const result = await idbLaunchTool({
  bundleId: 'com.example.MyApp'
});

Launch with debug output streaming

await idbLaunchTool({
  bundleId: 'com.example.MyApp',
  streamOutput: true,
  environment: { DEBUG: '1', LOG_LEVEL: 'verbose' }
});

Launch with arguments

await idbLaunchTool({
  bundleId: 'com.example.MyApp',
  arguments: ['--test-mode', '--skip-intro']
});
  • idb-list-apps: Find bundle ID of installed apps

  • idb-terminate: Stop running app

  • idb-ui-tap: Interact with launched app UI

Notes

  • With -w flag: Streams stdout/stderr (useful for debugging)

  • Without -w: Fire and forget (app runs in background)

  • Returns process ID for tracking app lifecycle

  • Supports command-line arguments and environment variables

  • IDB uses --env KEY=VALUE format for environment variables

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
bundleIdYes
argumentsNo
environmentNo
streamOutputNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only provide boolean hintschen; the description fills in real behavioral detail: -w enables stdout/stderr streaming, absence of -w makes it fire-and-forget, process ID is extracted, and failure modes include not installed, already running, and crashed on launch. This goes well beyond the annotations and helps an agent predict side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a front-loaded summary, parameter table, return details, examples, related tools, and notes. It is somewhat long and has minor overlap between the Returns and Notes sections, but every section contributes meaningful information for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description provides a thorough Returns section covering success indicator, bundle ID, process ID, streaming status, captured output, error details, and troubleshooting guidance. It also includes relevant examples and related tools, making the definition complete for a five-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description explains every parameter: bundleId, udid, streamOutput, arguments, and environment. It also clarifies the environment KEY=VALUE format and demonstrates usage through examples. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the exact operation: launch an application on an iOS target by bundle ID, with optional streaming, arguments, and environment variables. It clearly distinguishes itself from related tools like idb-list-apps and idb-terminate. The verb-resource pair 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a 'Related Tools' section and multiple examples indicating when to use simple launch, streaming, or argument passing. It does not explicitly state when to prefer idb-launch over the sibling simctl-launch or give exclusion criteria, but the intended usage contexts are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-list-appsList Installed Apps (IDB)A
Read-onlyIdempotent

idb-list-apps

List installed applications - discover apps available for testing with bundle IDs and running status.

Overview

Enumerates all installed applications on iOS targets with structured metadata including bundle ID, app name, install type (system/user/internal), running status, debuggability, and architecture. Filters apps by install type or running status to focus on user apps or active processes. Parses IDB's pipe-separated output into structured JSON for easy programmatic access.

Parameters

Required

None - all parameters are optional

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • filterType (string): Filter by install type ("system", "user", or "internal")

  • runningOnly (boolean): Show only currently running apps

Returns

Structured app list with summary counts (total, running, debuggable, by install type), separate arrays for running vs. installed apps, applied filter details, and actionable guidance for launching, terminating, installing, or debugging apps.

Examples

List user-installed apps to find test target

const result = await idbListAppsTool({
  filterType: 'user'
});

Find running app for UI automation

const running = await idbListAppsTool({ runningOnly: true });

List all apps on specific device

const all = await idbListAppsTool({
  udid: 'DEVICE-UDID-123'
});
  • idb-launch: Launch app by bundle ID discovered here

  • idb-terminate: Stop running app found in list

  • idb-install: Install new app to target

Notes

  • IDB outputs pipe-separated text, converted to structured JSON

  • Output format: bundle_id | app_name | install_type | arch | running | debuggable

  • Filter by install type to focus on user apps vs system apps

  • Running status helps identify active processes for UI automation

  • Debuggable status indicates if debugger can be attached

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
filterTypeNo
runningOnlyNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal readOnly and idempotent behavior. The description adds meaningful context by disclosing that output is parsed from IDB's pipe-separated text into structured JSON, that udid auto-detects when omitted, and that the result includes summary counts and separate running/installed arrays. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with clear headings, a front-loaded summary, examples, related tools, and notes. It is lengthy but mostly earns its length; there is minor redundancy between the overview and the notes section regarding pipe-separated output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description compensates with a Returns section, output format note, usage examples, and related-tool workflow context. An agent has enough information to call the tool correctly and interpret its result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for parameters. It documents all three parameters with semantics, enum values for filterType, and the auto-detection behavior for udid. The examples also map parameter combinations to concrete agent intents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List installed applications' and enumerates the exact metadata returned (bundle ID, app name, install type, running status, debuggability, architecture). This clearly differentiates it from action-oriented siblings like idb-launch, idb-terminate, and idb-install.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete use cases: finding a test target, finding a running app for UI automation, and listing apps on a specific device. It also explains when filters are useful, but it does not explicitly state when not to use this tool or name alternatives like simctl-list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-simulate-memory-warningSimulate Memory WarningA
Idempotent

idb-simulate-memory-warning

Deliver a memory warning to a simulator, to exercise low-memory code paths.

Overview

iOS reclaims memory aggressively, and the paths that respond to it — didReceiveMemoryWarning, SwiftUI cache eviction, NSCache purging — are among the least exercised in a typical test run. Bugs there surface as blank views or lost state on a real device under pressure, long after release.

This delivers the warning on demand, so those paths can be tested deliberately.

Parameters

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • scenario (string): Test scenario name, recorded in the audit entry

  • step (number): Step number within the scenario

Returns

Confirmation with an audit entry (timestamp, action, scenario, step) for test-run reconstruction.

Examples

// Check the app survives memory pressure mid-flow
await idbSimulateMemoryWarningTool({ scenario: 'Checkout under pressure', step: 3 });
await accessibilityQualityCheckTool({});  // did the UI survive?
  • idb-crash-list: Check whether the warning actually killed the app

  • accessibility-quality-check: Cheap check that the UI is still intact afterwards

  • simctl-stream-logs: Watch for memory-related log output

Notes

  • The warning is advisory: iOS may or may not terminate the app depending on its footprint.

  • Follow with idb-crash-list to distinguish "handled it" from "was jettisoned".

ParametersJSON Schema
NameRequiredDescriptionDefault
stepNoStep number within the scenario
udidNo
scenarioNoTest scenario name for the audit entry

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as non-read-only, non-destructive, and idempotent. The description adds important behavioral context beyond those hints: the warning is advisory, iOS may or may not terminate the app depending on footprint, and the tool records an audit entry. This effectively sets expectations about nondeterministic outcomes and side effects without contradicting any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a one-line summary up front, followed by Overview, Parameters, Returns, Examples, Related Tools, and Notes. Each section earns its place: the advisory note and related-tool routing are genuinely useful, and the example shows a realistic invocation with a follow-up check.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the Returns section clearly describes the confirmation and audit entry structure (timestamp, action, scenario, step). The examples, related tools, and notes cover what an agent needs to invoke it correctly and interpret the result. No critical operational context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 67% schema coverage, the schema documents two of three parameters. The description compensates by explaining that udid auto-detects if omitted, that scenario is recorded in the audit entry, and that step is the step number within the scenario. This adds semantic value, especially for udid, which has no schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Deliver a memory warning to a simulator, to exercise low-memory code paths.' It explains the precise iOS code paths affected (didReceiveMemoryWarning, SwiftUI cache eviction, NSCache purging), making the tool's purpose unambiguous and distinct from sibling tools like idb-crash-list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The overview identifies when to use the tool: to deliberately exercise low-memory code paths that are rarely tested. The Related Tools section gives clear follow-up actions: use idb-crash-list to check if the app was killed, accessibility-quality-check to verify UI survival, and simctl-stream-logs to watch memory logs. It does not state explicit 'when not to use' exclusions, but the guidance is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-targetsManage IDB TargetsA
Idempotent

idb-targets

Unified IDB target management - discover, inspect, focus, and manage connections.

Overview

Single tool for IDB target discovery and connection management. Routes to specialized handlers while maintaining clean operation semantics.

Operations

list

List all available IDB targets.

Parameters:

  • state (string, optional): Filter by state - 'Booted' or 'Shutdown'

  • type (string, optional): Filter by type - 'device' or 'simulator'

Example:

await idbTargetsToolUnified({
  operation: 'list',
  state: 'Booted'
})

Returns: List of targets with metadata, state, and type information.


describe

Get detailed information about a specific target.

Parameters:

  • udid (string): Target UDID

Example:

await idbTargetsToolUnified({
  operation: 'describe',
  udid: 'ABC-123-DEF'
})

Returns: Detailed target information including screen dimensions, device model, iOS version.


focus

Focus simulator window for interactive testing.

Parameters:

  • udid (string): Simulator UDID

Example:

await idbTargetsToolUnified({
  operation: 'focus',
  udid: 'ABC-123-DEF'
})

connect

Establish IDB companion connection to target.

Parameters:

  • udid (string, optional): Target UDID - auto-detects if omitted

Example:

await idbTargetsToolUnified({
  operation: 'connect',
  udid: 'ABC-123-DEF'
})

Notes: Establishes persistent gRPC connection for faster subsequent operations. Useful for warming up connections before automated testing.


disconnect

Close IDB companion connection to target.

Parameters:

  • udid (string, optional): Target UDID

Example:

await idbTargetsToolUnified({
  operation: 'disconnect',
  udid: 'ABC-123-DEF'
})

  • idb-install / idb-launch / idb-terminate / idb-uninstall: App management on IDB targets

  • idb-ui-tap, idb-ui-input, idb-ui-gesture: UI automation on targets

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
udidNo
stateNo
operationYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare idempotentHint=true, readOnlyHint=false, destructiveHint=false; description adds specific behavioral detail for the connect operation (persistent gRPC connection for faster subsequent calls). It does not contradict annotations and adds useful context, though it could say more about side effects of focus/disconnect. This is solid beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a clear overview, operation-specific sections, parameters, examples, and notes. The length is justified by the five operations; each sentence serves a purpose. Front-loaded with the overview and then detailed operations. No unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-operation tool with no output schema, this description is thorough: includes parameter meanings, examples, return types for list and describe, behavioral notes for connect, and a related-tools section. An agent has all necessary information to invoke correctly and understand the tool's purpose in the broader toolset.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates: it explains each parameter (state, type, udid, operation) in the context of each operation, with examples and notes (e.g., connect auto-detects udid if omitted). This is exemplary parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear, specific statement of purpose: 'Unified IDB target management - discover, inspect, focus, and manage connections.' It lists concrete operations and distinguishes from sibling tools by being the unified IDB target tool, not just a generic list or control tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context that this is the unified tool for IDB target management, covering all operations. It does not explicitly contrast with simctl or other alternatives, but its role is evident from the description and the operation set. Not fully explicit on exclusions, hence 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-terminateTerminate App (IDB)A
Idempotent

idb-terminate

Terminate running application - force-quit apps for clean state testing and debugging.

Overview

Force-terminates running applications by bundle ID with immediate stop (no graceful shutdown). Idempotent operation that succeeds even if app not running. Detects whether app was actually running from output parsing to provide accurate status. Essential for resetting app state between test runs and preparing for reinstallation.

Parameters

Required

  • bundleId (string): App bundle identifier to terminate

Optional

  • udid (string): Target identifier - auto-detects if omitted

Returns

Termination status with success indicator, bundle ID, wasRunning flag (parsed from output to distinguish actual termination from no-op), command output, error details if failed, and next steps guidance (relaunch, reinstall, verification).

Examples

Force-quit app before reinstall

const result = await idbTerminateTool({
  bundleId: 'com.example.MyApp'
});

Stop app on specific device

await idbTerminateTool({
  bundleId: 'com.example.MyApp',
  udid: 'DEVICE-UDID-123'
});
  • idb-launch: Relaunch app after termination

  • idb-list-apps: Verify running status before/after termination

  • idb-uninstall: Remove app after termination for clean install

Notes

  • This is a force-kill operation (not graceful shutdown)

  • Idempotent - succeeds even if app not running

  • IDB terminate sends termination signal to running app

  • wasRunning flag indicates if app was actually terminated vs already stopped

  • Safe to call multiple times - no error if app already stopped

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
bundleIdYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide idempotentHint=true and readOnlyHint=false, and the description adds substantial behavioral detail beyond that: it is a force-kill with no graceful shutdown, succeeds even when the app is not running, reports a wasRunning flag parsed from output, and is safe to call multiple times. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but well-structured with Overview, Parameters, Returns, Examples, Related Tools, and Notes. Core information is front-loaded and each section adds value, though there is minor redundancy about idempotency and wasRunning appearing in multiple sections.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains return fields (success indicator, bundle ID, wasRunning flag, command output, error details, next steps guidance). It also provides two realistic examples and enough behavioral context for an agent to call the tool correctly. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description must compensate. It does: bundleId is defined as "App bundle identifier to terminate" and udid as "Target identifier - auto-detects if omitted." The meaning is clear, though udid could be more explicitly described as a device identifier.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Force-terminates running applications by bundle ID with immediate stop." It clearly positions the tool as a force-quit operation distinct from idb-launch, idb-uninstall, and idb-list-apps, and the Related Tools section reinforces how it fits among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use it: "resetting app state between test runs and preparing for reinstallation." It also names related tools (idb-launch, idb-list-apps, idb-uninstall) that may be used before or after. It does not explicitly say when not to use it, but the use-case guidance is strong enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-ui-describeDescribe Accessibility TreeA
Read-onlyIdempotent

idb-ui-describe

🔍 Query UI accessibility tree - discover tappable elements and text fields for precise automation

What it does

Queries iOS accessibility tree to discover UI elements, their properties (type, label, enabled state), coordinates (frame, centerX, centerY), and accessibility identifiers. Returns full tree with progressive disclosure (summary + cache ID for full data), element-at-point queries for tap validation, and data quality assessment (rich/moderate/minimal) to guide automation strategy. Automatically parses NDJSON output to extract all elements (not just first), includes AXFrame coordinate parsing for precise tapping, and caches large outputs to prevent token overflow.

Progressive Filtering: Supports 4 filter levels for element discovery - start conservative with moderate filtering (default), escalate to permissive/none if minimal data found.

iOS Compatibility: Recognizes iOS-specific accessibility fields (role, role_description, AXLabel, AXFrame) in addition to standard fields.

Why you'd use it

  • Discover all tappable elements from accessibility tree - buttons, cells, links identified by JSON element objects

  • Get precise tap coordinates (centerX, centerY) for elements without needing screenshots

  • Assess data quality before choosing automation approach - rich data enables precise targeting, minimal data requires screenshots

  • Validate tap coordinates by querying elements at specific points before execution

  • Progressive disclosure prevents token overflow on complex UIs - get summary first, full tree on demand

  • Progressive filter escalation - start with moderate filtering, escalate to permissive/none if minimal data found

Parameters

Required

  • operation (string): "all" | "point"

Point operation parameters

  • x (number, required for point operation): X coordinate to query

  • y (number, required for point operation): Y coordinate to query

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • screenContext (string): Screen name for context (e.g., "LoginScreen")

  • purposeDescription (string): Query purpose (e.g., "Find tappable button")

  • filterLevel (string): "strict" | "moderate" | "permissive" | "none" (default: "moderate")

    • strict: Only obvious interactive elements via type field (original behavior)

    • moderate: Include iOS roles (role, role_description) - DEFAULT, fixes iOS button detection

    • permissive: Any element with role/type/label information

    • none: Return everything (debugging)

Returns

For "all": UI tree summary with element counts (total, tappable, text fields), data quality assessment (rich/moderate/minimal), top 20 interactive elements preview with centerX/centerY coordinates, uiTreeId for full tree retrieval, current filter level, and guidance on automation strategy including suggestions to escalate filter level if minimal data found.

For "point": Element details at coordinates including type, label, value, identifier, frame coordinates (x, y, centerX, centerY), enabled state, and tappability.

Examples

Query full UI tree with default moderate filtering

const result = await idbUiDescribeTool({
  operation: 'all',
  screenContext: 'LoginScreen',
  purposeDescription: 'Find email and password fields'
});
// Result includes elements with centerX, centerY for direct tapping

Progressive filter escalation pattern

// 1. Start with default (moderate)
let result = await idbUiDescribeTool({ operation: 'all' });

// 2. If minimal data, try permissive
if (result.summary.dataQuality === 'minimal') {
  result = await idbUiDescribeTool({
    operation: 'all',
    filterLevel: 'permissive'
  });
}

// 3. If still minimal, try none (return everything)
if (result.summary.dataQuality === 'minimal') {
  result = await idbUiDescribeTool({
    operation: 'all',
    filterLevel: 'none'
  });
}

// 4. If STILL minimal, fall back to screenshots
if (result.summary.dataQuality === 'minimal') {
  // Use screenshot-based approach
}

Validate element at tap coordinates

const element = await idbUiDescribeTool({
  operation: 'point',
  x: 200,
  y: 400
});
// Element includes frame coordinates if available
  • idb-ui-tap: Tap discovered elements using centerX/centerY coordinates

  • screenshot: Capture screenshot for visual element identification

  • idb-ui-find-element: Semantic element search by label/identifier

  • accessibility-quality-check: Quick assessment before choosing approach

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
udidNo
operationYes
screenContextNo
purposeDescriptionNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable context beyond these: it mentions caching large outputs to prevent token overflow, progressive disclosure, NDJSON parsing, and data quality assessment. It also explains the filtering behavior and when to escalate, which is not present in annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (What it does, Why you'd use it, Parameters, Returns, Examples, Related Tools) and effectively front-loaded. Every sentence contributes necessary information for a tool of this complexity. The examples are concise and illustrate key usage patterns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description must explain return values, and it does thoroughly for both operations. It covers all parameters, return structure, progressive filtering, and even includes code examples. It also relates to sibling tools, completing the decision-making context. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has zero descriptions and parameter coverage is 0%, so the description carries the full burden. It meticulously explains each parameter: operation enum, x/y coordinates, udid auto-detection, screenContext, purposeDescription, and filterLevel (even though filterLevel is missing from the schema, the description documents it thoroughly with four levels and defaults). It adds meaning far beyond what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb ('query UI accessibility tree') and resource (iOS UI elements), and explicitly distinguishes itself from siblings like idb-ui-tap and idb-ui-find-element. It clearly defines what it does: discover tappable elements, text fields, and coordinates. No ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section provides concrete scenarios, and the 'Related Tools' section names alternatives with their purposes. It gives explicit fallback guidance (e.g., 'if minimal data, fall back to screenshots') and a progressive filter escalation pattern, leaving no doubt about when to use this tool versus others.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-ui-find-elementFind UI ElementA
Read-onlyIdempotent

idb-ui-find-element

Find UI elements by semantic search in accessibility tree - no screenshots needed.

Overview

Queries the accessibility tree and searches for elements matching a label or identifier. Returns matching elements with tap-ready coordinates (centerX, centerY), enabling agents to find specific UI controls without visual analysis. Fast semantic search replaces screenshot-based visual scanning for complex UIs.

Parameters

Required

  • query (string): Search term to match against element labels or identifiers

Optional

  • udid (string): Target identifier - auto-detects if omitted

Returns

Array of matching elements with:

  • Type, label, identifier

  • Tap-ready coordinates (centerX, centerY)

  • Full frame boundaries (x, y, width, height)

Returns empty array if no matches found.

Examples

Find login button

const result = await idbUiFindElementTool({
  query: 'login'
});

Find email field on specific device

const emailField = await idbUiFindElementTool({
  query: 'email',
  udid: 'DEVICE-UDID'
});

Find by identifier partial match

const search = await idbUiFindElementTool({
  query: 'submit'
});

How It Works

  1. Query accessibility tree: Calls idb ui describe-all (~80ms)

  2. Filter by query: Searches element labels and identifiers (case-insensitive partial match)

  3. Return coordinates: Provides tap-ready centerX/centerY for direct use with idb-ui-tap

  • accessibility-quality-check: Quick assessment of accessibility data richness

  • idb-ui-describe: Full accessibility tree with all element details

  • idb-ui-tap: Tap elements using coordinates

  • screenshot: Visual fallback if accessibility insufficient

Notes

  • Uses case-insensitive partial matching ("log" matches "Login")

  • Returns all matching elements (filter in agent logic if needed)

  • Only returns elements with valid frame coordinates

  • Much faster than visual analysis (~80ms vs 2000ms for screenshot)

  • 5-6x cheaper token cost (~40 tokens vs ~170 for screenshot)

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
queryYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description enriches this with concrete behavior: case-insensitive partial matching, returning all matches, filtering out elements without valid frames, empty array on no match, and performance data (~80ms vs 2000ms for screenshots). No contradiction with annotations; these details add real decision value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-organized with clear headers and purpose front-loaded, but verbose: the three TypeScript examples are nearly identical (only the query string differs), and the how-it-works/notes sections repeat the same facts about case-insensitivity and ~80ms latency. Trimming redundant examples would tighten it without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description explains the return shape (type, label, identifier, centerX/centerY, frame boundaries) and empty-array behavior. It covers parameters, examples, workflow, performance, and related tools — an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden, and it delivers: query is explained as a search term matched case-insensitively against labels/identifiers, and udid as auto-detecting when omitted. Examples demonstrate realistic usage for each parameter, fully compensating for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Find UI elements by semantic search in accessibility tree - no screenshots needed' states a specific verb, resource, and method. It distinguishes itself from siblings like idb-ui-describe (full tree) and screenshot (visual), making tool selection unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Related Tools section explicitly names alternatives and their purposes, including 'screenshot: Visual fallback if accessibility insufficient', which gives an implicit when-not condition. The description also frames this as the fast, cheap option versus visual analysis. Guidance is clear but selection criteria are mostly implicit rather than stated as explicit if-then rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-ui-gesturePerform Gesture / Button PressA

idb-ui-gesture

👆 Perform gestures and hardware button presses - swipes, scrolls, and device controls for navigation

What it does

Executes swipe gestures (directional or custom paths) and hardware button presses on iOS targets. Supports standard swipe directions (up, down, left, right) with automatic screen-relative path calculation using configurable profiles (flick, swipe, drag), custom swipe paths with precise start/end coordinates, and hardware button simulation (HOME, LOCK, SIRI, SCREENSHOT, APP_SWITCH). Automatically validates velocity to ensure iOS recognizes gestures as swipes (>6000 px/sec). Validates coordinates against device bounds and provides semantic action tracking.

Why you'd use it

  • Automate scroll and navigation gestures - swipe to reveal content, dismiss modals, page through carousels

  • Use optimized swipe profiles for different UIs - flick for fast page changes, swipe for standard scrolling, drag for slow interactions

  • Test hardware button interactions without physical device access - home button, lock, app switching

  • Execute precise custom swipe paths for complex gesture-based UIs (drawing, map navigation)

  • Track gesture-based test scenarios with semantic metadata (actionName, expectedOutcome)

Parameters

Required

  • operation (string): "swipe" | "button"

Swipe operation parameters

  • direction (string): "up" | "down" | "left" | "right" - auto-calculates screen-relative path

  • profile (string, default: "standard"): "standard" | "flick" | "gentle" - gesture profile

  • startX, startY, endX, endY (numbers): Precise POINT coordinates for custom swipe path

  • duration (number, default: 200): Swipe duration in MILLISECONDS (e.g., 200 for 200ms) - uses profile default if omitted

Button operation parameters

  • buttonType (string): "HOME" | "LOCK" | "SIDE_BUTTON" | "APPLE_PAY" | "SIRI" | "SCREENSHOT" | "APP_SWITCH"

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • actionName (string): Semantic action name (e.g., "Scroll to Bottom")

  • expectedOutcome (string): Expected result (e.g., "Reveal footer content")

Swipe Profiles (Empirically Tested)

  • standard: Default balance (75% distance, 200ms, 1475 points/sec) - perfect for general navigation

  • flick: Fast page changes (85% distance, 120ms, 2775 points/sec) - use for carousel/rapid navigation

  • gentle: Slow scrolling (50% distance, 300ms, 653 points/sec) - reliable but near-minimum threshold

All coordinates in POINT space (393×852 for iPhone 16 Pro), NOT pixel space. All profiles tested and verified working on iOS 18.5 home screen.

Complete JSON Examples

Swipe Up (Scroll Down)

{"operation": "swipe", "direction": "up", "profile": "standard", "actionName": "Scroll Down"}

Swipe Down (Scroll Up)

{"operation": "swipe", "direction": "down", "profile": "standard", "actionName": "Scroll Up"}

Swipe Left (Navigate Forward)

{"operation": "swipe", "direction": "left", "profile": "standard", "actionName": "Go to Next Page"}

Swipe Right (Navigate Back)

{"operation": "swipe", "direction": "right", "profile": "standard", "actionName": "Go to Previous Page"}

Flick Swipe (Fast Page Navigation)

{"operation": "swipe", "direction": "left", "profile": "flick", "duration": 120, "actionName": "Fast Swipe to Next"}

Gentle Swipe (Slow Scrolling)

{"operation": "swipe", "direction": "up", "profile": "gentle", "duration": 300, "actionName": "Slow Scroll Down"}

Custom Swipe Path (Precise Coordinates)

{"operation": "swipe", "startX": 196, "startY": 600, "endX": 196, "endY": 200, "duration": 200, "actionName": "Custom Scroll"}

Press Home Button

{"operation": "button", "buttonType": "HOME", "actionName": "Background App"}

Press Lock Button

{"operation": "button", "buttonType": "LOCK", "actionName": "Lock Device"}

Press Side Button

{"operation": "button", "buttonType": "SIDE_BUTTON", "actionName": "Trigger Side Button Action"}

Press Siri Button

{"operation": "button", "buttonType": "SIRI", "actionName": "Activate Siri"}

Press Screenshot Button

{"operation": "button", "buttonType": "SCREENSHOT", "actionName": "Capture Screenshot"}

Press App Switch Button

{"operation": "button", "buttonType": "APP_SWITCH", "actionName": "Show App Switcher"}

Returns

Gesture execution status with operation details (direction/button, path coordinates for swipes), duration, velocity info, gesture context metadata, error details if failed, and verification guidance.

Examples

Standard swipe up (default profile)

const result = await idbUiGestureTool({
  operation: 'swipe',
  direction: 'up',
  actionName: 'Scroll to Bottom',
  expectedOutcome: 'Reveal footer content'
});

Flick swipe for fast page navigation

await idbUiGestureTool({
  operation: 'swipe',
  direction: 'left',
  profile: 'flick',
  actionName: 'Go to Next Page'
});

Press home button

await idbUiGestureTool({ operation: 'button', buttonType: 'HOME' });
  • idb-ui-tap: For precise element tapping

  • idb-ui-describe: Find element coordinates

ParametersJSON Schema
NameRequiredDescriptionDefault
endXNo
endYNo
udidNo
startXNo
startYNo
durationNoSwipe duration in milliseconds (e.g., 200 for 200ms, default: 200ms)
directionNo
operationYes
actionNameNo
buttonTypeNo
expectedOutcomeNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate non-read-only, non-destructive, and non-idempotent behavior, which is minimal. The description adds that velocity is validated and coordinates are checked against device bounds, but it does not clearly disclose side effects (e.g., launching gestures actually changes UI states) or limitations beyond what the annotations imply. With annotations providing little content, the description should carry more weight, and it does not fully disclose the real-world impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with headings and tables but is progressively verbose. 'Complete JSON Examples' and the later 'Examples' section repeat nearly the same information in different syntax, and some sections (like full JSON examples for every button type) are redundant. Each piece has value, but the description could be tightened without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 11 parameters and no output schema, yet the description covers all parameter meanings, coordinates, profiles, return contents, and provides error examples. It matches the tool's complexity well. The only gap is the lack of more precise output format descriptions, but since no output schema exists, the returned description is reasonable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 9%, so the description this must compensate. It does so admirably: it details the operation parameter, defines profile values and their measured speeds, explains coordinate space (POINT vs PIXEL), gives defaults for duration, and lists button types. Extensive examples illustrate how parameters combine, which goes far beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs swipe gestures and hardware button presses on iOS targets, using specific verbs and resources. It differentiates itself from sibling tools by naming related tools like idb-ui-tap and idb-ui-describe, making its unique purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section provides specific scenarios, and 'Related Tools' names alternatives for tapping and describing elements. However, it does not explicitly state when not to use this tool or provide exclusion criteria, so it stops short of full when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-ui-inputSend Text/Key InputA

idb-ui-input

⌨️ Input text and keyboard commands - automated text entry and special key presses for form automation

What it does

Sends text input and keyboard commands to focused elements on iOS targets. Types text strings into active text fields, presses special keys (home, return, delete, arrows), and executes key sequences for complex input workflows. Automatically redacts sensitive data (passwords) in responses and provides semantic field context tracking for test documentation.

Why you'd use it

  • Automate form filling without manual keyboard interaction - login flows, search, data entry

  • Execute keyboard shortcuts and navigation (tab, return, arrows) for multi-field workflows

  • Safely handle sensitive data with automatic redaction in tool responses and logs

  • Track input operations with semantic metadata (actionName, fieldContext, expectedOutcome)

Parameters

Required

  • operation (string): "text" | "key" | "key-sequence"

Operation-specific parameters

  • text (string, required for text operation): String to type into focused field

  • key (string, required for key operation): Special key name (home, return, delete, tab, arrows, etc.)

  • keySequence (string[], required for key-sequence operation): Array of key names to press in order

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • actionName (string): Semantic action name (e.g., "Enter Email")

  • fieldContext (string): Field name for context (e.g., "Email TextField")

  • expectedOutcome (string): Expected result (e.g., "Email field populated")

  • isSensitive (boolean): Mark as sensitive to redact from output

Returns

Input execution status with operation details (redacted if sensitive), duration, input context metadata for test tracking, error details if failed, and troubleshooting guidance specific to text vs. key operations.

Examples

Type email into focused field

const result = await idbUiInputTool({
  operation: 'text',
  text: 'user@example.com',
  actionName: 'Enter Email',
  fieldContext: 'Email TextField'
});

Press return to submit

await idbUiInputTool({ operation: 'key', key: 'return' });
  • idb-ui-tap: Tap to focus text fields before typing

  • idb-ui-describe: Find text field coordinates

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
textNo
udidNo
operationYes
actionNameNo
isSensitiveNo
keySequenceNo
fieldContextNo
expectedOutcomeNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no helpful annotations (all hints false), the description carries the full burden. It discloses that it sends input, redacts sensitive data, tracks semantic context, and returns error details with troubleshooting. It does not contradict annotations and adds meaningful behavioral context, though some specifics about UI side effects are omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (What it does, Why you'd use it, Parameters, Returns, Examples, Related Tools). It is front-loaded with the core purpose and uses examples to illustrate usage. While verbose, it is appropriately detailed for a tool with 9 parameters and 3 operation modes, so it doesn't waste words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (no output schema, 9 params, 3 operation types), the description covers everything an agent needs: parameter semantics, operation-specific requirements, return behavior, error handling, and related tools. It is complete for correct invocation without requiring additional lookups.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must explain every parameter. It does so thoroughly: operation lists the enum and which parameters are required per operation, and optional parameters like actionName, fieldContext, expectedOutcome, and isSensitive are described with examples. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it sends text and key input to focused elements on iOS targets, with a clear definition of operations (text, key, key-sequence). It distinguishes from sibling tools by mentioning idb-ui-tap for focusing fields and idb-ui-describe for finding coordinates, which differentiates its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a 'Why you'd use it' section listing concrete scenarios like form filling and keyboard shortcuts, and a 'Related Tools' section explicitly naming alternatives and their roles (e.g., idb-ui-tap as a prerequisite to focus fields). This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-ui-tapTap UI ElementA

idb-ui-tap

🎯 Tap at coordinates on iOS screen - core UI automation primitive with screenshot coordinate transformation

What it does

Sends precise tap events to iOS targets at specified screen coordinates with automatic coordinate transformation from screenshot space to device space. Supports single tap, double tap, and long press gestures. Validates coordinates against device screen bounds and provides semantic action tracking for test documentation. Works on both simulators and physical devices over USB/WiFi.

Why you'd use it

  • Automate UI interactions from screenshot analysis - tap elements identified visually

  • Transform screenshot coordinates automatically when screenshots are resized for token efficiency

  • Validate tap coordinates against device bounds before execution to prevent out-of-range errors

  • Track test scenarios with semantic metadata (actionName, expectedOutcome, testScenario, step)

Parameters

Required

  • x (number): X coordinate (device coords or screenshot coords with applyScreenshotScale)

  • y (number): Y coordinate (device coords or screenshot coords with applyScreenshotScale)

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • numberOfTaps (number, default: 1): Number of taps (set 2 for double-tap)

  • duration (number): Long press duration in milliseconds

  • applyScreenshotScale (boolean): Transform screenshot coords to device coords

  • screenshotScaleX (number): Scale factor for X axis from screenshot-inline

  • screenshotScaleY (number): Scale factor for Y axis from screenshot-inline

  • actionName (string): Semantic action name (e.g., "Login Button Tap")

  • screenContext (string): Screen name for context (e.g., "LoginScreen")

  • expectedOutcome (string): Expected result (e.g., "Navigate to HomeScreen")

  • testScenario (string): Test scenario name (e.g., "Happy Path Login")

  • step (number): Step number in test workflow

Returns

Tap execution status with transformed coordinates, input coordinate details (if transformed), action context metadata for test tracking, error details if failed, and verification guidance.

Examples

Tap from screenshot coordinates (auto-transformed)

const result = await idbUiTapTool({
  x: 150, y: 300,
  applyScreenshotScale: true,
  screenshotScaleX: 2.0, screenshotScaleY: 2.0,
  actionName: "Login Button Tap",
  expectedOutcome: "Navigate to HomeScreen"
});
  • idb-ui-describe: Discover tappable elements and their coordinates

  • screenshot: Capture screenshot to identify tap targets

  • idb-ui-gesture: For swipes and hardware buttons

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
stepNo
udidNo
durationNo
actionNameNo
numberOfTapsNo
testScenarioNo
screenContextNo
expectedOutcomeNo
screenshotScaleXNo
screenshotScaleYNo
applyScreenshotScaleNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds useful behavioral context beyond the annotations: automatic screenshot-to-device coordinate transformation, coordinate bounds validation, support for simulators and physical devices over USB/Wi-Fi, and semantic action tracking. While annotations already indicate non-read-only, non-idempotent behavior, the description enriches the agent's understanding with actionable details about input validation and transformation. It could mention a requirement like a booted target, but that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear headings, bullet lists, and an example that aids comprehension. It is somewhat long and the opening 'What it does' slightly restates the title and the header line, but given 13 parameters and 0% schema coverage, the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 13-parameter tool with no output schema and no schema parameter descriptions, the description carries the entire burden and succeeds. It covers all parameters, return behavior, an example, and relationships with other tools. An agent can invoke this tool correctly with no gaps in meaning.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description compensates thoroughly. It explains each parameter's meaning beyond its type: x/y coordinate space with applyScreenshotScale, UDID auto-detection when omitted, duration for long press, and the semantic metadata fields (actionName, expectedOutcome, etc.). This is exactly the value the description is expected to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description immediately states a specific action and resource: 'Sends precise tap events to iOS targets at specified screen coordinates.' It clearly differentiates this tool from related siblings like idb-ui-gesture (swipes/hardware buttons) and idb-ui-describe (discovering tappable elements), leaving no ambiguity about what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section provides clear use cases such as tapping elements identified in screenshots, transforming coordinates automatically, validating bounds, and tracking test metadata. The 'Related Tools' section also names alternatives with their roles, which helps agents choose the right tool. However, it lacks explicit 'when not to use' guidance beyond those brief sibling descriptions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-uninstallUninstall App (IDB)A
DestructiveIdempotent

idb-uninstall

Uninstall application from iOS target - remove apps with complete data deletion for clean installs.

Overview

Removes installed applications by bundle ID with complete data and preferences deletion. Automatically terminates running apps before uninstall. Cannot remove system apps (user-installed only). Provides detailed error guidance for common failures (app not found, system app protection, uninstall errors).

Parameters

Required

  • bundleId (string): App bundle identifier to uninstall

Optional

  • udid (string): Target identifier - auto-detects if omitted

Returns

Uninstallation status with success indicator, bundle ID, command output, error details if failed, and troubleshooting guidance (app not found, system app protection, termination advice, alternative tools).

Examples

Uninstall app for clean reinstall

const result = await idbUninstallTool({
  bundleId: 'com.example.MyApp'
});

Uninstall from specific device

await idbUninstallTool({
  bundleId: 'com.example.MyApp',
  udid: 'DEVICE-UDID-123'
});
  • idb-install: Reinstall app after uninstall

  • idb-terminate: Stop app before uninstall (auto-handled)

  • idb-list-apps: Verify app is removed after uninstall

Notes

  • Removes app from target system completely

  • Deletes all app data and preferences

  • Automatically terminates app if running

  • Only user-installed apps can be uninstalled (system apps protected)

  • Clean install testing workflow: uninstall -> install -> test

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
bundleIdYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds valuable behavioral context: complete data and preferences deletion, automatic termination of running apps, system app protection, and error guidance. This goes beyond what annotations provide, though it doesn't detail permission requirements or exact response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes) and front-loads the core purpose. It's somewhat verbose with repeated information across Overview and Notes, but each section earns its place and the examples are useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with no output schema, the description covers the essential context: what it does, parameters, return information, examples, and related tools. It could be more explicit about edge cases like invalid bundle IDs or device connection failures, but the error guidance mention covers common failures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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. It explains bundleId as the app bundle identifier to uninstall and udid as target identifier with auto-detection. This adds meaning beyond the bare schema, but the descriptions are minimal and don't provide format examples or constraints beyond what a developer would infer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool uninstalls applications from iOS targets by bundle ID with complete data deletion, distinguishing it from related tools like idb-install and simctl-uninstall. The verb 'uninstall' plus resource 'application from iOS target' 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (clean installs, removing user-installed apps) and notes that idb-terminate is auto-handled, idb-install is for reinstall, and idb-list-apps verifies removal. It doesn't explicitly state when NOT to use it versus simctl-uninstall, but the related tools section gives useful routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

idb-xctest-listList XCTest BundlesA
Read-onlyIdempotent

idb-xctest-list

List xctest bundles installed on a target, or the tests inside one.

Overview

This is NOT a replacement for xcodebuild-test. It does not build anything: it inspects test bundles that are already installed on the simulator (put there by idb install of a .xctest bundle, typically produced by xcodebuild build-for-testing).

Use it to discover what is installed before running tests through idb, or to confirm an install succeeded. If you just want to run a project's tests, use xcodebuild-test.

Parameters

Optional

  • udid (string): Target identifier - auto-detects if omitted

  • testBundleId (string): List the tests inside this bundle instead of listing bundles

Returns

bundles (or tests when testBundleId is given) plus a count. An empty list is normal and means no test bundle is installed — it is not an error.

Examples

What test bundles are installed?

await idbXctestListTool({});

What tests are in one bundle?

await idbXctestListTool({ testBundleId: 'com.example.MyAppUITests.xctrunner' });
  • xcodebuild-test: Build and run a project's tests — the usual choice

  • idb-install: Install a .xctest bundle so it appears here

  • idb-list-apps: List regular apps rather than test bundles

Notes

  • Output parsing is deliberately tolerant: idb has emitted both JSON and plain lines across versions, so both are handled and unrecognised lines are preserved as raw text.

  • An empty result on a simulator with no installed test bundle is expected.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
testBundleIdNoList the tests inside this bundle instead of listing installed bundles

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description adds useful context beyond them: it does not build anything, operates on already-installed bundles, parses both JSON and plain lines, preserves unrecognized raw text, and treats an empty list as normal. This equips the agent with behavior annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with Overview, Parameters, Returns, Examples, Related Tools, and Notes, with the core purpose front-loaded. It is longer than minimal but each section serves a purpose; minor redundancy exists in the empty-result expectation appearing in both Returns and Notes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description explains the return shape (bundles or tests plus a count), normal empty results, prerequisites, and behavioral resilience across idb versions. With examples and sibling routing, an agent has everything needed to decide when to invoke it and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 50% schema description coverage, the description compensates by explaining both parameters: udid auto-detects if omitted and testBundleId switches the tool to listing tests inside a bundle. The example using a realistic bundle ID adds concrete usage semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List xctest bundles installed on a target, or the tests inside one.' It explicitly distinguishes itself from xcodebuild-test with 'This is NOT a replacement' and from idb-list-apps in Related Tools. An agent can immediately understand the tool's scope and boundaries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: discover installed bundles before running tests or confirm an install succeeded. It names the alternative xcodebuild-test for building/running tests and lists related tools like idb-install and idb-list-apps. No ambiguity about when this tool should be selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

localization-auditAudit Localization CatalogA
Read-onlyIdempotent

localization-audit

Audit .xcstrings, .strings, or .stringsdict catalogs for localization gaps, placeholder mismatches, and unused or missing keys relative to Swift source code.

What it does

Pure file analysis — no simulator required. Parses localization catalogs and reports:

  • Per-locale missing/untranslated keys

  • Keys with needs_review, new, or stale states

  • Format-specifier placeholder count mismatches across locales

  • Keys in Swift source but absent from catalog (missing_from_catalog)

  • Keys in catalog but absent from Swift source (unused_in_source)

Parameters

  • catalogPath (string, required): Path to .xcstrings, .strings, or .stringsdict catalog file

  • sourceDir (string, optional): Swift source root for unused/missing key cross-reference

  • strict (boolean, optional): Set isError:true in response if any findings are present

  • verbose (boolean, optional): Include detailed per-key breakdown in summary text

Supported Catalog Formats

  • .xcstrings: Xcode 15+ JSON catalog with multi-locale support

  • .strings: Legacy single-locale plist (binary/XML/text format)

  • .stringsdict: Pluralization rules plist

Returns

JSON response with:

  • catalogPath, sourceLanguage, totalKeys, locales

  • gaps: array of { key, locale, reason } objects

  • missingFromCatalog: keys in Swift source not in catalog

  • unusedInSource: keys in catalog not referenced in Swift source

  • placeholderMismatches: keys where placeholder counts differ across locales

  • summary: compact human-readable summary text

structuredContent: { totalKeys, localeCount, gapCount, placeholderMismatchCount }

Examples

Audit .xcstrings catalog

await localizationAuditTool({
  catalogPath: '/path/to/Localizable.xcstrings'
})

Full audit with source cross-reference

await localizationAuditTool({
  catalogPath: '/path/to/Localizable.xcstrings',
  sourceDir: './MyApp',
  verbose: true
})

Strict mode (error on any findings)

await localizationAuditTool({
  catalogPath: '/path/to/Localizable.xcstrings',
  strict: true
})

Gap Reasons

  • missing: Key has no translation for that locale

  • needs_review: Translation exists but marked for review

  • new: Translation is new and unverified

  • stale: Translation is outdated relative to source

Placeholder Matching

Extracts printf-style format specifiers (%@, %d, %s, %lld, positional %1$@, etc.) and reports keys where the count differs between source and a target locale. Empty-value locales are skipped (gaps reported separately).

ParametersJSON Schema
NameRequiredDescriptionDefault
strictNo
verboseNo
sourceDirNo
catalogPathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
gapCountYes
totalKeysYes
localeCountYes
placeholderMismatchCountYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as readOnly, idempotent, and non-destructive, and the description reinforces this with 'Pure file analysis — no simulator required.' It also adds meaningful behavioral detail such as strict mode setting isError:true and placeholder mismatch handling skipping empty-value locales.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured and front-loaded with a one-line summary, followed by sections for behavior, parameters, formats, returns, examples, gap reasons, and placeholder matching. It is somewhat detailed, but most sections earn their place given the complexity of the audit output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with sparse schema, the description covers input semantics, supported file formats, output JSON fields, gap reason meanings, placeholder-matching rules, and complete usage examples. This is sufficient for an agent to select and invoke the tool correctly without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the Parameters section documents all four parameters with types, requiredness, and plain-language meaning, such as catalogPath being 'Path to .xcstrings, .strings, or .stringsdict catalog file' and strict setting isError:true when findings are present. The examples further clarify how catalogPath, sourceDir, strict, and verbose are used together.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Audit .xcstrings, .strings, or .stringsdict catalogs for localization gaps, placeholder mismatches, and unused or missing keys relative to Swift source code.' This is precise enough for an agent to distinguish it from unrelated siblings such as accessibility-audit or visual-diff.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context by noting 'Pure file analysis — no simulator required' and enumerating supported catalog formats and example invocations. It does not explicitly name alternatives or when-not-to-use conditions, but no sibling tool provides the same localization-catalog audit function.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

persistence-disableDisable Disk PersistenceA
Idempotent

persistence-disable

🔌 Disable persistent state management and return to in-memory-only caching - Turn off persistence.

Safely deactivates file-based persistence and optionally deletes existing cache data files. After disabling, XC-MCP operates with in-memory caching only, losing all learned state on server restart. Useful for privacy requirements, disk space constraints, or troubleshooting cache-related issues.

Advantages

• Meet privacy requirements that prohibit persistent storage • Free up disk space when storage is limited • Switch to CI/CD mode where persistence isn't beneficial • Troubleshoot issues potentially caused by stale cached data

Parameters

Required

  • (None)

Optional

  • clearData (boolean): Whether to delete existing cache files when disabling. Defaults to false

Returns

  • Tool execution results with persistence deactivation confirmation

  • Confirmation of whether cache files were cleared

  • Previous storage information (if clearData was true)

  • Operational effect description

  • persistence-enable: Turn on persistence

  • persistence-status: View persistence system status

Notes

  • Tool is auto-registered with MCP server

  • Defaults to keeping cache files (just stopping writes)

  • Set clearData: true to delete all cache files

  • Operation is immediate and irreversible

ParametersJSON Schema
NameRequiredDescriptionDefault
clearDataNo

TDQS

A3.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations claim destructiveHint=false and idempotentHint=true, but the description states that clearData=true deletes existing cache files and that the operation is immediate and irreversible. Deleting cache files is a destructive behavior, so the description contradicts the destructiveHint annotation. This conflict undermines the safety profile an agent would rely on.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with front-loaded summary, parameters, returns, related tools, and notes. It is longer than strictly necessary—the Advantages section and some Notes repeat the default behavior—but each section is scannable and adds either context or usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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, it covers inputs, return information, related tools, and operational consequences (state loss on restart, irreversibility). It doesn't mention prerequisites or when not to use it, but the included information is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, and the description fully compensates: it documents the sole optional clearData parameter, its boolean type, its meaning ('delete existing cache files when disabling'), and its default of false. The Notes reinforce the default and the effect of setting clearData to true.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first line uses a specific verb and resource: 'Disable persistent state management and return to in-memory-only caching.' It clearly distinguishes itself from siblings by naming persistence-enable and persistence-status, and by describing what happens after disabling. An agent can tell exactly what this tool does 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete use cases (privacy, disk space, CI/CD, troubleshooting stale caches) and lists related tools persistence-enable and persistence-status. It lacks an explicit 'when not to use' or a precondition such as checking persistence-status first, so it doesn't reach 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

persistence-enableEnable Disk PersistenceA
Idempotent

persistence-enable

🔋 Enable opt-in persistent state management for learning across server restarts - Activate persistence.

Activates file-based persistence for XC-MCP's intelligent caching systems. Stores usage patterns, build preferences, simulator performance metrics, and cached responses to disk. Enables the system to learn and improve over time, remembering successful configurations across server restarts. Privacy-first design: NO source code, credentials, or personal information is persisted.

Advantages

• Retain learned build configurations and simulator preferences across restarts • Accelerate repeated workflows by persisting successful operation patterns • Enable team collaboration with shared project-local cache optimizations • Maintain performance insights across CI/CD pipeline runs

Parameters

Required

  • (None)

Optional

  • cacheDir (string): Custom directory for cache storage. If omitted, uses intelligent location selection

Returns

  • Tool execution results with persistence activation confirmation

  • Cache directory location (resolved or custom)

  • Storage information and writability status

  • Privacy notice and next steps

  • persistence-disable: Turn off persistence

  • persistence-status: View persistence system status

Notes

  • Tool is auto-registered with MCP server

  • Privacy-first design - only patterns and preferences stored

  • Enables team sharing via project-local cache

  • Automatically selects best cache location if not specified

ParametersJSON Schema
NameRequiredDescriptionDefault
cacheDirNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as non-read-only and idempotent; the description adds meaningful behavior by specifying what is persisted (usage patterns, build preferences, simulator metrics, cached responses) and what is never persisted (source code, credentials, personal information). It also discloses automatic cache-location selection and auto-registration with the MCP server, adding context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The document is organized under headings and front-loads the core purpose, making it scannable. However, it repeats the privacy point and the automatic-location behavior across sections, and the Advantages list is largely promotional rather than necessary for invoking the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and no output schema, the description is operationally complete: it explains the results (activation confirmation, resolved cache directory, storage writability, privacy notice, next steps) and lists related tools. No critical invocation detail appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides zero description coverage and only a bare 'cacheDir' string property. The description compensates fully: 'cacheDir (string): Custom directory for cache storage. If omitted, uses intelligent location selection.' This tells the agent the parameter is optional and what happens when it is absent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens by saying the tool 'Enable[s] opt-in persistent state management for learning across server restarts' and 'Activates file-based persistence' for XC-MCP's caching systems. It names a specific action on a specific resource, and the Related Tools section distinguishes it from persistence-disable and persistence-status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description frames the tool as the opt-in activation path for persistence and lists concrete contexts where it is beneficial: retaining learned configurations, accelerating repeated workflows, team collaboration, and CI/CD runs. It names related tools for disabling and checking status, but it does not explicitly say when not to use this tool or directly compare selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

persistence-statusPersistence StatusA
Read-onlyIdempotent

persistence-status

📊 Get comprehensive persistence system status with storage metrics and recommendations - Monitor persistence.

Provides detailed information about the persistence system's current state. Shows whether persistence is enabled, cache directory location, disk usage statistics, file counts, last save timestamps, and intelligent recommendations based on storage health. Essential for monitoring and troubleshooting persistent storage.

Advantages

• Monitor disk space usage and cache file growth over time • Verify persistence is working correctly (check last save timestamps) • Troubleshoot persistence issues (check writability, file counts) • Get actionable recommendations for cache maintenance and optimization

Parameters

Required

  • (None)

Optional

  • includeStorageInfo (boolean): Whether to include detailed disk usage and file information. Defaults to true

Returns

  • Tool execution results with comprehensive persistence status

  • Enabled/disabled state and schema version

  • Cache directory location (if enabled)

  • Storage usage, file count, last save time, writability

  • Actionable recommendations based on storage state

  • persistence-enable: Turn on persistence

  • persistence-disable: Turn off persistence

Notes

  • Tool is auto-registered with MCP server

  • Provides intelligent recommendations for health

  • Set includeStorageInfo: false for lightweight check

  • Use regularly to monitor cache growth and health

ParametersJSON Schema
NameRequiredDescriptionDefault
includeStorageInfoNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds useful behavioral context beyond that: what data is returned (storage metrics, last save times, recommendations), the lightweight check behavior when includeStorageInfo is false, and a note that it is auto-registered. This adds value without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with markdown sections (Advantages, Parameters, Returns, Notes), but it is verbose for a tool with a single optional parameter. There is redundancy: the main paragraph, Advantages bullet, and Returns section all repeat similar information (disk usage, timestamps, recommendations). It could be tightened without losing clarity, though the front-loaded summary helps.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one optional parameter and no output schema, the description is thorough: it explains what the tool returns (Returns section), parameter behavior, related tools, and practical notes (e.g., lightweight check, regular monitoring). Everything an agent needs to call it correctly and interpret the result is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no property descriptions (0% coverage), but the description fully explains the only parameter: 'includeStorageInfo (boolean): Whether to include detailed disk usage and file information. Defaults to true.' It also gives usage guidance in Notes ('Set includeStorageInfo: false for lightweight check'). This completely compensates for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'Provides detailed information about the persistence system's current state' and enumerates the specific data returned (enabled state, cache directory, disk usage, file counts, timestamps, recommendations). This specific verb+resource combination clearly distinguishes it from sibling tools like persistence-enable and persistence-disable, which perform actions rather than status queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Related Tools' section names persistence-enable and persistence-disable as alternatives, implicitly indicating when to use this status tool vs. those. The 'Advantages' list further clarifies usage contexts (monitoring disk usage, verifying persistence, troubleshooting). It does not explicitly state 'when not to use' but provides enough contextual guidance to route an agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rtfmRead The Manual (Tool Docs)A
Read-onlyIdempotent

rtfm

📖 Read The Manual - Progressive disclosure documentation system for all XC-MCP tools.

Overview

The rtfm tool provides access to comprehensive documentation for any of the discrete tools in this MCP server. This implements progressive disclosure: run the server with --mini to reduce every tool description to a one-liner, then call rtfm for full parameters, examples and related tools on demand.

Version History:

  • v1.x: 51 individual tools; v1.3.2 introduced rtfm

  • v2.0-v3.x: 28-30 tools behind operation-enum routers

  • v4.x: routers dissolved; discrete tools with per-tool annotations and outputSchema

Why rtfm?

Problem Solved: Tool documentation was originally stored in .md files within the src/ directory, which wouldn't be available in the published npm package (only dist/ is included in package.json "files" field).

Solution: Documentation is now embedded as TypeScript constants in each tool file, bundled into the compiled JavaScript, and accessible via this rtfm tool. This ensures documentation is always available, whether in development or in the published npm package.

Parameters

  • toolName (optional): Name of specific tool to get documentation for

    • Examples: "xcodebuild-build", "simctl-boot", "idb-ui-tap", "cache-get-stats"

    • Case-sensitive, must match exact tool registration name

  • categoryName (optional): Browse tools in a specific category

    • Examples: "build", "simulator", "app", "idb", "cache", "system"

    • Omit both parameters to see all categories

Examples

// Get documentation for a specific tool
rtfm({ toolName: "simctl-boot" })

// Removed router names still fuzzy-match to their replacements
rtfm({ toolName: "simctl-device" })

// Browse all tools in the cache category
rtfm({ categoryName: "cache" })

// View all categories (no parameters)
rtfm({})

Migration to v4.0 (routers removed)

v2/v3 consolidated routers were dissolved back into discrete tools. Annotations and outputSchema are per-tool, so each operation is now its own tool. Drop the operation field and call the matching tool name — operation-specific parameters are unchanged:

  • simctl-device(operation) → simctl-boot, simctl-shutdown, simctl-create, simctl-delete, simctl-erase, simctl-clone, simctl-rename

  • simctl-app(operation) → simctl-install, simctl-uninstall, simctl-launch, simctl-terminate

  • idb-app(operation) → idb-install, idb-uninstall, idb-launch, idb-terminate

  • cache(operation) → cache-get-stats, cache-get-config, cache-set-config, cache-clear

  • persistence(operation) → persistence-enable, persistence-disable, persistence-status

idb-targets keeps its operation enum (list/describe/focus/connect/disconnect). Passing a removed router name to this tool returns fuzzy suggestions for its replacements.

Response Format

Success Response

Returns full markdown documentation including:

  • Tool description and purpose

  • Advantages over direct CLI usage

  • Parameter specifications with types and descriptions

  • Usage examples

  • Related tools

  • Common patterns and best practices

Tool Not Found Response

If toolName doesn't match any registered tool:

  • Error message with the attempted tool name

  • Suggestions based on partial matches (up to 5)

  • Complete list of all available tools

Example:

No documentation found for tool: "simctl-boo"

Did you mean one of these?
  - simctl-boot
  - simctl-shutdown

Available tools (28 total):
  - xcodebuild-*
  - simctl-*
  - idb-*
  - cache
  - persistence
  - rtfm

Available Tool Categories (v2.0)

Xcodebuild Tools (7)

  • xcodebuild-version, xcodebuild-list, xcodebuild-showsdks

  • xcodebuild-build, xcodebuild-clean, xcodebuild-test

  • xcodebuild-get-details

Simctl Lifecycle Tools

  • simctl-list, simctl-get-details, simctl-boot, simctl-shutdown, simctl-create, simctl-delete, simctl-erase, simctl-clone, simctl-rename

  • simctl-suggest, simctl-health-check

Simctl App Management Tools

  • simctl-install, simctl-uninstall, simctl-launch, simctl-terminate

  • simctl-get-app-container, simctl-container, simctl-openurl

Simctl I/O & Testing Tools (7)

  • simctl-io, simctl-addmedia, simctl-privacy, simctl-push

  • simctl-pbcopy, simctl-status-bar, screenshot

IDB Tools

  • idb-targets (list/describe/focus/connect/disconnect)

  • idb-ui-tap, idb-ui-input, idb-ui-gesture, idb-ui-describe, idb-ui-find-element, idb-list-apps

  • idb-install, idb-uninstall, idb-launch, idb-terminate

Cache Management Tools (4)

  • cache-get-stats, cache-get-config, cache-set-config, cache-clear

Persistence Tools (3)

  • persistence-enable, persistence-disable, persistence-status

Documentation Tool (1)

  • rtfm (this tool!)

Implementation Details

Documentation Storage

Each tool file exports a TOOL_NAME_DOCS constant containing its full documentation in markdown format:

// Example from src/tools/simctl/boot.ts
export const SIMCTL_BOOT_DOCS = `
# simctl-boot
...
`;

Central Registry

All documentation constants are imported and mapped in src/tools/docs-registry.ts:

export const TOOL_DOCS: Record<string, string> = {
  'simctl-boot': SIMCTL_BOOT_DOCS,
  'xcodebuild-build': XCODEBUILD_BUILD_DOCS,
  // ... 49 more tools
};

Progressive Disclosure Pattern

  1. Tool list shows concise descriptions (~300-400 tokens)

  2. Each description ends with: "📖 Use rtfm with toolName: '{name}' for full documentation."

  3. Full documentation accessed only when explicitly requested via rtfm

  4. Prevents token overflow while maintaining comprehensive documentation access

Benefits

Self-contained: No external file dependencies ✅ NPM package ready: Documentation bundled in compiled JavaScript ✅ Token efficient: Progressive disclosure keeps default views concise ✅ Always available: Works in development and production ✅ Type-safe: TypeScript constants with proper typing ✅ Searchable: Fuzzy matching with suggestions for typos ✅ Comprehensive: Full documentation including examples and parameters

Common Use Cases

Explore available tools:

// Intentionally use invalid tool name to see full list
rtfm({ toolName: "help" })

Learn specific tool usage:

rtfm({ toolName: "simctl-boot" })

Understand tool parameters:

rtfm({ toolName: "xcodebuild-build" })

Find related tools:

// Search by category prefix
rtfm({ toolName: "simctl" })  // Shows simctl-* suggestions
  • cache-get-stats: Monitor cache performance and usage

Notes

  • Tool names are case-sensitive and must match exact registration names

  • Fuzzy matching provides suggestions for close matches

  • Documentation format is consistent markdown across all tools

  • Each tool's documentation is independently maintained in its source file

  • The TOOL_DOCS registry is automatically updated when tools are added/removed

ParametersJSON Schema
NameRequiredDescriptionDefault
toolNameNo
categoryNameNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: fuzzy matching for removed router names, case-sensitivity, the 'tool not found' response format with suggestions, and the fact that documentation is embedded as TypeScript constants bundled into the compiled JavaScript. It also explains the v4.0 migration from routers to discrete tools, which is important context for agents that might try to call removed router names.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is comprehensive but very long, covering version history, implementation details, migration notes, and benefits. While all information is relevant, the version history and implementation details (TypeScript constants, central registry) are more relevant to developers than to an AI agent deciding whether to call the tool. The most actionable information (parameters, examples, response format) is present but buried under extensive context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a documentation-lookup tool with no output schema, the description is remarkably complete. It covers parameters, examples, response formats (both success and error), fuzzy matching behavior, category listings, and common use cases. An agent has everything it needs to call this tool correctly and interpret the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden of parameter documentation. It does this well: toolName and categoryName are both explained with examples, case-sensitivity is noted, and the behavior of omitting both parameters is described. The only minor gap is that it doesn't explicitly state whether toolName and categoryName can be combined or are mutually exclusive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies rtfm as a documentation lookup tool with a specific verb ('Read The Manual') and resource (tool documentation). It distinguishes itself from sibling tools by explaining it provides progressive disclosure documentation for all other tools, not performing any device/simulator operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use rtfm: when you need full parameters, examples, and related tools after seeing a one-liner description. It also explains the progressive disclosure pattern and how to browse by category or tool name, with examples of both valid and intentionally-invalid calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshotInline Simulator ScreenshotA
Read-onlyIdempotent

simctl-screenshot-inline

Capture optimized screenshots with inline base64 encoding for direct MCP response transmission.

What it does

Captures simulator screenshots and returns them as base64-encoded images directly in the MCP response. Automatically optimizes images for token efficiency with tile-aligned resizing and WebP/JPEG compression. Includes interactive element detection and coordinate transforms.

Parameters

  • udid (string, optional): Simulator UDID (auto-detects booted device if omitted)

  • size (string, optional): Screenshot size - half, full, quarter, thumb (default: half)

  • appName (string, optional): App name for semantic context

  • screenName (string, optional): Screen/view name for semantic context

  • state (string, optional): UI state for semantic context

  • enableCoordinateCaching (boolean, optional): Enable view fingerprinting for coordinate caching

Screenshot Size Optimization

Automatically optimizes screenshots for token efficiency:

  • half (default): 256×512 pixels, 1 tile, ~170 tokens (50% savings)

  • full: Native resolution, 2 tiles, ~340 tokens

  • quarter: 128×256 pixels, 1 tile, ~170 tokens

  • thumb: 128×128 pixels, 1 tile, ~170 tokens

Automatic Optimization Process

  1. Capture: Screenshot taken at native resolution

  2. Resize: Automatically resized to tile-aligned dimensions (unless size='full')

  3. Compress: Converted to WebP format at 60% quality (falls back to JPEG if unavailable)

  4. Encode: Base64-encoded for inline MCP response transmission

  5. Extract: Interactive elements detected from accessibility tree

  6. Transform: Coordinate mapping provided for resized screenshots

Returns

MCP response with:

  • Base64-encoded optimized image (inline)

  • Screenshot optimization metadata (dimensions, tokens, savings)

  • Interactive elements with coordinates and properties

  • Coordinate transform for mapping screenshot to device coordinates

  • View fingerprint (if enableCoordinateCaching is true)

  • Semantic metadata (if provided)

Examples

Simple optimized screenshot (256×512)

await simctlScreenshotInlineTool({
  udid: 'device-123'
})

Full resolution screenshot

await simctlScreenshotInlineTool({
  udid: 'device-123',
  size: 'full'
})

Screenshot with semantic context

await simctlScreenshotInlineTool({
  udid: 'device-123',
  appName: 'MyApp',
  screenName: 'LoginScreen',
  state: 'Empty'
})

Screenshot with coordinate caching enabled

await simctlScreenshotInlineTool({
  udid: 'device-123',
  enableCoordinateCaching: true
})

Interactive Element Detection

Automatically extracts interactive elements from the accessibility tree:

  • Element type (Button, TextField, etc.)

  • Label and identifier

  • Bounds (x, y, width, height)

  • Tappability status

Limited to top 20 elements to avoid token overflow. Elements are filtered to only include those with bounds and hittable status.

Coordinate Transform

When screenshots are resized (size ≠ 'full'), provides automatic coordinate transformation:

Use the coordinateTransformHelper field in the response with idb-ui-tap:

  1. Identify element coordinates visually from the screenshot

  2. Call idb-ui-tap with applyScreenshotScale: true plus scale factors

  3. The tool automatically transforms screenshot coordinates to device coordinates

Example:

idb-ui-tap {
  x: 256,              // Screenshot coordinate
  y: 512,              // Screenshot coordinate
  applyScreenshotScale: true,
  screenshotScaleX: 1.67,
  screenshotScaleY: 1.66
}
// Tool automatically calculates: deviceX = 256 * 1.67, deviceY = 512 * 1.66

Manual Transformation (For Reference)

If not using automatic transformation:

  • scaleX: Multiply screenshot X coordinates by this to get device coordinates

  • scaleY: Multiply screenshot Y coordinates by this to get device coordinates

  • coordinateTransform.guidance: Human-readable instructions

Important: Most agents should use the automatic transformation via idb-ui-tap's applyScreenshotScale parameter. Manual calculation is provided for reference only.

View Fingerprinting (Opt-in)

When enableCoordinateCaching is true, computes a structural hash of the view:

  • elementStructureHash: SHA-256 hash of element hierarchy

  • cacheable: Whether view is stable enough to cache coordinates

  • elementCount: Number of elements in hierarchy

  • orientation: Device orientation

Excludes loading states, animations, and dynamic content from caching.

Common Use Cases

  1. Visual analysis: LLM-based screenshot analysis with token optimization

  2. UI automation: Detect interactive elements and get tap coordinates

  3. Bug reporting: Capture and transmit screenshots inline

  4. Test documentation: Screenshot with semantic context for test tracking

  5. Coordinate caching: Store element coordinates for repeated interactions

Token Efficiency

Screenshots are optimized for minimal token usage:

  • Default (half): ~170 tokens (50% savings vs full)

  • Full: ~340 tokens (native resolution)

  • Quarter: ~170 tokens (75% savings vs full)

  • Thumb: ~170 tokens (smallest, for thumbnails)

Token counts are estimates based on Claude's image processing (170 tokens per 512×512 tile).

Important Notes

  • Auto-detection: If udid is omitted, uses the currently booted device

  • Temp files: Uses temp directory for processing, auto-cleans up

  • WebP fallback: Attempts WebP compression, falls back to JPEG if unavailable

  • Element extraction: Requires app to be running with accessibility enabled

  • Coordinate accuracy: Transform provides pixel-perfect coordinate mapping

Error Handling

  • Simulator not found: Validates simulator exists in cache

  • Simulator not booted: Indicates simulator must be booted first

  • Capture failure: Reports if screenshot capture fails

  • Optimization failure: Falls back to original if optimization fails

  • Element extraction: Gracefully degrades if accessibility is unavailable

Next Steps After Screenshot

  1. Analyze visually: LLM processes inline image for visual analysis

  2. Interact with elements: Use coordinates from interactiveElements

  3. Tap elements: Apply coordinate transform if resized, then use simctl-tap

  4. Query specific elements: Use simctl-query-ui for targeted element discovery

  5. Cache coordinates: Store fingerprint for reuse on identical views

Comparison with simctl-io

Feature

screenshot-inline

simctl-io

Returns

Base64 inline

File path

Optimization

Automatic

Manual

Elements

Auto-detected

Not included

Transform

Included

Included

Use case

MCP responses

File storage

Token usage

Optimized

Depends on size

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNo
udidNo
stateNo
appNameNo
screenNameNo
enableCoordinateCachingNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds substantial behavioral context: automatic resizing and compression, WebP/JPEG fallback, element extraction from accessibility tree, coordinate transform logic, view fingerprinting, temp file cleanup, and error handling. This goes far beyond what annotations convey and is essential for correct invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely verbose, with redundant sections: token efficiency numbers appear twice, and the 'Common Use Cases' and 'Next Steps' sections add length without essential invocation guidance. While it is structured with headers, the critical information is buried under extensive detail. Not every sentence earns its place, and the description is not appropriately sized for a tool definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 optional parameters, no output schema, and complex behaviors like coordinate transforms and caching, the description is exhaustive. It covers return values, optimization pipeline, element detection, error handling, and examples. An agent has everything needed to call the tool correctly, including the coordinate transform helper usage with idb-ui-tap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero descriptions for its 6 parameters, and the context signal confirms 0% schema coverage. The description's dedicated 'Parameters' section explains each parameter, including the meaning of size enum values, udid auto-detection, and the semantic metadata fields. This fully compensates for the schema's lack of documentation, adding meaning that is otherwise absent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise statement of purpose: 'Capture optimized screenshots with inline base64 encoding for direct MCP response transmission.' It clearly distinguishes itself from the sibling simctl-io via a comparison table, noting different return formats and use cases. An agent can immediately understand what this tool does and how it differs from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly contrasts with simctl-io, stating when to use inline screenshots vs file-based ones. It provides a 'Comparison with simctl-io' table and a 'Common Use Cases' list, plus 'Next Steps After Screenshot' that guide the agent on follow-up actions. It also explains when to use automatic vs manual coordinate transforms, directing agents to idb-ui-tap for the recommended approach.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-addmediaAdd Media to SimulatorA

simctl-addmedia

Add media files (photos and videos) to a simulator's photo library for testing.

What it does

Adds image or video files to the simulator's Photos app, making them available for apps to access via PHPhotoLibrary or UIImagePickerController APIs.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • mediaPath (string, required): Path to image or video file

Supported Formats

Images: jpg, jpeg, png, heic, gif, bmp Videos: mp4, mov, avi, mkv

Returns

JSON response with:

  • Media addition status

  • Media type and format detected

  • Guidance for viewing in Photos app and adding more media

Examples

Add image to photo library

await simctlAddmediaTool({
  udid: 'device-123',
  mediaPath: '/path/to/photo.jpg'
})

Add video to photo library

await simctlAddmediaTool({
  udid: 'device-123',
  mediaPath: '/path/to/video.mp4'
})

Common Use Cases

  1. Photo picker testing: Add test images for UIImagePickerController testing

  2. PHPhotoLibrary testing: Populate library for photo access API testing

  3. Image processing: Add images to test filters, crops, and transformations

  4. Video playback: Add videos to test AVPlayer integration

  5. Camera roll simulation: Populate library to simulate real user photo collection

Important Notes

  • File must exist: Validates file exists before attempting to add

  • Format validation: Only supported image/video formats are accepted

  • Simulator state: Works on both booted and shutdown simulators

  • Photos app: Media appears in simulator's Photos app immediately

  • Metadata: Original file metadata (EXIF, date, etc.) is preserved

Error Handling

  • File not found: Error if media file path doesn't exist

  • Unsupported format: Error if file extension is not in supported list

  • Simulator not found: Validates simulator exists in cache

  • Addition failure: Reports simctl errors if media cannot be added

Next Steps After Adding Media

  1. View in Photos app: simctl-launch <udid> com.apple.mobileslideshow

  2. Test photo picker: Launch your app and open UIImagePickerController

  3. Add more media: Repeat with different images/videos

  4. Test PHPhotoLibrary: Use PHPhotoLibrary.requestAuthorization() in your app

Testing Workflow

  1. Grant photo permissions: simctl-privacy <udid> <bundleId> grant photos

  2. Add test media: simctl-addmedia <udid> /path/to/photo.jpg

  3. Launch app: simctl-launch <udid> <bundleId>

  4. Test photo access: Verify app can read from photo library

  5. Take screenshot: simctl-io <udid> screenshot to verify UI

Tips

  • Test image formats: Add different image formats (JPEG, PNG, HEIC) to test compatibility

  • Test video formats: Add various video formats (MP4, MOV) to test playback

  • Large files: Be aware that adding large video files may take time

  • Batch addition: Add multiple files to simulate realistic photo library

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
mediaPathYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses several behavioral traits beyond the sparse annotations: it validates file existence, restricts to supported formats, works on both booted and shutdown simulators, preserves metadata, and details error conditions. Annotations only indicate non-readOnly, non-idempotent, non-destructive; the description adds operational nuance that helps the agent predict side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and multi-sectional, covering parameters, formats, returns, examples, use cases, notes, error handling, next steps, workflow, and tips. It is well-structured with headers and front-loaded with the core purpose, but it repeats overlapping content (e.g., 'Common Use Cases' vs. 'Testing Workflow') and includes many optional tips. It earns a 3 because it is comprehensive but not concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema and low schema parameter coverage, the description is exceptionally complete. It explains the return format (JSON with status, type, and guidance), error handling for each failure mode, examples, and a full testing workflow. An agent has everything needed to call the tool correctly and understand its effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides no descriptions for either parameter (0% coverage). The description compensates by explaining each parameter explicitly: 'udid (string, required): Simulator UDID (from simctl-list)' and 'mediaPath (string, required): Path to image or video file,' and further lists supported formats. This gives the agent the meaning it cannot derive from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Add media files (photos and videos) to a simulator's photo library for testing,' which is a specific verb+resource action. It clearly states what the tool does and is unique among siblings—no other sibling tool adds media to the simulator. The 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides rich usage context through 'Common Use Cases' (photo picker testing, PHPhotoLibrary testing, etc.) and a 'Testing Workflow' that shows when to use this tool in a sequence (e.g., after granting photo permissions). It does not explicitly mention alternatives because none exist in the sibling list, so the guidance is sufficient without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-appearanceSet Simulator Appearance/LocaleA
Idempotent

simctl-appearance

Control iOS simulator appearance: theme (light/dark), dynamic type size, locale, and region.

What it does

Wraps xcrun simctl ui and xcrun simctl spawn defaults write to let you switch appearance settings on a running simulator without leaving your terminal or MCP session.

Parameters

  • udid (string, optional): Simulator UDID. Auto-detects booted simulator if omitted.

  • theme ('light' | 'dark', optional): Switch light/dark appearance.

  • textSize (string, optional): Dynamic type size alias (XS–AX5, see table below).

  • locale (string, optional): BCP-47 language code (e.g. en, ar, de).

  • region (string, optional): ISO 3166-1 alpha-2 region code (e.g. US, SA). Requires locale.

  • bundleId (string, optional): App bundle ID — terminate + relaunch after locale change. Requires locale.

  • reset (boolean, optional): Reset theme, text size, and locale to system defaults (light / M / en_US). Incompatible with other flags.

Text Size Aliases

Alias

xcrun token

XS

extra-small

S

small

M

medium (default)

L

large

XL

extra-large

XXL

extra-extra-large

XXXL

extra-extra-extra-large

AX1

accessibility-medium

AX2

accessibility-large

AX3

accessibility-extra-large

AX4

accessibility-extra-extra-large

AX5

accessibility-extra-extra-extra-large

RTL Locales

Locales starting with ar, he, fa, ur, or yi are flagged as RTL. The response includes a [RTL layout] note and guidance to verify RTL support.

Returns

JSON response with:

  • success: overall operation success

  • udid: resolved simulator UDID

  • results: per-operation { success, message } objects (theme, textSize, locale, or reset)

  • guidance: next-step suggestions

Examples

Switch to dark mode

await simctlAppearanceTool({ theme: 'dark' })

Set large dynamic type

await simctlAppearanceTool({ textSize: 'AX3' })

Set Arabic locale (Saudi Arabia) and restart app

await simctlAppearanceTool({
  locale: 'ar',
  region: 'SA',
  bundleId: 'com.myapp.ios',
})

Combine theme and text size

await simctlAppearanceTool({ theme: 'dark', textSize: 'XL' })

Reset all appearance to defaults

await simctlAppearanceTool({ reset: true })

Validation Rules

  • At least one of theme, textSize, locale, or reset must be provided.

  • reset cannot be combined with theme, textSize, or locale.

  • region requires locale.

  • bundleId requires locale.

Important Notes

  • The simulator must be booted for commands to succeed.

  • Locale changes apply on the next cold app launch unless bundleId is provided.

  • Multiple operations can be combined in a single call (e.g., theme + textSize).

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
resetNo
themeNo
localeNo
regionNo
bundleIdNo
textSizeNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotent, non-destructive), the description explains important behaviors: it wraps specific xcrun commands, locale changes apply on the next cold launch unless bundleId is provided, reset is incompatible with other flags, and RTL locale detection triggers guidance. This gives the agent a complete picture of side effects and operational details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though lengthy, the description is well-organized with clear headings, a parameter table, examples, and validation rules. Every section adds necessary information, and the structure makes it easy to scan for key details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is comprehensive: it includes prerequisites, return format, validation rules, RTL behavior, examples, and important notes about cold app launches. With no output schema, the description fully compensates by detailing the JSON response structure, making the tool self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero descriptions, but the description covers every parameter with purpose, optionality, and constraints (e.g., region requires locale, reset incompatible). The text size alias table maps user-friendly values to xcrun tokens, fully compensating for the sparse schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: controlling iOS simulator appearance including theme, dynamic type size, locale, and region. It distinguishes itself from sibling simctl tools by scoping to appearance/locale and naming the underlying xcrun commands, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (for simulator appearance/locale changes) and notes the prerequisite that the simulator must be booted. However, it does not explicitly mention alternatives or exclusion cases, so it stops short of fully explicit usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-bootBoot SimulatorA
Idempotent

simctl-boot

Prefer this over 'xcrun simctl boot' - Intelligent boot with performance tracking and learning.

Advantages over direct CLI

• 📊 Performance tracking - Records boot times for optimization insights • 🧠 Learning system - Tracks which devices work best for your projects • 🎯 Smart recommendations - Future builds suggest fastest/most reliable devices • 🛡️ Better error handling - Clear feedback vs cryptic CLI errors • ⏱️ Wait management - Intelligent waiting for complete boot vs guessing

Automatically tracks boot times and device performance metrics for optimization. Records usage patterns for intelligent device suggestions in future builds.

Parameters

Required

  • deviceId (string): Device UDID (from simctl-list) or "booted" for any currently booted device

Optional

  • waitForBoot (boolean, default: true): Wait for device to finish booting completely

  • openGui (boolean, default: true): Open Simulator.app GUI automatically

Returns

Success response includes:

  • Boot status (success/failure)

  • Device information

  • Boot time in milliseconds

  • Performance metrics

  • Guidance for next steps

Examples

Boot a specific device

{
  "deviceId": "ABC123DEF-GHIJ-KLMN-OPQR-STUVWXYZ1234",
  "waitForBoot": true
}

Boot any available device quickly

{
  "deviceId": "booted",
  "waitForBoot": false,
  "openGui": false
}
  • simctl-list - Discover available simulators and their UDIDs

  • simctl-suggest - Get intelligent device recommendations based on history

  • simctl-shutdown - Shut down booted devices

  • simctl-health-check - Verify simulator environment health

Device Support

  • Simulators: Full support ✅

  • Physical Devices: Not applicable (devices don't have simctl boot)

Notes

  • Handles "already booted" case gracefully (treats as success)

  • Tracks boot performance for future optimization recommendations

  • First boot of a device type may take longer than subsequent boots

  • Opening GUI with openGui: true provides visual feedback but increases boot time slightly

ParametersJSON Schema
NameRequiredDescriptionDefault
openGuiNo
deviceIdYes
waitForBootNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotentHint=true and readOnlyHint=false, and the description aligns without contradiction. It adds valuable behavioral context: handles 'already booted' as success, tracks performance metrics, waits intelligently, and notes that opening the GUI increases boot time. It also warns that first boots may be slower. These go beyond the annotations and help the agent anticipate side effects and edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear headings: advantages, parameters, returns, examples, related tools, device support, notes. Each section serves a purpose, and the most critical information (purpose and advantage) is front-loaded. Some promotional content (e.g., emoji-laden advantage list) is arguably redundant for an agent, but it does convey the tool's unique value proposition. Overall, it earns its length without being bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers every aspect needed to invoke the tool correctly: parameters with defaults, return structure, multiple examples (specific device and quick boot), related tools for discovery and shutdown, device support (simulators only), and edge-case notes (already booted, first boot slower). With no output schema, the 'Returns' section compensates adequately. This is a thorough, self-contained description for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides zero descriptions, but the description fully explains all three parameters: deviceId (accepts UDID or 'booted'), waitForBoot (default true, waits for complete boot), and openGui (default true, opens GUI). It also clarifies return data (boot status, device info, boot time, metrics). This is a comprehensive compensation for the schema's lack of descriptions, giving the agent everything needed to construct correct calls.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: it boots a simulator with added intelligence. It opens with 'Prefer this over 'xcrun simctl boot'' and lists specific advantages like performance tracking and learning. The name and title already indicate booting, and the description adds distinct value by highlighting enhanced features, making it unambiguous among the many simctl-* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Prefer this over xcrun simctl boot' and lists advantages, establishing when to use this tool over the raw CLI. It also references related tools like simctl-list for discovering devices, simctl-suggest for recommendations, and simctl-shutdown for stopping, providing context for when this tool is appropriate. However, it doesn't explicitly state when NOT to use it (e.g., if you need to launch an app, use simctl-launch), but the related-tools section gives a strong implicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-cloneClone SimulatorA

simctl-clone

Clone iOS simulator devices with complete state preservation.

Overview

Creates an exact duplicate of an existing simulator including all settings, installed apps, and current state. The cloned simulator gets a new UDID but preserves all configuration. Useful for creating backups of configured simulators before experiments or maintaining multiple test variants.

Parameters

Required

  • deviceId (string): Source device UDID to clone (from simctl-list)

  • newName (string): Display name for the cloned simulator

Returns

Clone status with both source and new device information, including new UDID, success indicator, command output, and guidance for managing the cloned device.

Examples

Clone simulator for testing

await simctlCloneTool({
  deviceId: 'ABC-123-DEF',
  newName: 'TestDevice-Snapshot'
});

Create backup before experiments

await simctlCloneTool({
  deviceId: 'PRODUCTION-UDID',
  newName: 'Production Test Backup'
});
  • simctl-list: Find source device UDID to clone

  • simctl-boot: Boot cloned device after creation

  • simctl-delete: Remove cloned device when no longer needed

Notes

  • Cloned device includes all apps and data from source

  • New UDID is generated automatically

  • Cloning can take 1-2 minutes depending on data size

  • Source device name and configuration are preserved

  • Device can be in any state (booted, shutdown) during clone

ParametersJSON Schema
NameRequiredDescriptionDefault
newNameYes
deviceIdYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructiveHint=false (not destructive) and readOnlyHint=false (mutates by creating a new simulator). The description adds useful context: cloning can take 1-2 minutes, creates a new UDID automatically, preserves all apps and data, and works in any device state. This goes beyond annotations by explaining the non-destructive nature (source is preserved) and performance characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes). It is appropriately detailed for a complex tool, but slightly verbose with repetitive information (cloning preserves state mentioned multiple times). The purpose is front-loaded in the overview, and examples are concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (cloning a simulator involves preserving apps, data, and state), the description is complete: it covers what the tool does, parameters, return values (new UDID, status), examples, and performance expectations. The output is described sufficiently without an output schema, listing all key information an agent needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description dedicates a full section to parameters, clearly explaining deviceId as 'Source device UDID to clone (from simctl-list)' and newName as 'Display name for the cloned simulator'. It also provides practical examples showing how parameters are used in context, which the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool clones iOS simulator devices with complete state preservation, distinguishes it from simctl-create (which creates a new empty simulator) by emphasizing exact duplication, and explains the result is a new UDID preserving all configuration. This sets it apart from siblings like simctl-erase or simctl-rename.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear use cases such as 'backups of configured simulators before experiments' and 'maintaining multiple test variants', and lists related tools like simctl-list, simctl-boot, and simctl-delete with their purposes. However, it doesn't explicitly say when not to use this tool versus simctl-create or other alternatives, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-containerInspect App Sandbox ContainerA
Read-onlyIdempotent

simctl-container

App sandbox inspector — list files, read file contents, inspect UserDefaults, and locate Core Data stores inside an iOS simulator app's data container.

What it does

Resolves the app data container via xcrun simctl get_app_container, then performs semantic file operations within that sandbox without needing to know the raw CoreSimulator path.

Parameters

  • bundleId (string, required): App bundle identifier (e.g. com.example.MyApp)

  • mode (string, required): Operation — ls | cat | userdefaults | coredata-path

  • udid (string, optional): Simulator UDID. Defaults to booted device.

  • path (string, optional): Sub-path for ls (subdir) or file path for cat

  • depth (number, optional): Recursion depth for ls (default: 3)

Modes

ls

Lists files in the container (or a sub-path) up to depth levels deep. Returns entries with path, kind (file/dir/symlink), and sizeBytes. Path traversal outside the container root is rejected.

cat

Reads a file at path (relative to container root).

  • Attempts plist decode first (binary and XML plists via plutil)

  • Falls back to UTF-8 text, then binary detection

  • Returns contentType: plist | text | binary

  • Files > 8 KB (text/plist) are stored in responseCache; returns cacheId + resourceLink

userdefaults

Reads Library/Preferences/<bundleId>.plist and returns decoded key/value pairs. Handles both binary and XML plist formats via plutil.

coredata-path

Searches Library/Application Support/ and Documents/ recursively for .sqlite, .sqlite-wal, and .sqlite-shm files. Returns { path, absolutePath, sizeBytes, type } for each store found.

Returns

JSON response with { mode, bundleId, success, ... } plus mode-specific fields and guidance.

Examples

List container root

await simctlContainerTool({ bundleId: 'com.example.MyApp', mode: 'ls' })

List a sub-directory

await simctlContainerTool({ bundleId: 'com.example.MyApp', mode: 'ls', path: 'Library/Caches' })

Read a JSON config file

await simctlContainerTool({ bundleId: 'com.example.MyApp', mode: 'cat', path: 'Documents/config.json' })

Inspect UserDefaults

await simctlContainerTool({ bundleId: 'com.example.MyApp', mode: 'userdefaults' })

Find Core Data stores

await simctlContainerTool({ bundleId: 'com.example.MyApp', mode: 'coredata-path' })

Error Handling

  • bundleId required: Rejects empty or missing bundleId

  • mode required: Rejects unknown or missing mode

  • path required for cat: Rejects cat without a path

  • container not found: InternalError with install suggestion

  • path escapes container: InvalidRequest with clear message

  • plist unreadable: InternalError with path context

Notes

  • Keychain is explicitly out of scope

  • Binary plist decoding uses plutil -convert json (macOS built-in)

  • Large text/plist files (> 8 KB) are cached; retrieve via cacheId using the cache tool

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes
pathNo
udidNo
depthNo
bundleIdYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) already establish the safety profile, and the description adds substantial context beyond them: the >8 KB files stored in responseCache (a meaningful side-effect of a read operation), the plist→text→binary decode fallback with contentType, path-traversal rejection, per-mode return shapes, and specific error conventions (InternalError with install suggestion). It also discloses the macOS plutil dependency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The document is long but proportionate to a 4-mode tool, and it is rigorously structured: one-line summary up front, followed by What-it-does, Parameters, per-mode behavior, Returns, code examples, Error Handling, and Notes. Headers, bullets, and TypeScript call examples make it highly scannable for an agent. Some redundancy exists between the parameter list and mode sections, but for LLM recall, prose-plus-example repetition earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero schema descriptions and no output schema, the description must be self-sufficient — and it is. It covers expected inputs per mode, mode-specific return fields, error cases, edge cases (large files, unreadable plists, path traversal), and operational caveats (macOS-only plutil, Keychain exclusion). The only mild gap is the generic top-level return shape ('{ mode, bundleId, success, ... }'), but each mode's specific fields are already described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden — and it delivers. Each of the 5 parameters gets semantic meaning: bundleId format example, mode enum explained across four detailed sections, udid default ('Defaults to booted device'), path semantics per mode (subdir for ls vs file for cat), and depth default (3). This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line — 'list files, read file contents, inspect UserDefaults, and locate Core Data stores inside an iOS simulator app's data container' — states a specific verb+resource scope that clearly differentiates it from siblings like simctl-get-app-container (path resolution only) and simctl-list (device listing). The four modes are each named and their distinct purposes enumerated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides rich context: it states the tool wraps get_app_container 'without needing to know the raw CoreSimulator path' (implying the alternative raw-path workflow), explicitly scopes out Keychain, and routes large-file retrieval to 'the cache tool' via cacheId. However, it never explicitly names siblings as alternatives (e.g., 'if you only need the container path, use simctl-get-app-container'), so the when-vs-alternative guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-createCreate SimulatorA

simctl-create

Create new iOS simulator devices dynamically.

Overview

Creates a new iOS simulator device with specified device type and runtime version. Automatically validates device types and runtimes against available options, defaulting to the latest iOS version if no runtime is specified. Supports all device types including iPhone, iPad, Apple Watch, and Apple TV.

Parameters

Required

  • name (string): Display name for the new simulator (e.g., "MyTestDevice")

  • deviceType (string): Device type identifier (e.g., "iPhone 16 Pro", "iPad Pro")

Optional

  • runtime (string): iOS/runtime version (e.g., "17.0") - defaults to latest available

Returns

Creation status with new device UDID, device type, runtime version, success indicator, command output, and guidance for next steps (boot, delete, erase).

Examples

Create iPhone with latest iOS

await simctlCreateTool({
  name: "TestiPhone",
  deviceType: "iPhone 16 Pro"
});

Create iPad with specific iOS version

await simctlCreateTool({
  name: "TestiPad",
  deviceType: "iPad Pro (12.9-inch)",
  runtime: "17.0"
});
  • simctl-list: See available device types and runtimes

  • simctl-boot: Boot newly created device

  • simctl-delete: Remove created device when done

Notes

  • Device types: iPhone, iPad, Apple Watch, Apple TV

  • Runtime defaults to latest available iOS version

  • Created device persists until explicitly deleted

  • UDID is auto-generated and returned in response

  • Useful for CI/CD pipelines and automated testing

  • Device type can be partial match (e.g., "iPhone 16" matches "iPhone 16 Pro")

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
runtimeNo
deviceTypeYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing that device types and runtimes are automatically validated, that runtime defaults to the latest iOS version, that the device persists until explicitly deleted, and that UDID is auto-generated. It also documents partial device type matching behavior. These are meaningful behavioral details the structured annotations do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections, examples, and front-loaded overview. It is longer than strictly necessary and contains minor repetition, such as listing supported device types both in the overview and in the notes. Overall, the organization makes it easy for an agent to scan and extract relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three parameters and no output schema, the description provides a complete picture: what the tool does, parameter semantics, expected return fields, usage examples, related tools, and persistence caveats. An agent has enough information to invoke it correctly and anticipate the result without needing additional external context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries full responsibility for parameter meaning. It clearly defines each parameter: name as display name, deviceType as identifier, runtime as version with default behavior. Examples show realistic values for all parameters, including a partial-match device type note, fully compensating for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it creates new iOS simulator devices with a specific device type and runtime. It distinguishes this tool from siblings like simctl-boot, simctl-delete, and simctl-list by describing creation and lifecycle context. The verb 'create' and resource 'simulator device' 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The overview explains when to use the tool and the Related Tools section explicitly routes agents to simctl-list for available types/runtimes, simctl-boot for booting, and simctl-delete for removal. It gives strong context, though it does not explicitly state 'when not to use this tool' with hard exclusion criteria. The CI/CD automation note adds practical usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-deleteDelete SimulatorA
DestructiveIdempotent

simctl-delete

Permanently delete iOS simulator devices.

Overview

Permanently removes a simulator device and all its data from the system. This action cannot be undone. The simulator must be shut down before deletion. Useful for cleaning up unused simulators to save disk space (simulators can be 5-10GB each).

Parameters

Required

  • deviceId (string): Device UDID to delete (from simctl-list)

Returns

Deletion status with device information, confirmation that action is permanent, success indicator, command output, and guidance emphasizing permanent nature of deletion.

Examples

Delete specific simulator

await simctlDeleteTool({ deviceId: 'ABC-123-DEF' });

Clean up old test device

await simctlDeleteTool({ deviceId: 'OLD-TEST-DEVICE-UDID' });
  • simctl-list: Find device UDID to delete

  • simctl-shutdown: Shutdown device before deletion (required)

  • simctl-create: Create new simulator after deletion

Notes

  • This action cannot be undone - device and all data permanently removed

  • Device must be shut down before deletion (safety check)

  • Simulators can be 5-10GB each - deletion frees significant disk space

  • Use simctl-erase instead if you want to keep device but reset state

  • Fast operation - completes in seconds

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceIdYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint and readOnlyHint annotations, the description emphasizes irreversibility, permanent data loss, the shutdown requirement, and disk-space impact. It adds meaningful operational context and does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with headings, parameters, returns, examples, and related tools. It is slightly repetitive about the permanent nature of deletion, but this repetition is arguably useful for a destructive operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 and no output schema, the description is complete: it covers prerequisites, return contents, alternatives, related tools, and operational effects. Nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description fully compensates: deviceId is explained as 'Device UDID to delete (from simctl-list)' and both examples show realistic values. This is sufficient for an agent to construct a correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Permanently delete iOS simulator devices.' It further clarifies scope by noting all data is removed and explicitly contrasts with simctl-erase, so an agent can distinguish it from related simctl tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: use for cleaning up unused simulators, requires the device to be shut down first, and identifies alternatives such as simctl-erase for resetting instead of deleting. It also points to simctl-list for finding the device and simctl-shutdown as a prerequisite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-eraseErase Simulator (Factory Reset)A
DestructiveIdempotent

simctl-erase

Reset iOS simulator devices to factory settings.

Overview

Resets a simulator to clean factory state without deleting the device itself. All apps and data are removed, but the simulator persists and can be immediately reused. Useful for clean state testing and fresh app installation workflows.

Parameters

Required

  • deviceId (string): Device UDID to erase (from simctl-list)

Optional

  • force (boolean, default: false): Force erase even if device is booted

Returns

Erase status with device information, confirmation that device persists, wasBooted flag indicating if device was running during erase, success indicator, and guidance for next steps.

Examples

Erase simulator to clean state

await simctlEraseTool({ deviceId: 'ABC-123-DEF' });

Force erase booted device

await simctlEraseTool({
  deviceId: 'ABC-123-DEF',
  force: true
});
  • simctl-list: Find device UDID to erase

  • simctl-shutdown: Shutdown device before erase (if not using force)

  • simctl-boot: Boot device after erase to continue testing

Notes

  • Device persists after erase - only data is removed

  • All apps, preferences, and user data are deleted

  • Device returns to factory settings

  • Use force: true to erase booted device (otherwise must shutdown first)

  • Perfect for repeatable clean state testing

  • Faster than delete + create for reset workflows

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
deviceIdYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds context by detailing that all apps, preferences, and user data are deleted, the device persists in factory state, and force overrides the need to shutdown. It does not contradict annotations and provides useful additional behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes) and front-loads the purpose. It is somewhat verbose with examples and notes, but not excessive for a destructive tool that requires clear usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description describes return fields (device info, wasBooted flag, success indicator). It covers prerequisites, force behavior, typical workflows, and related tools, making it complete for an agent to call correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% since the input schema only lists names without descriptions. The description compensates fully by explaining each parameter: deviceId is sourced from simctl-list, and force has a default of false with specific behavior for booted devices. This adds significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool resets simulators to factory settings, explicitly noting it removes apps and data while preserving the device itself. It distinguishes itself from sibling tools like simctl-delete by clarifying the device is not destroyed, and it names related tools for workflow context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Related Tools' section explicitly lists simctl-shutdown as a prerequisite when not using force, and simctl-boot for post-erase continuation. It also explains the force parameter's purpose for booted devices, giving clear when-to-use vs. alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-get-app-containerGet App Container PathA
Read-onlyIdempotent

simctl-get-app-container

Access iOS app file system containers for inspection and debugging.

What it does

Retrieves the file system path to an app's container directories on a simulator, enabling direct access to app bundle, data directories, and shared group containers for debugging and testing.

Why you'd use it

  • Debug data access: Inspect app Documents and Library folders

  • File inspection: View database files, preferences, and cached data

  • Testing validation: Confirm app writes data to correct locations

  • Container types: Access bundle (app binary), data (Documents/Library), and group (shared) containers

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • bundleId (string, required): App bundle ID (e.g., com.example.MyApp)

  • containerType (string, optional): Container type - bundle, data, or group (default: data)

Container Types

  • bundle: App binary and resources (read-only)

  • data: App's Documents and Library directories (read-write)

  • group: Shared containers for app groups (read-write)

Returns

JSON response with:

  • Container path for file system access

  • Container type information

  • Guidance for accessing and inspecting files

  • Simulator state and validation

Examples

Get app data container path

await simctlGetAppContainerTool({
  udid: 'ABC-123-DEF',
  bundleId: 'com.example.MyApp'
})

Get app bundle path

await simctlGetAppContainerTool({
  udid: 'ABC-123-DEF',
  bundleId: 'com.example.MyApp',
  containerType: 'bundle'
})

Common Use Cases

  1. Debugging data persistence: Access app's Documents folder to inspect saved files

  2. Database inspection: View SQLite database files and validate schema

  3. Preferences debugging: Check UserDefaults plist files

  4. Cache validation: Verify cached data is stored correctly

  5. Bundle inspection: Access app binary and embedded resources

Error Handling

  • App not installed: Returns error if app is not installed on simulator

  • Invalid bundle ID: Validates bundle ID format (must contain '.')

  • Simulator not found: Validates simulator exists in cache

  • Container access failure: Reports if container cannot be accessed

Next Steps After Getting Container Path

  1. View files: cd "<container-path>" && ls -la

  2. Open in Finder: open "<container-path>/Documents"

  3. Find files: find "<container-path>" -type f | head -20

  4. Inspect specific file: cat "<container-path>/Documents/data.json"

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
bundleIdYes
containerTypeNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description builds on this by detailing container type access semantics (bundle read-only, data/group read-write), error handling for missing apps or invalid bundle IDs, and a 'Returns' section describing the JSON response. This adds valuable behavioral context beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although lengthy, the description is well-structured with headings, code examples, and error handling. It front-loads the core purpose and every section (Why, Parameters, Container Types, Returns, Examples, Use Cases, Error Handling) earns its place by providing actionable information. The length is justified given the lack of schema descriptions and output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 3 parameters, no schema descriptions, and no output schema, this description is remarkably complete. It covers purpose, parameter semantics, container types, return value shape, error conditions, and even next steps for using the returned path. An agent can invoke this tool reliably without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates with a dedicated 'Parameters' section explaining each parameter's type, requirement, default, and examples. It also expands the containerType enum with a 'Container Types' section defining bundle, data, and group. All parameters are documented in meaningful detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action: 'Retrieves the file system path to an app's container directories on a simulator.' It names the exact resource (app container directories) and the verb (retrieves), and distinguishes itself from siblings like simctl-container by emphasizing path retrieval for inspection and debugging. The 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a 'Why you'd use it' section and 'Common Use Cases' listing concrete scenarios like inspecting Documents and Library folders, checking databases, and validating writes. However, it never explicitly names alternative tools or states when not to use this tool, so it lacks the explicit exclusions/alternatives needed for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-get-detailsGet Simulator List DetailsA
Read-onlyIdempotent

simctl-get-details

🔍 Get detailed simulator information from cached list results - Progressive disclosure for devices.

Retrieves on-demand access to full simulator and runtime lists that were cached during simctl-list execution. Implements progressive disclosure pattern: initial simctl-list responses return concise summaries to prevent token overflow, while this tool allows drilling down into full device lists, filtered by device type or runtime when needed.

Advantages

• Access full device lists without cluttering initial responses • Filter to specific device types (iPhone, iPad, etc.) • Filter to specific runtime versions • Get only available (booted) devices or all devices • Paginate results to manage token consumption

Parameters

Required

  • cacheId (string): Cache ID from simctl-list response

Optional

  • detailType (string): Type of details to retrieve

    • "full-list": Complete device and runtime information

    • "devices-only": Just device information

    • "runtimes-only": Just available runtimes

    • "available-only": Only booted devices

  • deviceType (string): Filter by device type (iPhone, iPad, etc.)

  • runtime (string): Filter by iOS runtime version

  • maxDevices (number): Maximum number of devices to return (default: 20)

Returns

  • Tool execution results with detailed simulator information

  • Complete device lists with full state and capabilities

  • Available devices and compatible runtimes

  • simctl-list: List available simulators and runtimes

  • xcodebuild-get-details: Get build or test details

Notes

  • Tool is auto-registered with MCP server

  • Requires valid cache ID from recent simctl-list

  • Cache IDs expire after 1 hour

  • Use for discovering available devices and runtimes

ParametersJSON Schema
NameRequiredDescriptionDefault
cacheIdYes
runtimeNo
detailTypeYes
deviceTypeNo
maxDevicesNo

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint), the description gives valuable behavioral context: cache IDs expire after 1 hour, the tool depends on a recent simctl-list response, pagination limits token usage, and it operates on cached data. This helps the agent understand side effects, dependencies, and token constraints without performing a real call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized with headers and bullets, but it is unnecessarily long. Sections like 'Advantages', 'Returns', and 'Notes' add marketing and vague statements ('Tool execution results with detailed simulator information') without adding clear value, so it is not as concise as it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the cache dependency, filter capabilities, pagination, and delivery from an existing report, which is quite complete. Yet the required/optional mismatch means the agent cannot confidently invoke the tool, and the 'Returns' section is too vague to understand the exact output format. That leaves an important gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description attempts to document parameters, including detailType enum values and maxDevices default, which is good since schema description coverage is 0%. However, it incorrectly labels detailType as optional while the JSON schema marks both cacheId and detailType as required. This directly misleads the agent into omitting a required field, a serious invocation–about-failing error. The extra detail does not compensate for this damage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's purpose: 'Retrieves on-demand access to full simulator and runtime lists that were cached during simctl-list execution.' It also places it in a progressive disclosure pattern, distinguishing it from the high-level simctl-list tool, and explicitly mentions filters and pagination. An agent can immediately understand what the tool does and how it differs from similar tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use it: after simctl-list has cached data, when a valid cache ID is available, and when the scenario calls for detailed simulator/runtime information or specific filters. It mentions related tools (simctl-list, xcodebuild-get-details) and the cache dependency. However, it does not explicitly state when not to use it (e.g., when the cache is missing or stale), so it is a bit incomplete on exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-health-checkSimulator Environment Health CheckA
Read-onlyIdempotent

simctl-health-check

Comprehensive iOS simulator environment health check.

Overview

Performs a complete diagnostic check of your iOS development environment, validating Xcode tools, simulators, runtimes, and disk space. Returns actionable recommendations for any issues found. Checks 6 critical areas in seconds: Xcode Command Line Tools, simctl availability, available simulators, booted simulators, available runtimes, and disk space.

Parameters

None - performs complete environment check automatically.

Returns

Health report with pass/fail status for each check, specific guidance for failures, summary of passed/failed checks, and overall healthy status indicator.

Examples

Run complete health check

await simctlHealthCheckTool();

Check before CI/CD pipeline

// Validate environment before running test suite
const health = await simctlHealthCheckTool();
if (!health.healthy) {
  console.error('Environment issues detected');
}
  • simctl-list: See available simulators after health check passes

  • simctl-create: Create simulators if none found

  • simctl-suggest: Get intelligent simulator recommendations

Notes

  • Checks 6 critical areas: Xcode tools, simctl, simulators, booted devices, runtimes, disk space

  • Provides specific solutions for each failed check

  • Validates entire toolchain in seconds

  • Warns if disk usage over 80% (simulators require significant space)

  • Perfect for troubleshooting when operations fail unexpectedly

  • Use before CI/CD pipeline execution to ensure environment health

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it checks 6 specific areas, warns if disk usage is over 80%, returns actionable recommendations, and provides pass/fail status for each check. This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes). It's somewhat verbose with repeated information (the 6 check areas are listed twice, and the 'validates entire toolchain in seconds' point is repeated), but the front-loaded overview and examples make it easy to scan. Every section earns its place, though some redundancy could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter diagnostic tool, the description is complete. It explains what the tool checks, what it returns (health report with pass/fail status, guidance, summary, overall indicator), provides usage examples, and lists related tools. The output schema is absent, but the Returns section adequately describes the return value. Nothing an agent needs to invoke this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters, and the schema coverage is 100% (empty properties object). The description explicitly states 'None - performs complete environment check automatically,' which fully clarifies that no parameters are needed. With 0 params, the baseline is 4, and the description confirms this clearly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs a comprehensive iOS simulator environment health check, validating Xcode tools, simulators, runtimes, and disk space. It lists the 6 specific check areas, distinguishing it from sibling tools like simctl-list or xcodebuild-version. The verb 'performs a complete diagnostic check' 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool: before CI/CD pipeline execution, when troubleshooting operations fail unexpectedly, and to validate the entire toolchain. It also includes related tools (simctl-list, simctl-create, simctl-suggest) that can be used after the health check, though it doesn't explicitly state when NOT to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-installInstall App on SimulatorA
Idempotent

simctl-install

Install iOS apps to simulators for testing.

Overview

Installs a built .app bundle to a simulator device, making it available for launching and testing. Validates the app bundle format and simulator state before installation. Fast installation completes in seconds for quick test iterations.

Parameters

Required

  • udid (string): Simulator UDID (from simctl-list)

  • appPath (string): Path to .app bundle (e.g., /path/to/MyApp.app)

Returns

Installation status with app name, simulator info (name, state, availability), success indicator, command output, and guidance for next steps (launch, get container, uninstall).

Examples

Install from Xcode build output

await simctlInstallTool({
  udid: 'ABC-123-DEF',
  appPath: '/Users/dev/Library/Developer/Xcode/DerivedData/MyApp-xxx/Build/Products/Debug-iphonesimulator/MyApp.app'
});

Install to specific simulator

await simctlInstallTool({
  udid: 'TEST-DEVICE-UDID',
  appPath: '/path/to/MyApp.app'
});
  • simctl-launch: Launch installed app

  • simctl-uninstall: Remove app from simulator

  • simctl-get-app-container: Get app filesystem container path

Notes

  • App path must point to .app bundle (not .ipa)

  • Fast installation - completes in seconds

  • Validates app bundle format and simulator state

  • Extracts app name from bundle path automatically

  • Deploys built apps directly from Xcode DerivedData

  • Use for quick test iterations and automated test pipelines

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
appPathYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool validates the app bundle format and simulator state before installation, and that it extracts the app name automatically. It also states it is fast (completes in seconds). While annotations already indicate idempotentHint=true and destructiveHint=false, the description adds context about validation and speed, which is useful beyond the annotations. It does not mention permission requirements or reversibility, but given the annotation coverage, this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes) and is appropriately sized. It front-loads the essential purpose and parameters, and each section adds value without redundancy. The examples are concrete and guide usage, making the description efficient and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for an install tool: it covers the purpose, parameters, return value (installation status and next-step guidance), and usage context. It mentions that the tool supports deploying from Xcode DerivedData and is suitable for fast iterations, which is practical context. Given no output schema exists, the description's explanation of return data is sufficient. The related tools section also fills the context for subsequent actions, making the definition self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides only property names and types with no descriptions (0% schema coverage), so the description must compensate. The description explains that udid is the simulator UDID and appPath is the path to the .app bundle, with an example path. This adds necessary semantics beyond the bare schema, but it could be more explicit about the format of udid (e.g., how to obtain it from simctl-list) and the expected structure of the app bundle. Still, it meets the baseline for compensating for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: installing iOS apps to simulators for testing. It specifies the resource (.app bundle) and the action (install), and distinguishes it from siblings like simctl-launch and simctl-uninstall by focusing on the installation step. The related tools section further clarifies its role in the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: for installing built app bundles to simulators, specifically for quick test iterations and automated test pipelines. It also names related tools (simctl-launch, simctl-uninstall, simctl-get-app-container) and their purposes, implicitly directing agents to use them for subsequent steps. The notes clarify that app path must be a .app bundle, not .ipa, preventing common misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-ioSimulator Screenshot/Video CaptureA

simctl-io

Capture screenshots or record videos from iOS simulators with automatic optimization.

What it does

Captures simulator screen as optimized PNG images or records video with configurable codecs. Screenshots are automatically resized to tile-aligned dimensions for token efficiency and support semantic naming for AI agent reasoning.

Parameters

  • udid (string, optional): Simulator UDID (auto-detects booted device if omitted)

  • operation (string, required): "screenshot" or "video"

  • outputPath (string, optional): Custom file path (auto-generated if omitted)

  • codec (string, optional): Video codec - h264, hevc, or prores (default: h264)

  • size (string, optional): Screenshot size - half, full, quarter, thumb (default: half)

  • appName (string, optional): App name for semantic naming

  • screenName (string, optional): Screen/view name for semantic naming

  • state (string, optional): UI state for semantic naming

Screenshot Size Optimization

Screenshots are automatically optimized for token efficiency:

  • half (default): 256×512 pixels, 1 tile, 170 tokens (50% savings)

  • full: Native resolution, 2 tiles, 340 tokens

  • quarter: 128×256 pixels, 1 tile, 170 tokens

  • thumb: 128×128 pixels, 1 tile, 170 tokens

Semantic Naming (LLM Optimization)

Provide appName, screenName, and state to generate semantic filenames:

  • Format: {appName}_{screenName}_{state}_{date}.png

  • Example: MyApp_LoginScreen_Empty_2025-01-23.png

  • Enables AI agents to reason about screen context and track state progression

Returns

JSON response with:

  • File path and size information

  • Screenshot optimization metadata (dimensions, token count, savings)

  • Coordinate transform for mapping resized coordinates to device

  • Semantic metadata when provided

  • Guidance for viewing and using the capture

Examples

Capture optimized screenshot (default 256×512)

await simctlIoTool({
  udid: 'device-123',
  operation: 'screenshot'
})

Capture full-size screenshot

await simctlIoTool({
  udid: 'device-123',
  operation: 'screenshot',
  size: 'full'
})

Capture with semantic naming

await simctlIoTool({
  udid: 'device-123',
  operation: 'screenshot',
  appName: 'MyApp',
  screenName: 'LoginScreen',
  state: 'Empty'
})

Record video with custom codec

await simctlIoTool({
  udid: 'device-123',
  operation: 'video',
  codec: 'hevc'
})

Common Use Cases

  1. UI testing: Capture screenshots for visual regression testing

  2. Bug reporting: Record videos demonstrating issues

  3. Documentation: Create screenshots for app documentation

  4. State tracking: Use semantic naming to track UI state progression

  5. Token optimization: Use half/quarter sizes for LLM-based analysis

Coordinate Transform

When screenshots are resized (size ≠ 'full'), a coordinate transform is provided:

  • scaleX: Multiply screenshot X coordinates by this to get device coordinates

  • scaleY: Multiply screenshot Y coordinates by this to get device coordinates

  • guidance: Human-readable scaling instructions

This enables accurate element tapping even with optimized screenshots.

Important Notes

  • Auto-detection: If udid is omitted, automatically uses the booted device

  • Temp files: Screenshots saved to /tmp unless custom path specified

  • Video recording: Press Ctrl+C to stop video recording

  • Simulator must be booted: Operations require running simulator

  • File permissions: Ensure output path is writable

Error Handling

  • Simulator not booted: Indicates simulator must be booted first

  • Simulator not found: Validates simulator exists in cache

  • File path errors: Reports if output path is not writable

  • Invalid operation: Validates operation is "screenshot" or "video"

Next Steps After Capture

  1. View screenshot: open "<file-path>"

  2. Copy to clipboard: pbcopy < "<file-path>"

  3. Analyze with LLM: Use optimized size for token-efficient analysis

  4. Use coordinates: Apply transform to map screenshot coords to device

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNo
udidYes
codecNo
stateNo
appNameNo
operationYes
outputPathNo
screenNameNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal (all false hints), so the description carries the burden. It discloses key behaviors: auto-detection of booted device, automatic resizing to tile-aligned dimensions, temp file location (/tmp), Ctrl+C to stop video recording, simulator must be booted, and coordinate transform for resized screenshots. It also explains error handling. This goes well beyond the annotations, though it doesn't explicitly state that screenshots are written to disk (implied by 'saved to /tmp') or discuss idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (What it does, Parameters, Size Optimization, Semantic Naming, Returns, Examples, Use Cases, Coordinate Transform, Important Notes, Error Handling, Next Steps). It front-loads the core purpose and parameters. Some redundancy exists (e.g., size details repeated in Parameters and Size Optimization sections), but the structure makes it scannable and each section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 params, 2 required, 3 enums, no output schema), the description is remarkably complete. It covers input semantics, output structure (JSON with file path, optimization metadata, coordinate transform), error handling, prerequisites (booted simulator), and post-capture steps. The examples cover all major operations. Nothing critical is missing 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.

Parameters4/5

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. It does: each parameter is listed with type, required/optional status, and meaning. It adds semantic context for size (token efficiency, pixel dimensions), codec (h264/hevc/prores), and semantic naming parameters (appName, screenName, state) with filename format examples. The description adds significant value beyond the bare schema, though it doesn't document every nuance (e.g., outputPath format).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool captures screenshots or records videos from iOS simulators, with a specific verb ('Capture') and resource ('iOS simulators'). It distinguishes itself from sibling tools like simctl-list, simctl-boot, and the standalone 'screenshot' tool by focusing on capture with optimization and semantic naming. The title and description align well.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance through 'Common Use Cases' (UI testing, bug reporting, documentation, state tracking, token optimization) and 'Important Notes' (auto-detection, temp files, video recording, simulator must be booted). It also implicitly differentiates from siblings by focusing on capture rather than management or inspection. The 'Next Steps After Capture' section adds practical usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-launchLaunch App on SimulatorA

simctl-launch

Launch an iOS app on a simulator with support for custom arguments and environment variables.

What it does

Starts an iOS app on a booted simulator, optionally passing command-line arguments and environment variables. Returns the process ID of the launched app for tracking.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • bundleId (string, required): App bundle ID (e.g., com.example.MyApp)

  • arguments (string[], optional): Command-line arguments to pass to the app

  • environment (object, optional): Environment variables to set (automatically prefixed with SIMCTL_CHILD_)

Returns

JSON response with:

  • Process ID of the launched app

  • Launch status and command executed

  • Guidance for next steps (terminating, opening URLs, checking container)

Examples

Simple app launch

await simctlLaunchTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp'
})

Launch with debug arguments

await simctlLaunchTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  arguments: ['--verbose', '--debug']
})

Launch with environment variables

await simctlLaunchTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  environment: { DEBUG: '1', API_URL: 'https://staging.example.com' }
})

Common Use Cases

  1. Debug launches: Start app with debug flags enabled

  2. API environment switching: Set staging/production API URLs

  3. Feature flags: Enable experimental features via environment

  4. Test scenarios: Configure app behavior for specific test cases

  5. Deep link testing: Launch app then open URLs with simctl-openurl

Important Notes

  • Simulator must be booted: Use simctl-boot first if simulator is not running

  • App must be installed: Use simctl-install to install app first

  • Environment variables: Automatically prefixed with SIMCTL_CHILD_ for simctl compatibility

  • Process ID tracking: Returned PID can be used to monitor or terminate the app

Error Handling

  • App not installed: Returns error if app bundle is not found

  • Simulator not booted: Indicates simulator must be booted first

  • Invalid bundle ID: Validates bundle ID format (must contain '.')

  • Simulator not found: Validates simulator exists in cache

Next Steps After Launch

  1. Terminate app: simctl-terminate <udid> <bundleId>

  2. Open URL/deep link: simctl-openurl <udid> myapp://deeplink

  3. Check app container: simctl-get-app-container <udid> <bundleId>

  4. Send push notification: simctl-push <udid> <bundleId> <payload>

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
bundleIdYes
argumentsNo
environmentNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations provide no safety hints (all false), so the description carries the full burden. It discloses that launching is a state-changing operation, returns a process ID, explains environment variable prefixing (SIMCTL_CHILD_), and details error handling and next steps. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but well-structured with clear sections and front-loaded summary. Every section adds value (examples, use cases, errors, next steps). While some redundancy exists (e.g., prerequisites repeated in notes and errors), it remains organized and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested object parameter, no output schema, minimal annotations), the description covers parameters, return format, prerequisites, error conditions, and post-launch actions. An agent has everything needed to invoke it correctly without external references.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate. It explains each parameter, including the origin of udid (from simctl-list), bundleId format, arguments as array, and environment object with automatic prefix. Examples illustrate usage, providing far more meaning than the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool launches an iOS app on a booted simulator with optional arguments and environment variables, and returns a process ID. It is specific about the resource (simulator/app) and action, and distinct from sibling tools like simctl-install or idb-launch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

A 'Common Use Cases' section lists when to use the tool, and prerequisites (simulator booted, app installed) are explicitly stated. However, it does not explicitly contrast with alternatives like idb-launch or mention when not to use it, so it falls short of full explicitness.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-listList SimulatorsA
Read-onlyIdempotent

simctl-list

List iOS simulators with intelligent progressive disclosure and caching.

Overview

Retrieves comprehensive simulator information including devices, runtimes, and device types. Returns concise summaries by default with cache IDs for progressive access to full details, preventing token overflow while maintaining complete functionality. Shows booted devices and recently used simulators first for faster workflows. Full output mode limits results to the most recently used devices for efficient browsing.

Parameters

Required

None - all parameters are optional

Optional

  • deviceType (string): Filter by device type (e.g., "iPhone", "iPad")

  • runtime (string): Filter by iOS runtime version (e.g., "17", "iOS 17.0")

  • availability (string, default: "available"): Filter by availability ("available", "unavailable", "all")

  • outputFormat (string, default: "json"): Output format ("json" or "text")

  • concise (boolean, default: true): Return concise summary with cache ID

  • max (number, default: 5): Maximum devices to return in full mode, sorted by lastUsed date (most recent first)

Returns

  • Concise mode: Summary with cacheId for detailed retrieval via simctl-get-details

  • Full mode: Limited device list (default 5 most recently used) with metadata showing total available and limit applied

Device Limiting in Full Mode

When concise: false, the response includes:

  • devices: Top N devices across all runtimes, sorted by lastUsed date (most recent first)

  • metadata: Shows total devices in cache, devices returned, and limit applied

  • Devices without lastUsed date are placed at the end

  • Total limit applies across all runtimes, not per-runtime

Examples

Get concise summary (default - prevents token overflow)

await simctlListTool({});

Get full list for iPhone devices (limited to 5 most recent)

await simctlListTool({
  deviceType: "iPhone",
  concise: false
});

Get full list with custom device limit

await simctlListTool({
  concise: false,
  max: 10
});

Filter by iOS version

await simctlListTool({ runtime: "17.0" });
  • simctl-get-details: Retrieve full device list using cache ID (bypasses max limit)

  • simctl-boot / simctl-shutdown: Boot, shutdown, or manage specific simulators

  • simctl-install / simctl-launch: Install and launch apps on simulators

Notes

  • Prevents token overflow (raw output = 10k+ tokens) via concise summaries and device limiting

  • Default max=5 limits output to ~2.5k tokens (90% reduction from full 50-device list)

  • 1-hour intelligent caching eliminates redundant queries

  • Shows booted devices and recently used simulators first in concise mode

  • Use simctl-get-details with cacheId for progressive access to full data (ignores max limit)

  • Device sorting: mostRecent (with lastUsed) → oldest (with lastUsed) → unknown (no lastUsed)

  • Smart filtering by device type, runtime, and availability

  • Essential: Use this instead of 'xcrun simctl list' for better performance

ParametersJSON Schema
NameRequiredDescriptionDefault
maxNo
conciseNo
runtimeNo
deviceTypeNo
availabilityNoavailable
outputFormatNojson

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds substantial behavioral context beyond annotations: 1-hour caching, token-overflow prevention, default max=5, device sorting by lastUsed, metadata shape, and the cacheId handoff to simctl-get-details. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with headers, examples, and a related-tools section, and key facts are front-loaded. However, some information is repeated across Overview, Device Limiting, and Notes – e.g., token-overflow prevention, booted/recent sorting, and the cacheId workflow – so not every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description fully explains return behavior in both concise and full modes, the metadata fields, the limiting rule across runtimes, caching behavior, and includes multiple usage examples. It also routes to the correct sibling for full detail, making it complete for tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It documents every parameter with type, default, and meaning, including non-obvious semantics like max applying only in full mode and sorting by lastUsed date. It also provides concrete filter examples for deviceType and runtime.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List iOS simulators'. It also distinguishes itself from the sibling tool simctl-get-details by explaining the concise-vs-full progressive disclosure model, so an agent can tell them apart immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use concise mode vs full mode, directs agents to simctl-get-details for full cached data, lists related tools for other operations, and even says to prefer this tool over 'xcrun simctl list'. This is explicit when-to-use guidance with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-locationSimulate LocationA
Idempotent

simctl-location

Simulate GPS location on an iOS simulator — set fixed coordinates, use city presets, play back GPX routes, animate along waypoints, or clear the override.

What it does

Wraps xcrun simctl location <udid> set/clear/start/run/list to give full control over the simulated GPS position. Exactly one action must be specified per call.

Parameters

  • udid (string, optional): Simulator UDID. Defaults to the booted simulator if omitted.

Actions (exactly one required)

Action

Params

Description

Coordinate

lat (number) + lng (number)

Set fixed lat/lng

City preset

city (string)

Named city from built-in list

GPX scenario

gpx (string)

Run a built-in scenario by name

Waypoints

waypoints (string) + optional speed (number, m/s, default 20)

Animate route

Clear

clear: true

Remove location override

List scenarios

listScenarios: true

List available GPX scenario names

City Presets

dublin, london, newyork, sanfrancisco, tokyo, sydney, paris, berlin, beijing, mumbai, cairo, saopaulo, losangeles

Aliases also accepted: nyc (→ newyork), sf (→ sanfrancisco), la (→ losangeles)

Coordinate Validation

  • Latitude: -90 to 90

  • Longitude: -180 to 180

Waypoints Format

Whitespace-separated lat,lng pairs. At least 2 required.

"53.34,-6.26 51.50,-0.12 48.85,2.35"

Returns

JSON response with action, udid, success, message, action-specific fields, and guidance.

Examples

Set coordinates

await simctlLocationTool({ lat: 53.3498, lng: -6.2603 })

City preset

await simctlLocationTool({ city: 'Dublin' })
await simctlLocationTool({ city: 'nyc' })

GPX scenario

await simctlLocationTool({ gpx: 'FreewayDrive' })

Waypoint animation

await simctlLocationTool({ waypoints: '53.34,-6.26 51.50,-0.12', speed: 10 })

Clear override

await simctlLocationTool({ clear: true })

List scenarios

await simctlLocationTool({ listScenarios: true })
ParametersJSON Schema
NameRequiredDescriptionDefault
gpxNo
latNo
lngNo
cityNo
udidNo
clearNo
speedNo
waypointsNo
listScenariosNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false. The description adds substantial behavioral context: it wraps xcrun simctl location, explains that clear removes the override, specifies coordinate validation, details the waypoints format, and documents the exact return structure. This goes far beyond the annotations and fully discloses the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but meticulously structured with clear section headings (Parameters, City Presets, Coordinate Validation, Waypoints Format, Returns, Examples). It front-loads a concise summary, and every section earns its place by addressing a distinct aspect of the tool. The use of tables and code examples improves scannability without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 parameters, multiple modes, no output schema), the description is remarkably complete. It covers all parameters, validates inputs, explains the return JSON, provides realistic examples, and clarifies constraints like 'exactly one action'. Nothing an agent needs to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully document all 9 parameters. It does so comprehensively with a dedicated table mapping each parameter to its action, including defaults (udid), validation ranges (lat/lng), format specifications (waypoints), and even city aliases. No parameter is left unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb (simulate) and resource (GPS location on an iOS simulator) and enumerates all distinct actions (set coordinates, city presets, GPX routes, waypoint animation, clear, list). It is specific and leaves no ambiguity about the tool's scope, and it naturally stands apart from sibling simctl tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on how to invoke the tool, including the requirement that exactly one action be specified and the default for udid. It does not explicitly name alternatives or state when not to use it, but given there is no direct sibling for location simulation, the guidance is sufficient. A 4 reflects the absence of explicit exclusion criteria while acknowledging the implied usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-openurlOpen URL on SimulatorA

simctl-openurl

Open URLs in a simulator, including web URLs, deep links, and special URL schemes.

What it does

Opens a URL in the simulator, which can be a web URL (http/https), custom app deep link (myapp://), or special URL scheme (mailto:, tel:, sms:). The system will route the URL to the appropriate app handler.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • url (string, required): URL to open (e.g., https://example.com or myapp://deeplink?id=123)

Supported URL Schemes

  • HTTP/HTTPS: Web URLs (opens in Safari)

  • Custom schemes: Deep links to your app (myapp://, yourapp://)

  • mailto: Email composition (opens Mail app)

  • tel: Phone dialer (opens Phone app on iPhone)

  • sms: SMS composition (opens Messages app)

  • facetime: FaceTime calls

  • maps: Apple Maps URLs

Returns

JSON response with:

  • URL open status

  • Detected URL scheme

  • Guidance for testing URL handling and deep links

Examples

Open web URL

await simctlOpenUrlTool({
  udid: 'device-123',
  url: 'https://example.com'
})
await simctlOpenUrlTool({
  udid: 'device-123',
  url: 'myapp://open?id=123&action=view'
})
await simctlOpenUrlTool({
  udid: 'device-123',
  url: 'mailto:test@example.com?subject=Hello'
})
await simctlOpenUrlTool({
  udid: 'device-123',
  url: 'tel:+1234567890'
})

Common Use Cases

  1. Deep link testing: Verify app handles custom URL schemes correctly

  2. Universal links: Test https:// URLs that open your app

  3. Navigation testing: Confirm deep links navigate to correct screens

  4. Parameter parsing: Verify URL parameters are parsed correctly

  5. Fallback handling: Test behavior when no handler is registered

Important Notes

  • Simulator must be booted: URLs can only be opened on running simulators

  • Handler registration: Custom schemes require an app that handles them

  • URL encoding: Ensure URL parameters are properly encoded

  • Timing: Consider launching app first if testing immediate URL handling

Error Handling

  • No handler registered: Error if no app handles the URL scheme

  • Simulator not booted: Indicates simulator must be booted first

  • Invalid URL format: Validates URL has proper scheme and format

  • Simulator not found: Validates simulator exists in cache

  1. Install app: simctl-install <udid> /path/to/App.app

  2. Launch app: simctl-launch <udid> <bundleId>

  3. Open deep link: simctl-openurl <udid> myapp://route?param=value

  4. Take screenshot: simctl-io <udid> screenshot to verify navigation

  5. Check logs: Monitor console for URL handling logs

Testing Strategies

  • Parameter variations: Test different query parameters

  • Invalid URLs: Verify error handling for malformed URLs

  • Background handling: Test URLs when app is backgrounded

  • Fresh launch: Test URLs when app is not running

  • State preservation: Verify app state is maintained after URL handling

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
udidYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false, so the description carries the full burden. It states that URLs are routed to the appropriate handler, lists supported schemes, and describes error conditions (no handler, simulator not booted, invalid URL) and return format (JSON with status and detected scheme). It also notes prerequisites like the simulator being booted. This goes beyond the annotations and provides valuable behavioral context for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is thorough but verbose, running many sections: 'What it does', 'Parameters', 'Supported URL Schemes', 'Returns', 'Examples', 'Common Use Cases', 'Important Notes', 'Error Handling', 'Deep Link Testing Workflow', and 'Testing Strategies'. It is well-structured and front-loaded with a summary, but significant redundancy exists (e.g., use cases overlap with testing strategies). For a tool with only two parameters, the length is excessive, though each section does add some value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains return values ('JSON response with URL open status, detected URL scheme, guidance'). It covers error scenarios, prerequisites, and supported URL schemes comprehensively. The workflow integrates with sibling tools (install, launch) and mentions taking screenshots via simctl-io, providing a complete picture of how to use this tool in context. 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.

Parameters5/5

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 explicitly documents both parameters: udid (stated as coming from simctl-list) and url (with examples of web, deep links, and mailto/tel). It clarifies the expected format for url via the 'Supported URL Schemes' section and provides multiple code examples showing valid values. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear statement: 'Open URLs in a simulator, including web URLs, deep links, and special URL schemes.' It names the verb (open), resource (URL), and scope (simulator), and further differentiates by listing supported scheme categories. This distinguishes it from sibling tools like simctl-launch (which launches apps) and simctl-install (which installs apps).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a 'Common Use Cases' section (deep link testing, universal links, navigation testing) and a 'Deep Link Testing Workflow' that shows it as step 3 after install and launch. This gives implicit context for when to use it, though it does not explicitly contrast with alternatives like idb-launch or simctl-launch. The workflow implies 'open URLs' is separate from launching, but no explicit 'use this instead of X' statement exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-pbcopyCopy Text to Simulator ClipboardA
Idempotent

simctl-pbcopy

Copy text to simulator's clipboard for testing paste operations and UIPasteboard APIs.

What it does

Copies text to the simulator's pasteboard (UIPasteboard.general), making it available for apps to access via standard pasteboard APIs. Useful for testing paste functionality without manual interaction.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • text (string, required): Text to copy to clipboard

Returns

JSON response with:

  • Copy operation status

  • Text length and preview

  • Guidance for accessing pasteboard in app

Examples

Copy simple text

await simctlPbcopyTool({
  udid: 'device-123',
  text: 'Hello World'
})

Copy URL

await simctlPbcopyTool({
  udid: 'device-123',
  text: 'https://example.com/path?param=value'
})

Copy JSON data

await simctlPbcopyTool({
  udid: 'device-123',
  text: JSON.stringify({ key: 'value', number: 123 })
})

Common Use Cases

  1. Paste testing: Test text field paste functionality

  2. URL handling: Test app URL detection from clipboard

  3. Data import: Test importing data via clipboard

  4. Share functionality: Test receiving shared text content

  5. Clipboard monitoring: Test apps that monitor pasteboard changes

How Apps Access the Text

Apps can access the clipboard text using:

if let text = UIPasteboard.general.string {
    // Use the pasted text
}

Or for URLs:

if let url = UIPasteboard.general.url {
    // Handle the URL
}

Important Notes

  • Immediate availability: Text is available on pasteboard immediately

  • Simulator-specific: Each simulator has its own separate pasteboard

  • String only: Only supports string data (no images, files, or custom types)

  • Persistent: Clipboard content persists until overwritten or simulator resets

Error Handling

  • Empty text: Error if text string is empty

  • Simulator not found: Validates simulator exists in cache

  • Write failure: Reports if clipboard operation fails

Testing Workflow

  1. Copy text: simctl-pbcopy <udid> "Test text to paste"

  2. Launch app: simctl-launch <udid> <bundleId>

  3. Navigate to input: Use app to navigate to text field

  4. Test paste: App should detect clipboard content

  5. Take screenshot: simctl-io <udid> screenshot to verify paste

Use Cases by Category

Authentication Testing

  • Copy and paste email addresses

  • Copy and paste passwords (for test accounts only!)

  • Copy verification codes from clipboard

URL Handling

  • Copy URLs and test app deep link detection

  • Test universal link handling from clipboard

  • Verify URL parameter parsing

Data Import

  • Copy JSON/CSV data for import testing

  • Test clipboard-based data transfer

  • Verify data format validation

UX Testing

  • Test long-press paste menu appearance

  • Verify paste button states

  • Test clipboard change notifications

Clipboard Monitoring

Some apps monitor clipboard changes. To test this:

  1. Launch app first

  2. Copy text to clipboard

  3. App should detect and respond to clipboard change

  4. Take screenshot to verify UI update

Limitations

  • String data only: Cannot copy images, files, or custom types

  • No rich text: Only plain text is supported

  • No pasteboard metadata: Cannot set pasteboard change count or other metadata

  • Simulator scope: Clipboard is not shared with host macOS clipboard

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
udidYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations carry idempotentHint=true and destructiveHint=false, and the description adds substantial behavioral context: immediate pasteboard availability, simulator-specific clipboard isolation, string-only support, persistence until overwritten, and clear error-handling cases. It also discloses limitations such as no images, files, rich text, or pasteboard metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with headers and front-loaded purpose, but it is considerably longer than needed. Sections like 'Common Use Cases' and 'Use Cases by Category' overlap, and the string-only limitation is repeated in multiple places, which affects conciseness even though the organization remains clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers inputs, output guidance, error handling, limitations, and realistic usage scenarios, including code snippets for how apps access the clipboard. With no output schema present, this description provides enough context for an agent to invoke the tool correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate for undocumented parameters. It provides a 'Parameters' section explaining udid as the simulator UDID from simctl-list and text as the text to copy, reinforced by multiple concrete TypeScript examples including URL and JSON payloads.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pairing: 'Copy text to simulator's clipboard' for testing paste operations and UIPasteboard APIs. It clearly differentiates the tool's clipboard-specific role from other simctl siblings like simctl-launch or simctl-openurl.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives extensive when-to-use context: testing paste functionality, URL handling, data import, and clipboard monitoring, with explicit testing workflows. It does not explicitly name alternatives or state when not to use this tool, so it misses the upper bound, but the use-case guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-privacyManage App Privacy PermissionsA
Idempotent

simctl-privacy

Manage app privacy permissions on simulators with structured audit trail support.

What it does

Grants, revokes, or resets privacy permissions for apps without requiring user interaction. Supports audit trail tracking for test scenario documentation and verification.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • bundleId (string, required): App bundle ID (e.g., com.example.MyApp)

  • action (string, required): "grant", "revoke", or "reset"

  • service (string, required): Permission service to modify

  • scenario (string, optional): Test scenario name for audit trail

  • step (number, optional): Step number in test scenario

Supported Services

  • camera, microphone, location, contacts, photos

  • calendar, health, reminders, motion, keyboard

  • mediaLibrary, calls, siri, all (for reset)

LLM Optimization

The scenario and step parameters enable structured permission audit trail tracking. This allows AI agents to track permission state changes across test scenarios and verify permissions at each step of a test workflow.

Returns

JSON response with:

  • Permission modification status

  • Audit entry with timestamp and test context

  • Guidance for verification and next steps

Examples

Grant camera permission

await simctlPrivacyTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  action: 'grant',
  service: 'camera'
})

Revoke microphone permission

await simctlPrivacyTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  action: 'revoke',
  service: 'microphone'
})

Reset all permissions

await simctlPrivacyTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  action: 'reset',
  service: 'all'
})

Grant with audit trail tracking

await simctlPrivacyTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  action: 'grant',
  service: 'location',
  scenario: 'LocationTest',
  step: 1
})

Common Use Cases

  1. Permission testing: Verify app behavior with different permission states

  2. Onboarding flows: Test permission request flows without manual interaction

  3. Denied permission handling: Test app behavior when permissions are denied

  4. Permission combinations: Test apps with various permission combinations

  5. Audit trail: Track permission changes across automated test scenarios

Important Notes

  • No user prompts: Permissions are changed without showing system alerts

  • Immediate effect: Changes take effect immediately for running apps

  • App restart: Some permissions may require app restart to take effect

  • Reset behavior: "reset" with "all" service clears all permissions

  • Audit trail: scenario/step parameters create structured test documentation

Error Handling

  • App not installed: Error if app is not installed on simulator

  • Invalid service: Error if service name is not recognized

  • Invalid action: Error if action is not "grant", "revoke", or "reset"

  • Invalid bundle ID: Validates bundle ID format (must contain '.')

Testing Workflow

  1. Reset permissions: Start with clean slate

  2. Grant permission: simctl-privacy <udid> <bundleId> grant camera scenario:"CameraTest" step:1

  3. Launch app: simctl-launch <udid> <bundleId>

  4. Test feature: Use camera feature in app

  5. Take screenshot: simctl-io <udid> screenshot to verify UI

  6. Revoke permission: Test denied permission handling

  7. Verify behavior: Screenshot and check error handling

Permission Testing Strategies

  • Happy path: Grant all permissions, test full functionality

  • Denial path: Deny permissions, verify error handling

  • Mixed state: Some granted, some denied, test partial functionality

  • Reset testing: Test permission request flows from clean state

  • Background permissions: Test location "always" vs "when in use"

Audit Trail Usage

The auditEntry in the response includes:

  • timestamp: When permission was changed

  • action, service, bundleId: What was changed

  • success: Whether change succeeded

  • testContext: scenario and step for test tracking

This enables agents to maintain a complete history of permission changes during testing.

ParametersJSON Schema
NameRequiredDescriptionDefault
stepNo
udidYes
actionYes
serviceYes
bundleIdYes
scenarioNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses meaningful behavioral traits: permissions are changed without system prompts, changes take effect immediately, some permissions may require an app restart, reset clears all permissions, and scenario/step create audit entries. It also documents error conditions, which is valuable operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-organized with clear headings, parameter documentation, examples, and use cases. Some redundancy exists—especially around audit trail tracking, which appears in multiple sections—so it is not maximally concise, but the structure makes it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation tool with no output schema, the description provides a thorough picture: return shape, audit entry fields, error handling, example calls, and workflow guidance. An agent has enough context to invoke the tool correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden, and it succeeds. It defines each parameter, including udid source, bundleId format, action values, service meaning, and scenario/step audit semantics. The Supported Services list and multiple examples further clarify valid combinations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs ('grants, revokes, or resets') and clearly names the resource ('app privacy permissions on simulators'). It goes beyond the generic title by explaining the no-user-interaction behavior and the audit trail, which distinguishes it from other simctl tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Common Use Cases, Testing Workflow, and Permission Testing Strategies give clear, explicit context for when this tool should be used. However, it does not name alternative tools or explicitly state when not to use it, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-pushSend Push NotificationA

simctl-push

Send simulated push notifications to apps on simulators with test context tracking.

What it does

Sends push notifications with custom JSON payloads to apps, simulating remote notifications from APNS. Supports test tracking to verify push delivery and validate app behavior.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • bundleId (string, required): App bundle ID (e.g., com.example.MyApp)

  • payload (string, required): JSON payload with APS dictionary

  • testName (string, optional): Test name for tracking

  • expectedBehavior (string, optional): Expected app behavior description

Payload Format

Must be valid JSON with an "aps" dictionary:

{
  "aps": {
    "alert": "Notification text",
    "badge": 1,
    "sound": "default"
  },
  "custom": "Additional data"
}

LLM Optimization

The testName and expectedBehavior parameters enable structured test tracking. This allows AI agents to verify push notification delivery and validate that app behavior matches expectations (e.g., navigation, UI updates, data refresh).

Returns

JSON response with:

  • Push delivery status

  • Delivery information (sent timestamp)

  • Test context with expected vs actual behavior

  • Guidance for verifying notification handling

Examples

Simple alert notification

await simctlPushTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  payload: JSON.stringify({
    aps: { alert: 'Test notification' }
  })
})

Notification with badge and sound

await simctlPushTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  payload: JSON.stringify({
    aps: {
      alert: 'New message',
      badge: 5,
      sound: 'default'
    }
  })
})

Rich notification with custom data

await simctlPushTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  payload: JSON.stringify({
    aps: {
      alert: {
        title: 'New Order',
        body: 'Order #1234 has been placed'
      },
      badge: 1
    },
    orderId: '1234',
    action: 'view_order'
  })
})

Push with test context tracking

await simctlPushTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  payload: JSON.stringify({
    aps: { alert: 'Product available' },
    productId: '567'
  }),
  testName: 'PushNotification_DeepLinkTest',
  expectedBehavior: 'App navigates to ProductDetail view for product 567'
})

Common Use Cases

  1. Notification delivery testing: Verify app receives and displays notifications

  2. Deep link navigation: Test notification taps navigate to correct screens

  3. Badge updates: Verify badge count is updated correctly

  4. Custom data handling: Test app processes custom payload data

  5. Background behavior: Test app behavior when notification arrives in background

Important Notes

  • App must be running: Launch app first or test background notification handling

  • Payload validation: JSON must be valid and include "aps" dictionary

  • Immediate delivery: Notification is delivered immediately (no delay)

  • No user interaction: Notification appears automatically without tapping

  • Visual verification: Use simctl-io screenshot to confirm notification display

Error Handling

  • Invalid JSON: Error if payload is not valid JSON

  • App not running: May fail if app is not running (test background handling)

  • Simulator not booted: Indicates simulator must be booted first

  • Invalid bundle ID: Validates bundle ID format (must contain '.')

Testing Workflow

  1. Launch app: simctl-launch <udid> <bundleId>

  2. Send push: simctl-push <udid> <bundleId> <payload>

  3. Take screenshot: simctl-io <udid> screenshot to verify delivery

  4. Check navigation: Verify app navigated to expected screen

  5. Validate data: Confirm app processed custom payload data

Test Context Tracking

The testContext in the response includes:

  • testName: Identifier for this push notification test

  • expectedBehavior: What should happen when notification is received

  • actualBehavior: What actually happened (delivery success/failure)

  • passed: Whether test passed

This enables agents to track push notification tests and verify expected behavior.

Advanced Testing

  • Multiple notifications: Send sequential pushes to test badge accumulation

  • Different payload types: Test alert, sound-only, silent notifications

  • Content extensions: Test notification service extensions with custom content

  • Action buttons: Test notification actions and user responses

  • Notification grouping: Test thread-id for notification grouping

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
payloadYes
bundleIdYes
testNameNo
expectedBehaviorNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only sparse annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description carries the full burden and delivers rich behavioral detail: immediate delivery with no delay, no user interaction required, app-must-be-running prerequisite, payload validation requirements, specific error conditions (invalid JSON, un-booted simulator, invalid bundle ID format), and the testContext result with a passed flag. Nothing contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with clear headers and front-loading, but it is substantially bloated. 'LLM Optimization,' 'Returns,' and 'Test Context Tracking' all repeat the same testContext field information, and 'Advanced Testing' drifts into general testing techniques (content extensions, action buttons, grouping) rather than tool usage. Several examples could be condensed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a bare schema (no property descriptions), minimal annotations, and no output schema, this description covers everything an agent needs: input parameters, payload JSON structure, multi-format examples, error behavior, return contract, prerequisites, and a surrounding workflow. An agent could call this tool correctly with only this description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate — and it does. A dedicated Parameters section explains all 5 parameters, the Payload Format section documents the required 'aps' dictionary with a JSON example, and four worked examples show real usage including rich alert objects, badge/sound, custom data, and test-tracking parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb and resource: 'Send simulated push notifications to apps on simulators with test context tracking.' The 'simplified vs. simulated' distinction, the test-context-tracking differentiator, and the payload/aps focus clearly separate it from siblings like simctl-launch, simctl-openurl, and simctl-io.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Common Use Cases' section enumerates five concrete scenarios, and the 'Testing Workflow' section explicitly sequences this tool after simctl-launch and before simctl-io screenshot verification. It also notes the prerequisite that the app must be running. However, it never explicitly names alternatives to avoid or states when not to use this tool (e.g., versus simctl-openurl for direct deep-link testing), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-renameRename SimulatorA
Idempotent

simctl-rename

Rename iOS simulator devices for better organization.

Overview

Changes the display name of a simulator without affecting its UDID or any data. Useful for organizing and identifying simulators with descriptive names. Quick operation completes instantly with no side effects.

Parameters

Required

  • deviceId (string): Device UDID to rename (from simctl-list)

  • newName (string): New display name for the simulator

Returns

Rename status showing old name, new name, confirmation that UDID is unchanged, success indicator, command output, and guidance emphasizing data preservation.

Examples

Rename simulator for clarity

await simctlRenameTool({
  deviceId: 'ABC-123-DEF',
  newName: 'Production Test Device'
});

Organize test devices

await simctlRenameTool({
  deviceId: 'TEST-UDID',
  newName: 'UI Tests - iPhone 16 Pro'
});
  • simctl-list: Find device UDID to rename

  • simctl-create: Create new simulator with specific name

  • simctl-clone: Clone simulator with new name

Notes

  • UDID remains unchanged - only display name is modified

  • All data and configuration preserved

  • Quick operation - completes instantly

  • New name must be unique - cannot duplicate existing names

  • Use descriptive names for better organization and identification

  • Perfect for organizing test devices by purpose or team

ParametersJSON Schema
NameRequiredDescriptionDefault
newNameYes
deviceIdYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (idempotentHint, non-destructive), the description explicitly states that UDID remains unchanged, all data and configuration are preserved, and the operation completes instantly with no side effects. It also discloses a real constraint: 'New name must be unique - cannot duplicate existing names.' This significantly enriches the behavioral contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized into Overview, Parameters, Returns, Examples, Related Tools, and Notes, making it easy to scan. However, it is a bit repetitive, with 'data preservation', 'no side effects', and 'quick operation' restated multiple times. The structure earns points, but some sentences could be trimmed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description discloses the return content (old name, new name, UDID unchanged, success indicator, command output, guidance) and all operating constraints. It also tells the agent where to source the deviceId and how the tool relates to siblings. This is sufficient for correct invocation in most simulated contexts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully explain the parameters. It does: deviceId is described as 'Device UDID to rename (from simctl-list)' and newName as 'New display name for the simulator'. Two examples further clarify the usage, which compensates for the sparse schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a specific verb and resource: 'Rename iOS simulator devices', and states it 'Changes the display name of a simulator without affecting its UDID or any data.' It also distinguishes itself from related tools by listing simctl-list, simctl-create, and simctl-clone in the Related Tools section, so an agent can easily tell this tool apart from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use this tool: organizing and identifying simulators with descriptive names, and it notes that new names must be unique. It names related tools and suggests simctl-list for finding the UDID, but it does not explicitly state when not to use this tool or how to choose between rename, create, and clone in a direct comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-shutdownShutdown SimulatorA
Idempotent

simctl-shutdown

Shutdown iOS simulator devices with intelligent device management.

Overview

Gracefully shuts down one or more iOS simulator devices. Supports shutting down specific devices, all currently booted devices, or all devices at once with smart targeting options. Better error handling with clear feedback when devices cannot be shut down.

Parameters

Required

  • deviceId (string): Device UDID, "booted" for all booted devices, or "all" for all devices

Returns

Shutdown status with device information, duration, success indicator, command output, and next step guidance. Handles common scenarios like device already shutdown gracefully.

Examples

Shutdown specific device

await simctlShutdownTool({ deviceId: 'ABC-123-DEF' });

Shutdown all booted devices

await simctlShutdownTool({ deviceId: 'booted' });

Shutdown all devices

await simctlShutdownTool({ deviceId: 'all' });
  • simctl-boot: Boot device after shutdown

  • simctl-list: Find device UDID to shutdown

  • simctl-delete: Delete device after shutdown (required for deletion)

Notes

  • Smart device targeting: "booted", "all", or specific UDID

  • Graceful shutdown operation

  • Handles "already shutdown" scenario without error

  • State tracking updates internal device state for better recommendations

  • Batch operations efficiently handle multiple device shutdowns

  • Required before device deletion (safety check)

  • Use "booted" to quickly shutdown all running simulators

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceIdYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the idempotentHint and destructiveHint annotations, the description discloses meaningful behaviors: graceful shutdown, handling of 'already shutdown' without error, batch operation efficiency, internal state tracking, and a safety-check relationship with device deletion. These details help an agent predict side effects and downstream requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Overview, Parameters, Returns, Examples, Related Tools, and Notes sections, making it easy to scan. It is somewhat verbose for a single-parameter tool, and some notes repeat earlier content, but every section adds practical value and nothing feels irrelevant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 complete: it documents the only parameter, describes return information, provides examples for all valid value categories, notes edge-case handling, and explains the relationship to deletion and state tracking. With no output schema present, the Returns section helps fill that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no description coverage (0%), but the description fully compensates by explaining that deviceId accepts a UDID, 'booted', or 'all', and illustrates each value with concrete examples. This is exactly the semantic information an agent needs and would not get from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Shutdown iOS simulator devices' and elaborates with a specific verb and resource: 'Gracefully shuts down one or more iOS simulator devices.' It clearly distinguishes the tool from siblings like simctl-boot and simctl-list by naming its exact operation and supported targeting modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Related Tools section explicitly connects simctl-shutdown to simctl-boot, simctl-list, and simctl-delete, and notes it is 'Required before device deletion.' It also gives practical guidance like using 'booted' for quick shutdown of all running simulators. It stops short of explicit when-not-to-use exclusions, such as distinguishing shutdown from simctl-terminate, so it is slightly below a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-status-barOverride Simulator Status BarA
Idempotent

simctl-status-bar

Override or clear simulator status bar appearance for consistent screenshots and UI testing.

What it does

Controls the simulator's status bar appearance, allowing you to set specific time, network status, battery level, and WiFi state. Useful for creating consistent screenshots and testing app behavior under different device conditions.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • operation (string, required): "override" or "clear"

  • time (string, optional): Time in 24-hour format (e.g., "9:41", "23:59")

  • dataNetwork (string, optional): Network type - none, 1x, 3g, 4g, 5g, lte, lte-a

  • wifiMode (string, optional): WiFi state - active, searching, failed

  • batteryState (string, optional): Battery state - charging, charged, discharging

  • batteryLevel (number, optional): Battery percentage 0-100

Returns

JSON response with:

  • Status bar modification status

  • Applied parameters (for override operation)

  • Guidance for verification and testing

Examples

Override with classic Apple time

await simctlStatusBarTool({
  udid: 'device-123',
  operation: 'override',
  time: '9:41',
  batteryLevel: 100
})

Simulate poor network conditions

await simctlStatusBarTool({
  udid: 'device-123',
  operation: 'override',
  dataNetwork: 'none',
  wifiMode: 'failed'
})

Simulate low battery

await simctlStatusBarTool({
  udid: 'device-123',
  operation: 'override',
  batteryState: 'discharging',
  batteryLevel: 15
})

Clear all overrides

await simctlStatusBarTool({
  udid: 'device-123',
  operation: 'clear'
})

Common Use Cases

  1. Consistent screenshots: Set time to 9:41 and battery to 100% for app store screenshots

  2. Network condition testing: Test app behavior with different network types

  3. Low battery testing: Verify app handles low battery warnings correctly

  4. UI testing: Ensure status bar doesn't interfere with visual regression tests

  5. Demo mode: Clean status bar for presentations and demos

Status Bar Parameters

Time

  • Format: 24-hour "HH:MM" (e.g., "9:41", "14:30", "23:59")

  • Apple default: "9:41" (time of original iPhone announcement)

Data Network

  • none: No cellular data

  • 1x: 2G network

  • 3g: 3G network

  • 4g: 4G network

  • 5g: 5G network

  • lte: LTE network

  • lte-a: LTE Advanced

WiFi Mode

  • active: Connected and active

  • searching: Searching for network

  • failed: Connection failed

Battery State

  • charging: Device is charging

  • charged: Fully charged

  • discharging: Running on battery

Battery Level

  • Range: 0-100

  • Shows percentage in status bar

Important Notes

  • Screenshot consistency: Apply overrides before taking screenshots for consistent results

  • Demo mode: Apple often uses 9:41 time and 100% battery for marketing materials

  • Simulator only: Status bar overrides only work on simulators, not real devices

  • Persistent: Overrides persist until cleared or simulator is reset

  • Version compatibility: Some parameters may not work on older iOS versions

Error Handling

  • Invalid time format: Error if time is not in HH:MM format

  • Invalid network type: Error if dataNetwork is not in allowed list

  • Invalid battery level: Error if batteryLevel is not 0-100

  • Simulator not found: Validates simulator exists in cache

App Store Screenshot Best Practices

For app store screenshots, Apple recommends:

  1. Time: "9:41" (Apple's standard)

  2. Battery: 100% (shows full battery icon)

  3. Signal: Full bars (use "lte" or "5g")

  4. WiFi: Active (shows connected)

  5. No notifications or indicators

await simctlStatusBarTool({
  udid: 'device-123',
  operation: 'override',
  time: '9:41',
  dataNetwork: '5g',
  wifiMode: 'active',
  batteryState: 'charged',
  batteryLevel: 100
})

Testing Workflow

  1. Apply overrides: Set desired status bar state

  2. Take screenshot: simctl-io <udid> screenshot to verify

  3. Test app: Launch app and verify it handles the conditions

  4. Clear overrides: Reset to normal state when done

Visual Verification

After applying overrides, always take a screenshot to verify the status bar appears correctly:

simctl-io <udid> screenshot

The status bar changes are visible immediately and affect all screenshots taken while overrides are active.

When to Clear Overrides

  • After taking app store screenshots

  • Before testing features that depend on actual device state

  • When switching between different test scenarios

  • At the end of automated test runs

ParametersJSON Schema
NameRequiredDescriptionDefault
timeNo
udidYes
wifiModeNo
operationYes
dataNetworkNo
batteryLevelNo
batteryStateNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate idempotentHint=true, destructiveHint=false, readOnlyHint=false. The description adds context like 'overrides persist until cleared or simulator is reset', 'simulator only', and version compatibility notes, which are useful. However, it doesn't detail side effects (e.g., if override fails partially) or the exact persistence mechanism beyond a note. It doesn't contradict annotations, so a 3 is fair.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long (500+ words) with extensive examples, best practices, and workflows. While thorough, it includes redundant sections (e.g., status bar parameters repeated in prose and code, multiple example calls). It is front-loaded with purpose, but the verbosity could be trimmed. Score 3 for moderate structure, but it's not concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 params, no output schema, no enum coverage), the description is comprehensive. It covers return values in the 'Returns' section, error handling, verification workflow, and best practices. Nothing essential is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, so the description must compensate, and it does. It exhaustively explains every parameter: time format, allowed values for dataNetwork, wifiMode, batteryState, batteryLevel range, and even examples. It adds enumerations and formats that the schema lacks, making it highly informative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it overrides or clears the simulator status bar appearance, with a specific verb ('override'/'clear') and resource. It distinguishes from siblings by focusing on status bar manipulation, which is unique among simctl tools. The title and description align, and the examples reinforce the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides extensive usage context, including common use cases (screenshots, network testing, low battery), testing workflows, and when to clear overrides. It implicitly differentiates from other simctl tools by focusing on status bar only, but doesn't explicitly say 'use this instead of X for Y' or mention alternatives. Still, the guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-stream-logsStream Simulator LogsA
Read-onlyIdempotent

simctl-stream-logs

Stream real-time console logs from iOS simulator with filtering, severity classification, deduplication, and statistics summary.

What it does

Streams console logs from a simulator in real-time, with support for filtering by process or custom predicates. Captures logs for a specified duration and returns:

  • Structured log entries with timestamps, process names, and per-line severity

  • Statistics summary (totalLines, errors, warnings, info, debug)

  • Top errors and warnings (deduplicated, capped at 15 each)

  • Sample tail of raw log output

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • bundleId (string, optional): Filter logs to specific app bundle ID

  • predicate (string, optional): Custom NSPredicate for log filtering

  • duration (number, optional): Capture duration in seconds (default: 10)

  • capture (boolean, optional): Whether to capture logs (default: true)

  • severity (string | string[], optional): Comma-separated or array of severity levels to include in the returned items. Allowed values: error, warning, info, debug. Default: all four. Statistics always count all severities regardless of this filter.

Severity Classification

Each log line is classified by case-insensitive pattern matching:

Severity

Patterns

error

\berror\b, \bfault\b, \bfailed\b, \bexception\b, \bcrash\b, ❌

warning

\bwarning\b, \bwarn\b, \bdeprecated\b, ⚠️

info

\binfo\b, \bnotice\b, ℹ️

debug

anything that does not match the above

Deduplication

Error and warning lines are deduplicated before appearing in topErrors / topWarnings. The deduplication signature is computed by stripping timestamps (YYYY-MM-DD HH:MM:SS) and process IDs ([1234]) then collapsing whitespace. Duplicate occurrences are collapsed into a single entry with a count field.

Returns

JSON response with:

  • logs: Filtered log entries (severity-filtered, first 100 items)

    • count, predicate, bundleId, duration, severityFilter, items[]

  • statistics: { totalLines, errors, warnings, info, debug }

  • topErrors: Deduplicated error lines, up to 15, each with message and count

  • topWarnings: Deduplicated warning lines, up to 15, each with message and count

  • sampleTail: Last 20 raw log lines

  • guidance: Human-readable summary strings

Examples

Stream all logs for 10 seconds

await streamLogsTool({ udid: 'device-123' })

Stream errors and warnings only for specific app

await streamLogsTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp',
  duration: 30,
  severity: 'error,warning',
})

Stream with custom predicate

await streamLogsTool({
  udid: 'device-123',
  predicate: 'eventMessage CONTAINS "Error" OR eventMessage CONTAINS "Warning"',
  duration: 20,
})

Predicate Syntax

Supports NSPredicate syntax for filtering:

  • Process filtering: process == "MyApp"

  • Content filtering: eventMessage CONTAINS "keyword"

  • Severity filtering: messageType == "Error"

  • Combined filters: process == "MyApp" AND eventMessage CONTAINS "network"

Common predicates:

  • process == "com.example.MyApp" - Filter by bundle ID

  • eventMessage CONTAINS "Error" - Show only errors

  • subsystem == "com.example.networking" - Filter by subsystem

  • messageType IN {"Error", "Fault"} - Show errors and faults

Common Use Cases

  1. App debugging: Stream logs for specific app during testing

  2. Error monitoring: Filter for errors and warnings via severity param

  3. Network debugging: Monitor network-related log messages

  4. Performance tracking: Capture logs during performance tests

  5. Integration testing: Verify expected log output during test runs

Important Notes

  • Timeout buffer: Command timeout is duration + 5 seconds for safety

  • Buffer size: 10MB buffer for log capture to prevent overflow

  • First 100 logs: Returns first 100 severity-filtered log entries to avoid token overflow

  • Statistics always complete: Counts cover all lines regardless of severity filter

  • Dedup on errors/warnings: topErrors and topWarnings collapse repeated messages

Error Handling

  • Missing udid: Error if udid is not provided

  • Simulator not found: Validates simulator exists

  • Command timeout: Times out if duration exceeds limit

  • Buffer overflow: May lose logs if output exceeds 10MB buffer

Duration Guidelines

  • Quick check: 5-10 seconds for basic log verification

  • Feature testing: 15-30 seconds for testing specific features

  • Integration tests: 30-60 seconds for full test scenarios

  • Debug sessions: 60+ seconds for deep debugging sessions

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
captureNo
bundleIdNo
durationNo
predicateNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, and non-destructive behavior, and the description substantially enriches this with concrete runtime traits: 10MB buffer, timeout buffer of duration + 5 seconds, first-100-item log limit, deduplication signature details, and the fact that statistics count all severities regardless of filters. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, the description is well-structured with clear headings: parameters, severity classification, deduplication, returns, examples, predicate syntax, use cases, error handling, and duration guidelines. The core purpose is front-loaded, and each section earns its place by addressing likely agent questions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description thoroughly explains return fields (logs, statistics, topErrors, topWarnings, sampleTail, guidance), error conditions, and runtime limits. An agent has enough information to invoke this tool correctly and interpret results, aside from the minor severity-schema mismatch noted above.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It does so very well for all schema-declared parameters (udid, bundleId, predicate, duration, capture), providing defaults and allowed values. However, it also documents a `severity` parameter that is absent from the input-schema, which could lead an agent to send an invalid argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: "Stream real-time console logs from iOS simulator," then enumerates filtering, severity classification, deduplication, and stats. This clearly differentiates it from siblings like simctl-list and simctl-get-details, which focus on device listing/inspection rather than log streaming.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear use contexts through 'Common Use Cases' and duration guidelines, which help an agent decide when to invoke this tool. It does not explicitly name alternatives or exclusions (e.g., when to use simctl-launch or idb-xctest-list instead), but the context is strong enough to avoid misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-suggestSuggest Best SimulatorA
Read-onlyIdempotent

simctl-suggest

Intelligent simulator suggestion tool.

Overview

Suggests the best simulators for your project based on project preferences (remembered from previous successful builds), recently used simulators, device popularity (iPhone 16 > iPhone 15), and boot performance metrics. Transparent scoring algorithm shows reasoning for each recommendation.

Parameters

Required

None - all parameters are optional

Optional

  • projectPath (string): Project directory for project-specific ranking

  • deviceType (string): Filter suggestions by device type

  • maxSuggestions (number, default: 4): Maximum number of suggestions to return

  • autoBootTopSuggestion (boolean, default: false): Automatically boot top suggestion

Returns

Ranked suggestions with scores, reasoning, boot history, performance metrics, summary of scoring criteria, and guidance for next steps. Each suggestion includes simulator name, UDID, state, availability, score breakdown, and boot performance data.

Examples

Get project-specific suggestions

await simctlSuggestTool({
  projectPath: '/path/to/project'
});

Auto-boot top suggestion

await simctlSuggestTool({
  projectPath: '/path/to/project',
  autoBootTopSuggestion: true
});

Filter by device type

await simctlSuggestTool({
  deviceType: 'iPhone',
  maxSuggestions: 3
});
  • simctl-boot: Boot suggested simulator

  • simctl-list: See all available simulators

  • simctl-health-check: Validate environment health

Notes

  • Scoring algorithm (100 point scale): Project preference (40), Recent usage (40), iOS version (30), Popular model (20), Boot performance (10)

  • Project-aware: Remembers preferred simulator per project

  • Performance metrics: Learns boot times and reliability from usage

  • Popularity ranking: Suggests popular models (iPhone 16 Pro > iPhone 15)

  • Transparent scoring: Shows reasoning for each recommendation

  • Auto-boot option: Optionally boots top suggestion immediately

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceTypeNo
projectPathNo
maxSuggestionsNo
autoBootTopSuggestionNo

TDQS

A3.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations declare readOnlyHint=true and destructiveHint=false, but the description includes an 'autoBootTopSuggestion' parameter that boots a simulator – a state-changing action. This directly contradicts the readOnlyHint. The description also mentions learning from usage and remembering preferences, implying persistent side effects. This is a severe contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes). The overview is front-loaded, examples are practical, and every line adds value. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description adequately describes return values, scoring breakdown, and next steps. It covers all parameters, examples, and related tools. However, the annotation contradiction on auto-boot leaves ambiguity about the tool's side effects, which slightly undermines completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden. It explains each parameter (projectPath, deviceType, maxSuggestions, autoBootTopSuggestion) with descriptions and defaults, and provides varied examples showing usage. This fully compensates for the bare schema and adds clarity beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Suggests the best simulators for your project'. It clearly distinguishes from siblings like simctl-list (listing all simulators) and simctl-boot (booting a specific simulator), making it easy for an agent to know this is the suggestion tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides examples for different use cases (project-specific, auto-boot, device type filter) and lists related tools. However, it does not explicitly state when NOT to use this tool versus alternatives (e.g., 'use simctl-list when you want a raw list'). The context is clear but exclusions are only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-terminateTerminate App on SimulatorA
Idempotent

simctl-terminate

Gracefully terminate a running iOS app on a simulator.

What it does

Stops a running app by sending a termination signal. The app's lifecycle methods (applicationWillTerminate:) will be called, allowing clean shutdown.

Parameters

  • udid (string, required): Simulator UDID (from simctl-list)

  • bundleId (string, required): App bundle ID (e.g., com.example.MyApp)

Returns

JSON response with:

  • Termination status

  • Command executed

  • Guidance for next steps (relaunching, uninstalling, checking container)

Examples

Terminate running app

await simctlTerminateTool({
  udid: 'device-123',
  bundleId: 'com.example.MyApp'
})

Common Use Cases

  1. Clean app restart: Terminate then relaunch to reset app state

  2. Test lifecycle: Verify app handles termination correctly

  3. Memory cleanup: Stop app before running memory-intensive tests

  4. State reset: Terminate app to clear runtime state between test runs

  5. Background testing: Stop foreground app to test background behavior

Important Notes

  • Graceful termination: App lifecycle methods are called for clean shutdown

  • Not running OK: Returns error if app is not running, but can be safely ignored

  • Simulator state: Works on both booted and shutdown simulators

  • No force kill: This is a graceful termination, not a force kill

Error Handling

  • App not running: Error returned but operation is safe to ignore

  • App not installed: Indicates app must be installed first

  • Simulator not booted: Warning shown but termination may still succeed

  • Invalid bundle ID: Validates bundle ID format (must contain '.')

Next Steps After Termination

  1. Launch app again: simctl-launch <udid> <bundleId>

  2. Uninstall app: simctl-uninstall <udid> <bundleId>

  3. Check app container: simctl-get-app-container <udid> <bundleId>

  4. Install new build: simctl-install <udid> /path/to/App.app

Difference from Force Kill

  • Terminate (this tool): Graceful shutdown with lifecycle callbacks

  • Force kill: Immediate termination without cleanup (use system kill command)

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
bundleIdYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already cover read-only, destructive, and idempotency hints, and the description adds substantial behavioral context: applicationWillTerminate is called, terminating a non-running app returns a safe-to-ignore error, it works on booted and shutdown simulators, bundle IDs must contain '.', and it is not a force kill. This goes well beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, parameters, and a clear example, then organizes usage notes, errors, and next steps into labeled sections. It is longer than strictly necessary for a two-parameter tool, and points like 'app not running' and 'graceful/no force kill' are repeated across sections, though the extra detail is mostly useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description still explains the JSON response contents, enumerates error cases (not running, not installed, simulator not booted, invalid bundle ID), and gives follow-up tool references. For a tool with two simple string parameters, this covers all critical invocation and post-action context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates for both parameters. It explains udid as coming from simctl-listennett, provides a concrete bundle ID example, and adds the validation rule that bundle IDs must contain '.', making both parameters meaningful for invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line, 'Gracefully terminate a running iOS app on a simulator,' gives a specific verb and resource. It clearly separates termination from launch/uninstall actions, but it never explicitly distinguishes itself from the sibling idb-terminate tool, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Common Use Cases' section and 'Difference from Force Kill' section make the intended contexts explicit, and the 'Next Steps' section names relevant sibling tools. However, there is no explicit guidance about when to prefer simctl-terminate over the alternative idb-terminate sibling, so exclusion guidance is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simctl-uninstallUninstall App from SimulatorA
DestructiveIdempotent

simctl-uninstall

Uninstall iOS apps from simulators.

Overview

Removes an installed app from a simulator by its bundle ID. This cleans up all app data, preferences, and the app bundle itself from the simulator. Useful for clean testing, data removal, space management, and workflow automation.

Parameters

Required

  • udid (string): Simulator UDID (from simctl-list)

  • bundleId (string): App bundle ID (e.g., com.example.MyApp)

Returns

Uninstall status with bundle ID, simulator info (name, state, availability), success indicator, command output, and guidance for reinstallation or app management.

Examples

Uninstall app from simulator

await simctlUninstallTool({
  udid: 'ABC-123-DEF',
  bundleId: 'com.example.MyApp'
});

Clean install workflow

// Uninstall old version
await simctlUninstallTool({
  udid: 'TEST-DEVICE',
  bundleId: 'com.example.MyApp'
});
// Then reinstall
await simctlInstallTool({
  udid: 'TEST-DEVICE',
  appPath: '/path/to/MyApp.app'
});
  • simctl-install: Reinstall app after uninstall

  • simctl-list: Find simulator UDID

  • simctl-get-app-container: Check app container before uninstall

Notes

  • Bundle ID must follow format: com.company.appname

  • Removes app and all associated data/preferences

  • Validates simulator exists before attempting uninstall

  • Useful for clean testing workflows

  • Frees simulator disk space by removing unused apps

  • Test cycles requiring clean app installs benefit from uninstall automation

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYes
bundleIdYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as destructive and idempotent. The description adds meaningful behavioral detail beyond that: it specifies that all app data, preferences, and the bundle itself are removed, and that it validates simulator existence before uninstalling. No contradiction with annotations; it enriches the safety profile without repeating the hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but well-structured, with clear sections (Overview, Parameters, Returns, Examples, Related Tools, Notes) and the core purpose front-loaded. Every section earns its place – the examples and related tools are practical, and the notes are relevant. It could be tightened slightly (e.g., the Notes repeat some automation benefits), but overall it remains purposeful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, no-output-schema tool, this description is complete. It covers what the tool does, the parameters, the return value, usage examples, related tools, and important caveats (bundle ID format, data removal, simulator validation). Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 – and it does thoroughly. The Parameters section explains udid as 'Simulator UDID (from simctl-list)' and bundleId with an example (com.example.MyApp). The Notes reinforce the bundle ID format. This adds real meaning beyond the bare schema property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Uninstall iOS apps from simulators' and elaborates 'Removes an installed app from a simulator by its bundle ID.' This is a specific verb+resource statement that clearly distinguishes it from siblings like simctl-install (installation) and simctl-get-app-container (inspection). The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Related Tools' section explicitly names simctl-install, simctl-list, and simctl-get-app-container, providing alternatives for adjacent tasks. It also gives usage scenarios ('clean testing, data removal, space management') and a clean-install workflow example. However, it stops short of explicit conditionals like 'use simctl-install when you need to install instead' – the guidance is present but not as crisply routed as it could be.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test-record-reportGenerate Test Recording ReportA
Idempotent

test-record-report

Generate a markdown report from a recorded test session created by test-record-step.

What it does

Reads the session's steps.json and produces a structured report.md file:

  • Header with test name, date, step count, and duration

  • Per-step sections with screenshot image links, assertions, metadata, and element counts

  • Summary section with totals

The report is written to <recordingsRoot>/<sessionName>/report.md and also returned in the response for immediate consumption.

Parameters

  • sessionName (string, required): Session name matching prior test-record-step calls

  • testName (string, optional): Title for the report (defaults to sessionName)

Returns

JSON with { sessionName, testName, reportPath, stepCount, markdown } plus guidance. Throws McpError InvalidRequest if session or steps are missing.

Examples

Basic report

await testRecordReportTool({ sessionName: "login-flow" })

Named report

await testRecordReportTool({
  sessionName: "login-flow",
  testName: "Login Flow — Happy Path"
})

Typical Workflow

  1. test-record-step({ sessionName: "my-test", label: "App launched" })

  2. test-record-step({ sessionName: "my-test", label: "Login tapped", assertion: "Login form visible" })

  3. test-record-step({ sessionName: "my-test", label: "Logged in", metadata: { user: "test@example.com" } })

  4. test-record-report({ sessionName: "my-test", testName: "Login Flow" })

ParametersJSON Schema
NameRequiredDescriptionDefault
testNameNoReport title (defaults to sessionName)
sessionNameYesRecording session name

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses key behavioral traits: it reads steps.json, writes report.md to a specific path, returns structured JSON, and throws McpError InvalidRequest for missing sessions/steps. This adds real operational context without contradicting the idempotentHint or readOnlyHint annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: what it does, parameters, returns, examples, and workflow. It is longer than necessary but each section serves a purpose. Some redundancy exists between the examples and typical workflow, but overall the organization is helpful and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description compensates by explicitly listing the return JSON fields and error behavior. It also covers the write side effect and target path, making the tool fully callable without external documentation. Given only two simple parameters, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics: sessionName must match a prior test-record-step call, and testName defaults to sessionName. The named examples with concrete values further clarify both parameters beyond the schema's brief descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Generate a markdown report from a recorded test session created by test-record-step.' It clearly distinguishes the tool from its sibling test-record-step by positioning it as the final report-generation step in a recording workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes when to use the tool: after test-record-step calls, using a sessionName that matches prior calls. It provides a 'Typical Workflow' sequence and examples. However, it does not explicitly name alternatives or when-not-to-use scenarios, though no direct alternative report tool is apparent among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test-record-stepRecord Test StepA

test-record-step

Record a single named step in a test session, capturing a screenshot and accessibility tree snapshot.

What it does

Maintains a persistent session directory under ~/.xc-mcp/test-recordings/<sessionName>/ (override root with env var XC_MCP_RECORDINGS_DIR). Each call:

  1. Creates the session directory + steps.json on first call

  2. Captures a screenshot via xcrun simctl io <udid|booted> screenshot

  3. Captures an accessibility tree via idb ui describe-all (tolerates idb absence)

  4. Appends a step record to steps.json with sequential index (001, 002, …)

Session layout:

~/.xc-mcp/test-recordings/<sessionName>/
  steps.json          – session metadata + all step records
  screenshots/        – NNN-<label>.png per step
  accessibility/      – NNN-<label>.json per step (idb NDJSON or error stub)
  report.md           – generated by test-record-report

Parameters

  • sessionName (string, required): Unique session identifier (used as directory name)

  • label (string, required): Human-readable description of this step

  • udid (string, optional): Simulator UDID — defaults to booted

  • metadata (object, optional): Arbitrary key-value pairs attached to step record

  • assertion (string, optional): Assertion description recorded with step

Returns

JSON with { sessionName, stepIndex, label, screenshot, accessibilityFile, elementCount, timestampMs } plus guidance for next steps.

Examples

Record first step

await testRecordStepTool({ sessionName: "login-flow", label: "App launched" })

Step with assertion and metadata

await testRecordStepTool({
  sessionName: "login-flow",
  label: "Login succeeded",
  assertion: "Home screen is visible",
  metadata: { user: "test@example.com", env: "staging" }
})

Specific simulator

await testRecordStepTool({
  sessionName: "login-flow",
  label: "Credentials entered",
  udid: "device-123"
})
ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
labelYesHuman description of this step
metadataNo
assertionNo
sessionNameYesRecording session name

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the sparse annotations, the description discloses substantial side effects: it creates directories and steps.json, appends sequential step records, captures screenshots via simctl, tolerates idb absence, respects XC_MCP_RECORDINGS_DIR, and defaults udid to booted. This gives the agent a detailed model of what will happen on each call, which is far more than the annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with 'What it does', session layout, parameter list, return shape, and examples. Each section carries needed information, and the opening sentence front-loads the core purpose. Nothing feels redundant or filler; the detail is warranted for a stateful tool with side effects.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and five parameters with nested objects, the description is remarkably complete. It explains persistent storage layout, step numbering, the exact return JSON fields, environment override, error tolerance for idb, and provides three usage examples covering typical scenarios. An agent has enough to invoke the tool correctly without additional investigation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%, but the description compensates by defining every parameter: sessionName is a unique directory name, label is human-readable, udid defaults to booted, metadata is arbitrary key-value pairs, and assertion is a recorded description. Examples show realistic combinations, which significantly adds meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Record a single named step in a test session, capturing a screenshot and accessibility tree snapshot.' It clearly differentiates this tool from siblings by explaining the persistent session directory and explicitly noting that report.md is generated by test-record-report, so an agent can distinguish recording steps from generating reports.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: during a test session to record individual steps with screenshot and accessibility data. It also references test-record-report as the tool that generates report.md, which implies the division of labor. However, it does not explicitly state 'use X instead when...' or list exclusion conditions, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

visual-diffCompare Screenshots (Pixel Diff)A
Idempotent

visual-diff

Compare two PNG screenshots pixel-by-pixel using pixelmatch to detect visual regressions. Writes a highlighted diff image and a JSON report to the output directory.

What it does

Reads two PNG files, compares them pixel-by-pixel, and:

  • Reports the number and percentage of differing pixels

  • Determines pass/fail against a configurable threshold

  • Writes diff.png with highlighted differences (red pixels where images differ)

  • Writes diff-report.json with full metrics

Parameters

  • baselinePath (string, required): Path to the baseline (reference) PNG

  • currentPath (string, required): Path to the current (test) PNG

  • outputDir (string, optional): Directory for diff.png and diff-report.json. Defaults to the directory containing currentPath

  • threshold (number, optional): Maximum acceptable ratio of different pixels (0.01 = 1%). Default: 0.01

Returns

Text summary and structuredContent:

  • differentPixels: Count of pixels that differ

  • differencePercentage: Ratio of different pixels to total pixels (0–1)

  • passed: true if differencePercentage <= threshold

Artifacts Written

  • diff.png: Diff image highlighting changed pixels (pixelmatch output)

  • diff-report.json: JSON with baseline, current, dimensions, totalPixels, differentPixels, differencePercentage, thresholdPercentage, passed

Errors

Throws McpError(InvalidRequest) for:

  • Missing baseline or current file

  • Dimension mismatch between images

  • PNG read failures

Examples

Basic diff

await visualDiffTool({
  baselinePath: '/tmp/before.png',
  currentPath: '/tmp/after.png'
})

Custom output directory and strict threshold

await visualDiffTool({
  baselinePath: '/tmp/before.png',
  currentPath: '/tmp/after.png',
  outputDir: '/tmp/diffs',
  threshold: 0.001
})

Zero-tolerance regression check

await visualDiffTool({
  baselinePath: '/snapshots/login-baseline.png',
  currentPath: '/snapshots/login-current.png',
  threshold: 0
})
ParametersJSON Schema
NameRequiredDescriptionDefault
outputDirNo
thresholdNo
currentPathYes
baselinePathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
passedYes
differentPixelsYes
differencePercentageYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses concrete side effects: it writes diff.png and diff-report.json, defaults outputDir to currentPath's directory, computes pass/fail against a threshold, and throws errors on missing files, dimension mismatches, or PNG failures. This gives the agent a strong model of the tool's full behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but it is well-structured and front-loaded with the core purpose, followed by what-it-does bullets, parameter details, output details, error behavior, and examples. Each section and example adds selection or invocation value, so the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 4 parameters, side-effect file outputs, return values, and error conditions, the description is fully complete: parameters, defaults, structuredContent fields, artifacts, failure modes, and example invocations are all covered without leaving an agent to infer required behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully explain the parameters. It does so for all four: baselinePath and currentPath are described as required path inputs, outputDir gets a default, and threshold gets both a definition and an example ratio. This completely compensates for the bare JSON schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Compare two PNG screenshots pixel-by-pixel... to detect visual regressions.' It also states what artifacts are produced, making it clearly distinct from the sibling screenshot-acquisition tools such as 'screenshot' or 'simctl-io'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this tool when comparing two PNGs for pixel-level visual regressions, and the examples reinforce typical scenarios. It does not explicitly list alternatives or state when not to use the tool, so it stops short of the best possible guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

workflow-build-and-runBuild & Run (Workflow)A

workflow-build-and-run

Build and run an Xcode project on a simulator in a single orchestrated workflow.

Overview

Combines build, simulator selection, installation, and launch into one call:

  1. Build - Compile the Xcode project with xcodebuild

  2. Select Simulator - Auto-detect or use specified device

  3. Boot - Start the simulator

  4. Install - Install the built .app bundle

  5. Launch - Launch the app

  6. Screenshot (optional) - Capture initial app state

Parameters

Required

  • projectPath (string): Path to .xcodeproj or .xcworkspace

  • scheme (string): Build scheme name

Optional

  • configuration (string): Build configuration (default: "Debug")

  • simulatorUdid (string): Target simulator UDID - auto-detected if omitted

  • launchArguments (string[]): App launch arguments

  • environmentVariables (Record<string, string>): App environment variables

  • takeScreenshot (boolean): Capture screenshot after launch (default: false)

ParametersJSON Schema
NameRequiredDescriptionDefault
schemeYesBuild scheme name
projectPathYesPath to .xcodeproj or .xcworkspace
configurationNoBuild configuration (default: "Debug")
simulatorUdidNoTarget simulator UDID - auto-detected if omitted
takeScreenshotNoCapture screenshot after launch
launchArgumentsNoApp launch arguments
environmentVariablesNoApp environment variables

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only disclose not read-only, not idempotent, and not destructive, but the description's step list (boot, install, launch) gives a clear picture of the side effects on the simulator. It does not document failure modes or prerequisites like Xcode being installed, but the step list exceeds the annotation coverage and provides meaningful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a purpose statement, a numbered step list, and a clean required/optional parameter breakdown. It front-loads the core purpose and stays focused, though it is slightly longer than necessary by repeating some schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter orchestrator with no output schema, the description covers the workflow steps and all parameters sufficiently. It could be more complete by mentioning expected outcomes (e.g., app launches with given arguments) and potential error states, but nothing critical is missing for an agent to safely invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by stating the default for takeScreenshot (false) and configuration (Debug already in schema), and by clarifying that environmentVariables is a record of strings and launchArguments is an array (matching schema). It also ties parameters to workflow steps, providing usage context beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Build and run an Xcode project on a simulator in a single orchestrated workflow' and enumerates the six steps. It distinguishes itself from the many sibling tools by being the aggregated workflow, not a low-level xcodebuild or simctl call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The overview implies this is the go-to for a combined build+boot+install+launch flow, but it never explicitly contrasts with alternatives like xcodebuild-build (build only) or simctl-launch (launch only) or the similar workflow-fresh-install. The 'single orchestrated workflow' phrasing gives context but lacks explicit 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.

workflow-fresh-installFresh Install (Workflow)A
Destructive

workflow-fresh-install

Clean slate app installation - build, install, and launch with fresh simulator state.

Overview

Orchestrates a complete clean installation cycle in a single call:

  1. Select Simulator - Auto-detect or use specified device

  2. Shutdown - Ensure simulator is stopped

  3. Erase (optional) - Wipe all simulator data

  4. Boot - Start fresh simulator

  5. Build - Compile the Xcode project

  6. Install - Install the built app

  7. Launch - Start the app

This workflow keeps intermediate results internal, reducing agent context usage by ~70% compared to calling each tool manually.

Parameters

Required

  • projectPath (string): Path to .xcodeproj or .xcworkspace

  • scheme (string): Build scheme name

Optional

  • simulatorUdid (string): Target simulator - auto-detected if omitted

  • eraseSimulator (boolean): Wipe simulator data before install (default: false)

  • configuration ("Debug" | "Release"): Build configuration (default: Debug)

  • launchArguments (string[]): App launch arguments

  • environmentVariables (Record<string, string>): App environment variables

Returns

Consolidated result with:

  • success: Overall workflow success

  • project: Build configuration details

  • simulator: Target simulator info

  • app: Installed app details (bundleId, path, launched)

  • totalDuration: Total workflow time

  • guidance: Next steps

Examples

Basic Fresh Install

{
  "projectPath": "/path/to/MyApp.xcodeproj",
  "scheme": "MyApp"
}

Auto-selects simulator, builds, installs, and launches.

Clean Install with Erased Simulator

{
  "projectPath": "/path/to/MyApp.xcworkspace",
  "scheme": "MyApp",
  "eraseSimulator": true,
  "configuration": "Debug"
}

Erases all simulator data for truly fresh state.

Specific Simulator with Launch Arguments

{
  "projectPath": "/path/to/MyApp.xcodeproj",
  "scheme": "MyApp",
  "simulatorUdid": "ABC123-DEF456",
  "launchArguments": ["-UITesting", "-ResetState"],
  "environmentVariables": {"DEBUG_MODE": "1"}
}

Targets specific simulator with custom launch configuration.

Why Use This Workflow?

Token Efficiency

  • Manual approach: 6-7 tool calls × ~100 tokens each = ~600+ tokens in responses

  • Workflow approach: 1 call with consolidated response = ~150 tokens

Reduced Context Pollution

  • Build logs not exposed (only success/failure)

  • Intermediate states summarized

  • Only actionable outcome returned

Consistent State

  • Shutdown ensures clean starting point

  • Optional erase for truly fresh state

  • Proper boot sequencing

  • workflow-tap-element: UI interaction after install

  • xcodebuild-build: Direct build (used internally)

  • simctl-boot / simctl-shutdown / simctl-erase: Direct simulator control (used internally)

  • simctl-install / simctl-launch: Direct app management (used internally)

Notes

  • Shutdown failures are non-fatal (simulator may already be off)

  • Auto-suggests best simulator based on project requirements

  • Build artifacts are located automatically

  • Bundle ID is discovered from build settings

ParametersJSON Schema
NameRequiredDescriptionDefault
schemeYesBuild scheme name
projectPathYesPath to .xcodeproj or .xcworkspace
configurationNoDebug
simulatorUdidNoTarget simulator
eraseSimulatorNoWipe simulator data
launchArgumentsNo
environmentVariablesNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which already indicate destructiveness), the description discloses that shutdown failures are non-fatal, erase is optional, intermediate results are internal, and build artifacts/bundle IDs are auto-discovered. This gives the agent a clear model of real-world behavior and edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with clear headings, an overview, parameter list, examples, and notes. It is somewhat verbose in the 'Why Use This Workflow?' section where token efficiency and context pollution overlap, but for a tool that encapsulates 7 steps, this length is defensible and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex workflow with 7 parameters and no output schema, the description provides a return structure, examples, edge-case notes, and a full step enumeration. It gives an agent everything necessary to decide on, invoke, and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 57%, and the description adds some value: simulatorUdid is noted as auto-detected, defaults are restated, and examples show concrete usage patterns. However, launchArguments and environmentVariables receive no additional semantic explanation beyond their names, leaving part of the parameter space under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'Clean slate app installation - build, install, and launch with fresh simulator state' and expands into a specific step-by-step orchestration list. It clearly identifies the resource (a full clean install cycle) and distinguishes itself from the many low-level simctl/xcodebuild siblings by emphasizing the consolidated workflow nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why Use This Workflow?' section argues for token efficiency and consistent state, but it never explicitly states when to choose this over workflow-build-and-run or when to fall back to direct xcodebuild-build/simctl tools. Related tools are listed without usage conditions, leaving the decision partially implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

workflow-tap-elementTap Element (Workflow)A

workflow-tap-element

High-level semantic UI interaction - find and tap elements by name without coordinate hunting.

Overview

Orchestrates accessibility-first UI automation in a single call:

  1. Check Accessibility - Assess UI richness for automation approach

  2. Find Element - Semantic search by label/identifier

  3. Tap Element - Execute tap at discovered coordinates

  4. Input Text (optional) - Type into tapped field

  5. Verify Result (optional) - Screenshot for confirmation

This workflow keeps intermediate results internal, reducing agent context usage by ~80% compared to calling each tool manually.

Parameters

Required

  • elementQuery (string): Search term for element (e.g., "Login", "Submit", "Email")

    • Case-insensitive partial matching ("log" matches "Login")

Optional

  • inputText (string): Text to type after tapping (for text fields)

  • verifyResult (boolean): Take screenshot after action (default: false)

  • udid (string): Target device - auto-detected if omitted

  • screenContext (string): Screen name for tracking (e.g., "LoginScreen")

Returns

Consolidated result with:

  • success: Overall workflow success

  • tappedElement: Found element details (type, label, coordinates)

  • inputText: Text entry status (if requested)

  • verified: Screenshot status (if requested)

  • accessibilityQuality: UI richness assessment

  • totalDuration: Total workflow time

  • guidance: Next steps

Examples

Tap Login Button

{"elementQuery": "Login"}

Finds and taps the Login button.

Tap Email Field and Enter Text

{
  "elementQuery": "Email",
  "inputText": "user@example.com",
  "screenContext": "LoginScreen"
}

Finds email field, taps it, enters text.

Full Verification Workflow

{
  "elementQuery": "Submit",
  "verifyResult": true,
  "screenContext": "SignupForm"
}

Taps Submit button and captures verification screenshot.

Why Use This Workflow?

Token Efficiency

  • Manual approach: 4-5 tool calls × ~50 tokens each = ~200+ tokens in responses

  • Workflow approach: 1 call with consolidated response = ~80 tokens

Reduced Context Pollution

  • Intermediate accessibility data not exposed

  • Element search results summarized

  • Only actionable outcome returned

Error Handling

  • Graceful degradation on partial failures

  • Helpful guidance when element not found

  • Clear troubleshooting steps

  • idb-ui-find-element: Direct element search (used internally)

  • idb-ui-tap: Direct tap (used internally)

  • accessibility-quality-check: Direct quality check (used internally)

  • workflow-fresh-install: Clean app installation workflow

Notes

  • Falls back gracefully if accessibility is minimal

  • Non-fatal errors (input, screenshot) don't fail the workflow

  • Element matching uses partial, case-insensitive search

  • Small delay between tap and input for keyboard appearance

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNoTarget device
inputTextNoText to type after tapping
elementQueryYesSearch term for element (e.g., "Login", "Submit")
verifyResultNoTake screenshot after action
screenContextNoScreen name for tracking

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations are minimal (readOnlyHint=false, destructiveHint=false, etc.), so the description carries the burden. It discloses the workflow's orchestration, fallback behavior on minimal accessibility, non-fatal error handling, internal result handling, and a small delay between tap and input. This goes beyond the schema and annotations, fully informing the agent of side effects and 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (Overview, Parameters, Returns, Examples, Why Use This, Related Tools, Notes). It front-loads the purpose and each section earns its place. Some redundancy exists (parameter descriptions repeated in both schema and text), but the structure keeps it navigable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a workflow tool with 5 parameters, no output schema, and significant behavioral nuance, the description covers everything necessary: parameters, return values, examples, error handling, and related tools. An agent can call it correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all parameters, but the description adds critical semantic details: case-insensitive partial matching for elementQuery, auto-detection for udid, default for verifyResult, and example usage. It enriches the schema's bare descriptions with actionable guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it's a high-level semantic UI interaction tool that finds and taps elements by name, distinguishing itself from siblings by orchestrating multiple steps (accessibility check, find, tap, optional input, verify) in one call. It clearly differentiates from idb-ui-tap and idb-ui-find-element by being a workflow that reduces context usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly explains when to use this workflow versus calling underlying tools manually, citing token efficiency and reduced context pollution. It also lists related tools and describes the 'Why Use This Workflow?' section, giving clear guidance on when to prefer this tool over direct calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-buildBuild Xcode SchemeA

xcodebuild-build

Build Xcode projects with intelligent defaults and performance tracking

What it does

Builds Xcode projects and workspaces with advanced learning capabilities that remember successful configurations and suggest optimal simulators per project. Uses progressive disclosure to provide concise summaries by default, with full build logs available on demand. Tracks build performance metrics (duration, errors, warnings) and learns from successful builds to improve future build suggestions.

Why you'd use it

  • Automatic smart defaults: remembers which simulator and config worked last time

  • Progressive disclosure: concise summaries prevent token overflow, full logs on demand

  • Performance tracking: measures build times and provides optimization insights

  • Structured errors: clear error messages instead of raw CLI stderr

Parameters

Required

  • projectPath (string): Path to .xcodeproj or .xcworkspace file

  • scheme (string): Build scheme name (use xcodebuild-list to discover)

Optional

  • configuration (string, default: 'Debug'): Build configuration (Debug/Release, defaults to cached or "Debug")

  • destination (string): Build destination (e.g., "platform=iOS Simulator,id=")

  • sdk (string): SDK to build against (e.g., "iphonesimulator", "iphoneos")

  • derivedDataPath (string): Custom derived data path for build artifacts

Returns

Structured JSON response with buildId (for progressive disclosure), success status, build summary (errors, warnings, duration), and intelligence metadata showing which smart defaults were applied. Use xcodebuild-get-details with buildId to retrieve full logs.

Examples

Minimal build with smart defaults

const result = await xcodebuildBuildTool({
  projectPath: "/path/to/MyApp.xcodeproj",
  scheme: "MyApp"
});

Explicit configuration

const release = await xcodebuildBuildTool({
  projectPath: "/path/to/MyApp.xcworkspace",
  scheme: "MyApp",
  configuration: "Release",
  destination: "platform=iOS Simulator,id=ABC-123"
});
  • xcodebuild-test: Run tests after building

  • xcodebuild-clean: Clean build artifacts

  • xcodebuild-get-details: Get full build logs (use with buildId)

ParametersJSON Schema
NameRequiredDescriptionDefault
sdkNo
schemeYes
destinationNo
projectPathYes
configurationNoDebug
derivedDataPathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
schemeYes
buildIdYesCache id for full build log (xcodebuild-get-details)
successYes
durationMsYes
errorCountYes
warningCountYes
configurationYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the sparse annotations by disclosing that builds are non-readonly, use progressive disclosure, return a buildId, track performance metrics, and learn from successful builds. It also explains structured error handling. No contradiction with annotations is present, and this behavioral context substantially aids an agent in invoking the tool correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with clear sections: what it does, why use it, parameters, returns, examples, and related tools. It is somewhat verbose with marketing-style phrases like 'advanced learning capabilities' and 'optimization insights', but each section serves a functional purpose and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the minimal schema, the description covers all essential context: required vs optional parameters, smart-default behavior, return structure, buildId usage for logs, and related sibling tools. Despite an output schema existing, the description also explains the return shape, making it complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates by documenting all six parameters, marking required ones, providing defaults, giving example destination syntax, and explaining how to discover scheme names. This adds meaningful semantic value beyond the bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Builds Xcode projects and workspaces'. It clearly distinguishes this tool from siblings by naming related tools like xcodebuild-test, xcodebuild-clean, and xcodebuild-get-details. An agent can immediately understand what the tool does without inferring from the title alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for use, including smart defaults, progressive disclosure, performance tracking, and structured errors. It references xcodebuild-list for discovering schemes and xcodebuild-get-details for retrieving full logs. It does not explicitly state when not to use this tool versus alternatives, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-cleanClean Xcode BuildA
DestructiveIdempotent

xcodebuild-clean

Clean build artifacts with validation and structured output

What it does

Removes build artifacts and intermediate files for an Xcode project or workspace. Pre-validates that the project exists and Xcode is properly installed before executing, providing clear error messages if something is misconfigured. Returns structured JSON responses with execution status, duration, and any errors encountered during the clean operation.

Why you'd use it

  • Resolve build issues by removing stale or corrupted build artifacts

  • Free up disk space occupied by intermediate build files

  • Ensure clean builds from scratch without cached compilation results

  • Get structured feedback with execution time and success status

Parameters

Required

  • projectPath (string): Path to .xcodeproj or .xcworkspace file

  • scheme (string): Build scheme name to clean

Optional

  • configuration (string): Build configuration to clean (e.g., "Debug", "Release")

Returns

Structured JSON response containing success status, command executed, execution duration, output messages, and exit code. Includes both stdout and stderr for comprehensive debugging. Operation typically completes in under 3 minutes.

Examples

Clean default configuration

const result = await xcodebuildCleanTool({
  projectPath: "/path/to/MyApp.xcodeproj",
  scheme: "MyApp"
});

Clean specific configuration

const cleanRelease = await xcodebuildCleanTool({
  projectPath: "/path/to/MyApp.xcworkspace",
  scheme: "MyApp",
  configuration: "Release"
});
  • xcodebuild-build: Build after cleaning

  • xcodebuild-list: Discover available schemes

ParametersJSON Schema
NameRequiredDescriptionDefault
schemeYes
projectPathYes
configurationNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide destructiveHint=true and idempotentHint=true, so the description correctly complements rather than repeats those. It adds useful behavioral context: pre-validating project existence and Xcode installation, returning structured JSON with status/duration/errors, and capturing stdout/stderr. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear headings, concise bullet lists, code examples, and related tools. It front-loads the core behavior and avoids filler; even operational details like typical completion time earn their place by setting agent expectations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains the return format in sufficient detail: success status, command executed, execution duration, output messages, exit code, and stdout/stderr. It also covers preconditions, parameters, examples, and related tools, making the tool fully callable by an agent without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It does this well: projectPath is described as the path to .xcodeproj or .xcworkspace, scheme as the build scheme name, and configuration as the build configuration with examples. This fully compensates for the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Removes build artifacts and intermediate files for an Xcode project or workspace.' It also adds unique behaviors such as pre-validation and structured JSON output, which distinguishes it from related tools like xcodebuild-build and xcodebuild-list. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section provides concrete scenarios, and 'Related Tools' explicitly routes the agent to xcodebuild-build for building after cleaning and xcodebuild-list for discovering schemes. It lacks an explicit 'when not to use' statement, but the examples and related tool references make appropriate usage reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-get-detailsGet Build/Test DetailsA
Read-onlyIdempotent

xcodebuild-get-details

🔍 Retrieve detailed build or test output from cached results - Progressive disclosure for logs.

Provides on-demand access to full build and test logs that were cached during xcodebuild-build or xcodebuild-test execution. Implements progressive disclosure pattern: initial build/test responses return concise summaries to prevent token overflow, while this tool allows drilling down into full logs, filtered errors, warnings, or metadata when needed for debugging.

Advantages

• Access full build logs without cluttering initial responses • Filter to just errors or warnings for faster debugging • Retrieve exact command executed and exit code • Inspect build metadata and cache information

Parameters

Required

  • buildId (string): Cache ID from xcodebuild-build or xcodebuild-test response

  • detailType (string): Type of details to retrieve

    • "full-log": Complete stdout and stderr output

    • "errors-only": Lines containing errors or build failures

    • "warnings-only": Lines containing warnings

    • "summary": Build metadata and configuration used

    • "command": Exact xcodebuild command executed

    • "metadata": Cache info and output sizes

Optional

  • maxLines (number): Maximum lines to return (default: 100)

Returns

  • Tool execution results with requested build or test details

  • Full logs or filtered errors/warnings with line counts

  • Build metadata and execution information

  • xcodebuild-build: Build iOS projects (returns buildId)

  • xcodebuild-test: Run tests (returns testId)

  • simctl-get-details: Get simulator list details

Notes

  • Tool is auto-registered with MCP server

  • Requires valid cache ID from recent build/test

  • Cache IDs expire after 30 minutes

  • Use for debugging build failures and test issues

ParametersJSON Schema
NameRequiredDescriptionDefault
buildIdYes
maxLinesNo
detailTypeYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds crucial behavioral context: progressive disclosure, cache ID requirement, 30-minute expiry, and line-count reporting. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear headers, bullet points, and front-loaded purpose. Every section adds value—parameters, returns, related tools, and notes—without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: purpose, usage, parameter semantics, return expectations, related tools, and caveats like cache expiry. For a tool with three parameters and six enum options, this description is complete and self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description thoroughly documents each parameter, including the six enum values for detailType with meanings and the default for maxLines. This fully compensates for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('retrieve detailed build or test output') and resource ('cached results'), and clearly distinguishes itself from siblings like xcodebuild-build and simctl-get-details. The progressive disclosure pattern is explained upfront, making the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (for debugging build failures and test issues) and when not to rely on the initial response. Lists related tools and notes cache expiry, giving clear context for selecting this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-inspect-schemeInspect Xcode SchemeA
Read-onlyIdempotent

xcodebuild-inspect-scheme

Parse and display an Xcode scheme's build, run, and test configurations from its .xcscheme file.

Parameters

  • projectPath (required): Path to the .xcodeproj or .xcworkspace

  • scheme (required): Scheme name to inspect

Returns

Parsed scheme information: build targets, run configuration, test configuration, and environment/launch arguments where present.

ParametersJSON Schema
NameRequiredDescriptionDefault
schemeYes
projectPathYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint; the description adds concrete behavioral context by specifying that it parses the .xcscheme file and that build/run/test configs plus env/launch arguments are returned 'where present'. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with a summary sentence followed by focused parameter and return sections. It is slightly redundant in using a heading that repeats the tool name, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only inspection tool with two required parameters and no output schema, the description covers inputs, source file, and return content. Combined with the annotations, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 0%, so the description carries the full burden. It successfully explains both parameters: projectPath as the path to the .xcodeproj/.xcworkspace and scheme as the scheme name to inspect, which is sufficient for selection and invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Parse and display') with a concrete resource (an Xcode scheme's build, run, and test configurations from its .xcscheme file), which clearly distinguishes it from build/test/list siblings. The title reinforces but the body adds enough detail to identify the tool's unique purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The read-only inspection context is clear: an agent should call this when it needs an Xcode scheme's configuration rather than to build, test, list, or manipulate a project. It does not explicitly name alternatives like xcodebuild-get-details or state when not to use it, but the purpose sentence makes the appropriate use case evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-listList Xcode Schemes & TargetsA
Read-onlyIdempotent

xcodebuild-list

List project targets, schemes, and configurations with intelligent caching

What it does

Discovers and returns all available build targets, schemes, and configurations for an Xcode project or workspace. Uses 1-hour intelligent caching to remember results and avoid expensive re-runs of project discovery. Validates both Xcode installation and project path before execution to provide clear error messages if something is misconfigured.

Why you'd use it

  • Discover available schemes before building or testing (essential for automation)

  • Validate project structure and configuration

  • Get structured project metadata for CI/CD pipelines

  • Avoid expensive repeated queries with 1-hour caching

Parameters

Required

  • projectPath (string): Path to .xcodeproj or .xcworkspace file

Optional

  • outputFormat (string, default: 'json'): "json" or "text" output format

Returns

Structured JSON containing all targets, schemes, configurations, and project information. Consistent format across .xcodeproj and .xcworkspace project types. Results are cached for 1 hour to speed up subsequent queries.

Examples

List schemes for a project

const info = await xcodebuildListTool({
  projectPath: "/path/to/MyApp.xcodeproj"
});

List with text output

const textInfo = await xcodebuildListTool({
  projectPath: "/path/to/MyApp.xcworkspace",
  outputFormat: "text"
});
  • xcodebuild-build: Build discovered schemes

  • xcodebuild-test: Test discovered schemes

ParametersJSON Schema
NameRequiredDescriptionDefault
projectPathYes
outputFormatNojson

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds value beyond those: it mentions 1-hour caching, validation of Xcode installation and project path, and consistent output across project types. These details give an agent expectations about side effects and runtime behavior without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The Markdown structure uses clear sections ('What it does', 'Why you'd use it', 'Parameters', 'Returns', 'Examples', 'Related Tools') that are easy to scan. It is longer than minimal but each section contributes meaningful information. Minor stylistic elements (⚡, bold) add noise but do not hinder comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers prerequisites (project path), validations, output format, caching, and provides a high-level return overview. Since no output schema exists, the 'Returns' section summarizes the structured JSON content. It could detail exact return fields more, but for a simple list tool this current coverage is sufficient and matches the complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Since the input schema has 0% description coverage, the tool description carries the full parameter burden. It explains projectPath as the path to .xcodeproj or .xcworkspace, and details outputFormat as either 'json' or 'text' with a default of 'json'. The examples clarify usage, making both parameters unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool lists project targets, schemes, and configurations with a specific verb ('List') and resource type. It also distinguishes itself from related build and test tools by referencing them in the 'Related Tools' section and by the described behavior of discovery and validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section provides clear use cases (discover schemes before building, validate structure, CI/CD metadata) and mentions its value of caching to reduce repeated queries. However, it does not explicitly contrast against alternatives like xcodebuild-get-details or xcodebuild-showsdks, so the guidance is strong but not fully exclusionary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-showsdksList Available SDKsA
Read-onlyIdempotent

xcodebuild-showsdks

Show available SDKs for iOS, macOS, watchOS, and tvOS

What it does

Lists all SDKs available in your Xcode installation for building apps across Apple platforms. Returns structured JSON data instead of raw CLI text, making it easy to parse and validate SDK availability. Smart caching prevents redundant SDK queries, improving performance for repeated lookups. Validates Xcode installation before execution.

Why you'd use it

  • Verify SDK availability before starting builds (prevent build failures)

  • Discover which platform versions are supported by your Xcode installation

  • Validate CI/CD environment has required SDKs installed

  • Get structured SDK data for automated build configuration

Parameters

Optional

  • outputFormat (string, default: 'json'): "json" or "text" output format

Returns

Structured JSON containing all available SDKs organized by platform (iOS, macOS, watchOS, tvOS). Each SDK entry includes platform name, version, and SDK identifier. Smart caching reduces query overhead for repeated lookups.

Examples

Get available SDKs as JSON

const sdks = await xcodebuildShowSDKsTool({ outputFormat: "json" });

Get raw text output

const sdksText = await xcodebuildShowSDKsTool({ outputFormat: "text" });
  • xcodebuild-version: Get Xcode version information

  • xcodebuild-build: Build with specific SDK

ParametersJSON Schema
NameRequiredDescriptionDefault
outputFormatNojson

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses behaviors beyond the annotations: smart caching prevents redundant queries, Xcode installation is validated before execution, and structured JSON is returned instead of raw CLI text. No contradiction with the readOnlyHint, idempotentHint, or destructiveHint annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with clear headings, bullet points, examples, and related tools. It is somewhat verbose and repeats the caching/JSON points, but the structure and front-loading make it easy for an agent to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one optional parameter aided by enum values, no output schema, and strong annotations, the description is complete. It explains what the return data contains, provides examples, and covers relevant behavior like caching and validation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero description coverage for the single parameter, but the description compensates with a dedicated Parameters section explaining outputFormat accepts 'json' or 'text', defaults to 'json', and provides examples. The meaning is clear and complete for the parameter's simple nature.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Show available SDKs' and lists SDKs for iOS, macOS, watchOS, and tvOS. It clearly differentiates from related tools like xcodebuild-version and xcodebuild-build by focusing on SDK enumeration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section provides clear use cases such as verifying SDK availability, discovering supported platform versions, and validating CI environments. It does not explicitly state when not to use it or provide exclusion conditions versus siblings, so it falls short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-testRun Xcode TestsA

xcodebuild-test

Run Xcode tests with intelligent defaults and progressive disclosure

What it does

Executes unit and UI tests for Xcode projects with advanced learning that remembers successful test configurations and suggests optimal simulators per project. Provides detailed test metrics (passed/failed/skipped) with progressive disclosure to prevent token overflow. Supports test filtering (-only-testing, -skip-testing), test plans, and test-without-building mode for faster iteration. Learns from successful test runs to improve future suggestions.

Why you'd use it

  • Automatic smart defaults: remembers which simulator and config worked for tests

  • Detailed test metrics: structured pass/fail/skip counts instead of raw output

  • Progressive disclosure: concise summaries with full logs available via testId

  • Test filtering: run specific tests or skip problematic ones with -only-testing/-skip-testing

Parameters

Required

  • projectPath (string): Path to .xcodeproj or .xcworkspace file

  • scheme (string): Test scheme name (use xcodebuild-list to discover)

Optional

  • configuration (string, default: 'Debug'): Build configuration (Debug/Release, defaults to cached or "Debug")

  • destination (string): Test destination (e.g., "platform=iOS Simulator,id=")

  • sdk (string): SDK to test against (e.g., "iphonesimulator")

  • derivedDataPath (string): Custom derived data path

  • testPlan (string): Test plan name to execute

  • onlyTesting (string[]): Array of test identifiers to run exclusively

  • skipTesting (string[]): Array of test identifiers to skip

  • testWithoutBuilding (boolean): Run tests without building (requires prior build)

Returns

Structured JSON with testId (for progressive disclosure), success status, test summary (total/passed/failed/skipped counts), failure details (first 3 failures), and cache metadata showing which smart defaults were applied. Use xcodebuild-get-details with testId for full logs.

Examples

Run all tests with smart defaults

const result = await xcodebuildTestTool({
  projectPath: "/path/to/MyApp.xcodeproj",
  scheme: "MyApp"
});

Run specific tests only

const filtered = await xcodebuildTestTool({
  projectPath: "/path/to/MyApp.xcworkspace",
  scheme: "MyApp",
  onlyTesting: ["MyAppTests/testLogin", "MyAppTests/testLogout"]
});

Fast iteration with test-without-building

const quick = await xcodebuildTestTool({
  projectPath: "/path/to/MyApp.xcodeproj",
  scheme: "MyApp",
  testWithoutBuilding: true
});

Complete JSON Examples

Run All Tests

{"projectPath": "/path/to/MyApp.xcodeproj", "scheme": "MyApp"}

Run Specific Test Plan

{"projectPath": "/path/to/MyApp.xcodeproj", "scheme": "MyApp", "testPlan": "IntegrationTests"}

Run Only Specific Tests

{"projectPath": "/path/to/MyApp.xcodeproj", "scheme": "MyApp", "onlyTesting": ["MyAppTests/LoginTests", "MyAppTests/AuthTests/testLogin"]}

Skip Specific Tests

{"projectPath": "/path/to/MyApp.xcodeproj", "scheme": "MyApp", "skipTesting": ["MyAppTests/SlowTests", "MyAppUITests"]}

Test Without Building (Using Previous Build)

{"projectPath": "/path/to/MyApp.xcodeproj", "scheme": "MyApp", "testWithoutBuilding": true}

Test with Specific Destination

{"projectPath": "/path/to/MyApp.xcodeproj", "scheme": "MyApp", "destination": "platform=iOS Simulator,name=iPhone 16 Pro,OS=18.0"}

Release Configuration Testing

{"projectPath": "/path/to/MyApp.xcodeproj", "scheme": "MyApp", "configuration": "Release"}
  • xcodebuild-build: Build before testing

  • xcodebuild-get-details: Get full test logs (use with testId)

  • simctl-list: See available test simulators

ParametersJSON Schema
NameRequiredDescriptionDefault
sdkNo
schemeYes
testPlanNo
destinationNo
onlyTestingNo
projectPathYes
skipTestingNo
configurationNoDebug
derivedDataPathNo
testWithoutBuildingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
failedYes
passedYes
schemeYes
testIdYesCache id for full test log (xcodebuild-get-details)
skippedYes
successYes
durationMsNo
totalTestsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false, so they provide no behavioral signals. The description compensates by disclosing that the tool 'learns from successful test runs', maintains 'cache metadata' of applied defaults, uses 'progressive disclosure' to avoid token overflow, and supports 'test-without-building' which implies it may skip a build. It also states it returns failure details and a testId for later retrieval. This goes beyond the annotations, though it does not exhaustively list all side effects (e.g., derived data writes), but it is sufficiently transparent for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with headings, front-loaded with a summary, and uses tables-like bullet lists for parameters and returns. However, it includes redundant content: 'Examples' (TypeScript) and 'Complete JSON Examples' (pure JSON) duplicate the same scenarios, and the 'Why you'd use it' overlaps with 'What it does'. While each section adds some value, trimming duplicates would improve conciseness without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 10 parameters, no schema descriptions, and an output schema (mentioned but not shown), the description is remarkably complete. It explains each parameter, gives multiple usage examples, details the return structure (testId, counts, failure details, cache metadata), and points to related tools for supplementary actions. An agent has everything needed to call it correctly and handle results. No obvious gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must fully compensate, and it does. The 'Parameters' section provides a clear one-line description for each of the 10 parameters, including examples for destination and sdk, notes on defaults for configuration, and guidance that scheme should be discovered via xcodebuild-list. The extensive 'Complete JSON Examples' further illustrate valid usage, making all parameters semantically clear. This far exceeds the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with '⚡ Run Xcode tests' and immediately states 'Executes unit and UI tests for Xcode projects', giving a specific verb and resource. It clearly distinguishes from siblings like xcodebuild-build (build) and xcodebuild-list (discover schemes) by focusing on test execution, and even names related tools to reinforce the boundary. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section lists concrete benefits (smart defaults, metrics, progressive disclosure, filtering) and the 'Related Tools' section routes to xcodebuild-list for scheme discovery and xcodebuild-get-details for logs. It implies when to use this tool over alternatives (e.g., when you need test results with caching) but does not explicitly state exclusions like 'use xcodebuild-build if you only need to compile'. Clear context, but no explicit when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-validate-capabilitiesValidate App CapabilitiesA
Read-onlyIdempotent

xcodebuild-validate-capabilities

Compare an app's Info.plist required permissions/capabilities against the permissions actually granted on a simulator, surfacing mismatches.

Parameters

  • projectPath (required): Path to the .xcodeproj or .xcworkspace

  • scheme (required): Scheme name

  • udid (optional): Simulator UDID to validate granted permissions against

Returns

A capabilities validation report listing required vs granted permissions and any gaps.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidNo
schemeYes
projectPathYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already communicate read-only and idempotent behavior, so the description only needs to add meaningful operational context. It does this by explaining that this is a comparison/validation operation and that it returns a report of required vs granted permissions and gaps. It does not cover failure modes or simulator prerequisites, but the annotations lower that burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description front-loads the core purpose in one clear sentence, then organizes parameters and return value into compact sections. There is no filler, though the heading repeats the tool name and the Returns section could arguably be folded into the opening paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, the description supplies the purpose, all parameter semantics, and a summary of the return value even though there is no output schema. The only notable gap is what happens when udid is omitted, but this does not prevent an agent from invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, so the description fully compensates by documenting each parameter: projectPath is the path to the Xcode project/workspace, scheme is the scheme name, and udid is the simulator UDID to validate against. The explanations are terse but sufficient for a 3-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Compare') with a clear resource ('an app's Info.plist required permissions/capabilities') and target ('the permissions actually granted on a simulator'), and it names the outcome ('surfacing mismatches'). This makes the tool's purpose unambiguous and distinguishes it from the other xcodebuild and simctl siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the intended scenario: validate that an app's declared capabilities match what the simulator actually grants. It does not explicitly name when not to use it or point to an alternative, but the context is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcodebuild-versionXcode Version InfoA
Read-onlyIdempotent

xcodebuild-version

Get Xcode and SDK version information with structured output

What it does

Retrieves comprehensive version information about your Xcode installation and available SDKs. Returns structured JSON data that's easy to parse and validate, eliminating the need to parse raw command-line output. Validates Xcode installation before execution to provide clear error messages if Xcode is not properly configured.

Why you'd use it

  • Validate environment before running builds or tests (CI/CD validation)

  • Check SDK availability for specific platform versions

  • Ensure consistent Xcode versions across team or build environments

  • Get structured version data for automated tooling and scripts

Parameters

Optional

  • sdk (string): Query specific SDK version (e.g., "iphoneos", "iphonesimulator")

  • outputFormat (string, default: 'json'): "json" or "text" output format

Returns

Structured JSON response containing Xcode version, build number, and SDK information. Falls back gracefully to text format for older Xcode versions that don't support JSON output.

Examples

Get Xcode version as JSON

const result = await xcodebuildVersionTool({ outputFormat: "json" });

Query specific SDK

const sdkInfo = await xcodebuildVersionTool({ sdk: "iphoneos" });
  • xcodebuild-showsdks: Show all available SDKs

  • xcodebuild-list: List project information

ParametersJSON Schema
NameRequiredDescriptionDefault
sdkNo
outputFormatNojson

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds non-obvious behaviors: it validates the Xcode installation before executing and provides clear error messages, and it falls back gracefully to text output for older Xcode versions that don't support JSON. These details go beyond the annotations and help an agent predict side effects and return variability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear headers, a parameter section, examples, and related tools, and the core action is front-loaded in the first line. However, it is verbose: 'Why you'd use it' overlaps with 'What it does', and some marketing-style bullets could be trimmed. It is organized but not particularly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description explains returns at useful granularity: structured JSON containing Xcode version, build number, and SDK info, with fallback to text. It also covers prerequisites indirectly by mentioning validation, provides examples, and lists related tools. An agent has all needed information to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only provides types and an enum with no property descriptions (coverage 0%). The description's Parameters section explains exactly what each parameter does: sdk queries a specific SDK version with examples ('iphoneos', 'iphonesimulator'), and outputFormat specifies json/text with the default. Examples further demonstrate usage, fully compensating for the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Get Xcode and SDK version information'. The 'What it does' section expands with 'Retrieves comprehensive version information about your Xcode installation and available SDKs'. The Related Tools section names siblings such as xcodebuild-showsdks and xcodebuild-list with one-line descriptions, so an agent can clearly distinguish this version-info tool from listing/project tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Why you'd use it' section provides concrete contexts: environment validation before builds/tests, checking SDK availability, ensuring consistent versions, and needing structured data for automation. Related Tools list alternatives such as xcodebuild-showsdks and xcodebuild-list, allowing an agent to see nearby options. However, it never explicitly states when NOT to use this tool in favor of a named sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xcode-model-inspectInspect Core Data / SwiftData ModelsA
Read-onlyIdempotent

xcode-model-inspect

Inspect Core Data .xcdatamodeld packages and SwiftData @Model classes from project source files. Pure file analysis — no simulator, no build required.

What it does

Recursively walks the project path and extracts:

Core Data (.xcdatamodeld)

  • Reads .xccurrentversion to determine the active model version

  • Parses entity XML: names, isAbstract, parentEntity, representedClass

  • Attributes: name, attributeType, optional, defaultValueString

  • Relationships: name, destinationEntity, toMany, inverseName, optional

  • Fetch requests: name, predicateString

SwiftData (@Model classes)

  • Detects @Model-decorated classes via regex

  • Extracts stored properties (var/let) excluding computed and @Relationship

  • Extracts @Relationship declarations with toMany detection ([] or Array<>)

Parameters

  • projectPath (string, optional): Root of Xcode project to inspect (default: '.')

  • coreDataOnly (boolean, optional): Skip SwiftData scanning

  • swiftDataOnly (boolean, optional): Skip Core Data scanning

  • showVersions (boolean, optional): Include all .xcdatamodel version entries with current flagged

  • raw (string, optional): Dump raw source for a named model (Swift class body or Core Data entity XML)

  • verbose (boolean, optional): Include per-entity/property breakdown in summary text

Returns

JSON response with:

  • coreData: array of parsed .xcdatamodeld packages with entities, attributes, and relationships

  • swiftData: array of @Model classes with properties and relationships

  • summary: compact human-readable summary text

  • note: present when no models are found (not an error)

structuredContent: { coreDataModels, swiftDataModels, totalEntities }

Examples

Inspect all models

await xcodeModelInspectTool({ projectPath: '/path/to/MyApp' })

Core Data only with version history

await xcodeModelInspectTool({ projectPath: '/path/to/MyApp', coreDataOnly: true, showVersions: true })

Dump raw source for a specific model

await xcodeModelInspectTool({ projectPath: '/path/to/MyApp', raw: 'Task' })

Verbose output

await xcodeModelInspectTool({ projectPath: '/path/to/MyApp', verbose: true })

Skipped Directories

node_modules, DerivedData, Pods, Carthage, .git, and any directory starting with '.'

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
verboseNo
projectPathNo
coreDataOnlyNo
showVersionsNo
swiftDataOnlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalEntitiesYes
coreDataModelsYes
swiftDataModelsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is consistent with these. Beyond the annotations, it adds genuinely useful behavior: that scanning is recursive, that certain directories are skipped (node_modules, DerivedData, Pods, Carthage, .git, dot-directories), and that a 'note' field is returned when no models are found rather than an error. This adds context the annotations don't convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear headers (What it does, Parameters, Returns, Examples, Skipped Directories) and front-loads the core purpose. It is long, but for a tool with 6 optional parameters and dual Core Data/SwiftData coverage, the detail is justified. A minor critique: the exhaustive enumeration of extraction details in the 'What it does' section and the multiple examples could be trimmed slightly without losing value, but nothing is extraneous.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema being present, the description still explains the return format (coreData, swiftData, summary, note) and the structuredContent shape. It documents all 6 parameters, provides usage examples, and specifies skipped directories. For a complex analysis tool with dual scanning modes, this is complete — an agent has everything needed to invoke it correctly for any scenario.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% — the JSON schema provides no descriptions for any of the 6 parameters. The description fully compensates with a dedicated Parameters section that documents each parameter (projectPath, coreDataOnly, swiftDataOnly, showVersions, raw, verbose), including types, defaults, and specific behavior (e.g., 'raw: Dump raw source for a named model'). It also provides four worked examples showing parameter combinations in action. The description carries the entire burden here and does so thoroughly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource: it 'inspects Core Data .xcdatamodeld packages and SwiftData @Model classes from project source files.' It enumerates exactly what it extracts (entities, attributes, relationships, fetch requests, @Model properties) and explicitly frames itself as pure file analysis, which clearly distinguishes it from the build (xcodebuild-*), simulator (simctl-*), and device (idb-*) siblings that operate on builds or runtimes rather than source files.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states 'Pure file analysis — no simulator, no build required,' which signals to an agent that this tool is appropriate when model inspection is needed without a build step. It also documents skipped directories. However, it does not explicitly name alternatives or state when NOT to use this tool (e.g., when you need runtime model state rather than source definitions), leaving some inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 60 tool updatesv4.1.0
    • Addedaccessibility-audit
    • Changedaccessibility-quality-check1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "quality": {
        +      "description": "rich | moderate | minimal",
        +      "type": "string"
        +    },
        +    "recommendation": {
        +      "description": "accessibility-ready | consider-screenshot",
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    },
        +    "tappableElements": {
        +      "type": "number"
        +    },
        +    "textFields": {
        +      "type": "number"
        +    },
        +    "totalElements": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "success",
        +    "quality",
        +    "recommendation",
        +    "totalElements",
        +    "tappableElements",
        +    "textFields"
        +  ],
        +  "type": "object"
        +}
    • Removedcache
    • Addedcache-clear
    • Addedcache-get-config
    • Addedcache-get-stats
    • Addedcache-set-config
    • Addedhang-get-details
    • Addedhang-list
    • Addedhang-start
    • Addedhang-stop
    • Removedidb-app
    • Addedidb-clear-keychain
    • Addedidb-crash-delete
    • Addedidb-crash-list
    • Addedidb-crash-show
    • Addedidb-doctor
    • Addedidb-install
    • Addedidb-launch
    • Addedidb-simulate-memory-warning
    • Addedidb-terminate
    • Addedidb-uninstall
    • Addedidb-xctest-list
    • Addedlocalization-audit
    • Removedpersistence
    • Addedpersistence-disable
    • Addedpersistence-enable
    • Addedpersistence-status
    • Addedsimctl-addmedia
    • Removedsimctl-app
    • Addedsimctl-appearance
    • Addedsimctl-boot
    • Addedsimctl-clone
    • Addedsimctl-container
    • Addedsimctl-create
    • Addedsimctl-delete
    • Removedsimctl-device
    • Addedsimctl-erase
    • Addedsimctl-install
    • Addedsimctl-launch
    • Addedsimctl-location
    • Addedsimctl-pbcopy
    • Addedsimctl-privacy
    • Addedsimctl-rename
    • Addedsimctl-shutdown
    • Addedsimctl-status-bar
    • Addedsimctl-stream-logs
    • Addedsimctl-suggest
    • Addedsimctl-terminate
    • Addedsimctl-uninstall
    • Addedtest-record-report
    • Addedtest-record-step
    • Addedvisual-diff
    • Addedworkflow-build-and-run
    • Addedxcode-model-inspect
    • Changedxcodebuild-build1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "buildId": {
        +      "description": "Cache id for full build log (xcodebuild-get-details)",
        +      "type": "string"
        +    },
        +    "configuration": {
        +      "type": "string"
        +    },
        +    "durationMs": {
        +      "type": "number"
        +    },
        +    "errorCount": {
        +      "type": "number"
        +    },
        +    "scheme": {
        +      "type": "string"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    },
        +    "warningCount": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "buildId",
        +    "success",
        +    "errorCount",
        +    "warningCount",
        +    "durationMs",
        +    "scheme",
        +    "configuration"
        +  ],
        +  "type": "object"
        +}
    • Addedxcodebuild-inspect-scheme
    • Addedxcodebuild-showsdks
    • Changedxcodebuild-test1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "durationMs": {
        +      "type": "number"
        +    },
        +    "failed": {
        +      "type": "number"
        +    },
        +    "passed": {
        +      "type": "number"
        +    },
        +    "scheme": {
        +      "type": "string"
        +    },
        +    "skipped": {
        +      "type": "number"
        +    },
        +    "success": {
        +      "type": "boolean"
        +    },
        +    "testId": {
        +      "description": "Cache id for full test log (xcodebuild-get-details)",
        +      "type": "string"
        +    },
        +    "totalTests": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "testId",
        +    "success",
        +    "totalTests",
        +    "passed",
        +    "failed",
        +    "skipped",
        +    "scheme"
        +  ],
        +  "type": "object"
        +}
    • Addedxcodebuild-validate-capabilities
  2. 1 tool updatev2.0.2
    • Addedxcodebuild-test
  3. 1 tool updatev3.2.0
    • Removedxcodebuild-test
  4. 41 tool updatesv1.1.0
    • Addedaccessibility-quality-check
    • Addedcache
    • Removedcache-clear
    • Removedcache-get-config
    • Removedcache-get-stats
    • Removedcache-set-config
    • Addedidb-app
    • Addedidb-list-apps
    • Addedidb-targets
    • Addedidb-ui-describe
    • Addedidb-ui-find-element
    • Addedidb-ui-gesture
    • Addedidb-ui-input
    • Addedidb-ui-tap
    • Removedlist-cached-responses
    • Addedpersistence
    • Removedpersistence-disable
    • Removedpersistence-enable
    • Removedpersistence-status
    • Addedrtfm
    • Addedscreenshot
    • Addedsimctl-app
    • Removedsimctl-boot
    • Addedsimctl-device
    • Addedsimctl-get-app-container
    • Changedsimctl-get-details6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / cacheId / description
        Removed value: -"Cache ID from previous simctl-list call"
      • removedInput schema / properties / detailType / description
        Removed value: -"Type of details to retrieve"
      • removedInput schema / properties / deviceType / description
        Removed value: -"Filter by device type (iPhone, iPad, etc.)"
      • removedInput schema / properties / maxDevices / description
        Removed value: -"Maximum number of devices to return"
      • removedInput schema / properties / runtime / description
        Removed value: -"Filter by runtime version"
    • Addedsimctl-health-check
    • Addedsimctl-io
    • Changedsimctl-list7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / availability / description
        Removed value: -"Filter by device availability"
      • removedInput schema / properties / concise / description
        Removed value: -"Return concise summary (true) or full list (false)"
      • removedInput schema / properties / deviceType / description
        Removed value: -"Filter by device type (iPhone, iPad, Apple Watch, Apple TV)"
      • addedInput schema / properties / max
        Added value: +{
        +  "default": 5,
        +  "type": "number"
        +}
      • removedInput schema / properties / outputFormat / description
        Removed value: -"Output format preference"
      • removedInput schema / properties / runtime / description
        Removed value: -"Filter by iOS runtime version (e.g., \"17\", \"iOS 17.0\", \"16.4\")"
    • Addedsimctl-openurl
    • Addedsimctl-push
    • Removedsimctl-shutdown
    • Addedworkflow-fresh-install
    • Addedworkflow-tap-element
    • Changedxcodebuild-build7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / configuration / description
        Removed value: -"Build configuration (Debug, Release, etc.)"
      • removedInput schema / properties / derivedDataPath / description
        Removed value: -"Custom derived data path"
      • removedInput schema / properties / destination / description
        Removed value: -"Build destination. If not provided, uses intelligent defaults based on project history and available simulators."
      • removedInput schema / properties / projectPath / description
        Removed value: -"Path to .xcodeproj or .xcworkspace file"
      • removedInput schema / properties / scheme / description
        Removed value: -"Build scheme name"
      • removedInput schema / properties / sdk / description
        Removed value: -"SDK to use for building (e.g., \"iphonesimulator\", \"iphoneos\")"
    • Changedxcodebuild-clean4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / configuration / description
        Removed value: -"Configuration to clean"
      • removedInput schema / properties / projectPath / description
        Removed value: -"Path to .xcodeproj or .xcworkspace file"
      • removedInput schema / properties / scheme / description
        Removed value: -"Scheme to clean"
    • Changedxcodebuild-get-details4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / buildId / description
        Removed value: -"Build ID from previous xcodebuild-build call"
      • removedInput schema / properties / detailType / description
        Removed value: -"Type of details to retrieve"
      • removedInput schema / properties / maxLines / description
        Removed value: -"Maximum number of lines to return for logs"
    • Changedxcodebuild-list3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / outputFormat / description
        Removed value: -"Output format preference"
      • removedInput schema / properties / projectPath / description
        Removed value: -"Path to .xcodeproj or .xcworkspace file"
    • Removedxcodebuild-showsdks
    • Addedxcodebuild-test
    • Changedxcodebuild-version3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / outputFormat / description
        Removed value: -"Output format preference"
      • removedInput schema / properties / sdk / description
        Removed value: -"Specific SDK to query (optional)"
  5. 18 tool updatesv1.0.0
    • First observedcache-clear
    • First observedcache-get-config
    • First observedcache-get-stats
    • First observedcache-set-config
    • First observedlist-cached-responses
    • First observedpersistence-disable
    • First observedpersistence-enable
    • First observedpersistence-status
    • First observedsimctl-boot
    • First observedsimctl-get-details
    • First observedsimctl-list
    • First observedsimctl-shutdown
    • First observedxcodebuild-build
    • First observedxcodebuild-clean
    • First observedxcodebuild-get-details
    • First observedxcodebuild-list
    • First observedxcodebuild-showsdks
    • First observedxcodebuild-version

TDQS

A3.7/5.0

Scored across 77 tools

Disambiguation2/5

Family prefixes (xcodebuild-, simctl-, idb-) help, but the set contains several overlapping groups: simctl-launch/install/terminate mirror idb-launch/install/terminate, workflow-build-and-run overlaps workflow-fresh-install, and simctl-io overlaps screenshot for capture duties. Boundaries between simctl-get-app-container vs simctl-container and idb-ui-describe vs idb-ui-find-element vs accessibility-quality-check also blur, so agents must read deep documentation to avoid misselection.

Naming Consistency3/5

Most tools follow a readable {prefix}-{verb}-{object} pattern with consistent family prefixes like simctl-boot, cache-get-stats, and persistence-enable. However, there are notable exceptions: standalone names (screenshot, rtfm), noun-only resources (idb-targets), operation-parameter objects (simctl-status-bar), and inconsistent ordering (xcode-model-inspect, workflow-tap-element, localization-audit). The conventions are mixed but still broadly predictable.

Tool Count2/5

At 77 tools, this is far beyond the well-scoped range and imposes a heavy selection overhead on agents; the mirrored simctl/idb surfaces and multiple composite workflow tools inflate the count unnecessarily. The genuinely broad Xcode/simulator/idb domain justifies a larger-than-average surface, which keeps it from being a total mismatch, but it remains excessive.

Completeness4/5

The surface covers the full test-automation lifecycle—build, clean, test, simulator lifecycle, app install/launch, UI automation, screenshots, logs, crash analysis, permissions, keychain, appearance, location, and push—plus useful extras like localization audit, visual diff, and hang detection. Notable gaps remain: no xcodebuild archive/export for distribution, no signing or provisioning profile management, and no build-settings query.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Universal MCP server for executing TypeScript and Python code with progressive disclosure, reducing token usage by 98% by enabling on-demand access to all other MCP tools through code execution rather than loading tool definitions directly.
    9 npm
    130
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    A proxy server that wraps existing MCP servers to significantly reduce token consumption by compressing tool descriptions into a two-step interface. It enables users to integrate extensive toolsets without exceeding context limits or incurring high API costs.
    124
    Apache 2.0
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    A drop-in MCP proxy that aggregates multiple backend servers into two meta-tools for efficient tool discovery and execution. It enables AI clients to access hundreds of tools while minimizing context window usage through searchable indexing.
    1 npm
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Token-efficient MCP reimplementation with progressive tool discovery, result handling, and compact wire encoding, reducing token usage by up to 89% on tool definitions.
    1
    MIT