MCP server that wraps Xcode command-line tools for iOS/macOS development workflows
xc-mcp shows solid craftsmanship in domain-specific iOS/macOS tooling with clear verb-based naming and detailed parameter descriptions. However, several tools lack proper output schema documentation, and some parameters are underspecified (missing type constraints, enums, ranges). The hang-* suite is well-structured with good descriptions but output formats are partially inferred. The simctl-* and idb-* tools have good intent clarity but missing schema formalization. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present despite the framework supporting them. Average tool score is 62/100.
Return the full L2 summary for a stopped HangBuster session, or the per-event detail of a specific cluster.
List all HangBuster capture sessions (newest first) with status, device, and timestamps.
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.
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).
List installed applications - discover apps available for testing with bundle IDs and running status. 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.
Parameter enumerations not formalized as JSON Schema enums. Parameters like 'operation' (idb-targets), 'filterType' (idb-list-apps), 'theme' (simctl-appearance), 'textSize' (simctl-appearance), 'containerType' (simctl-get-app-container) are documented as free-form strings with example values in descriptions, violating pattern:constrained-input. LLMs will hallucinate invalid values.
Output schemas completely undocumented across all 9 tools. Users/LLMs cannot determine what fields to expect from responses. This violates pattern:tool and pattern:response-shaper, agents cannot reliably parse outputs or chain tool calls when response formats are invisible.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
Unified IDB target management - discover, inspect, focus, and manage connections. Routes IDB operations (list, describe, focus, connect, disconnect) to specialized handlers while maintaining modular code organization.
MCP tool that returns full documentation for any registered tool or category. Enables progressive disclosure - concise descriptions in tool list, full documentation only when explicitly requested.
Control iOS simulator appearance: theme (light/dark), dynamic type size, locale, and region. 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.
Access iOS app file system containers for inspection. 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.
No pagination support on list/discover tools (hang-list, idb-targets list mode, idb-list-apps). Pattern:paginated-result requires page/offset+limit and total count. Without pagination, large result sets blow the LLM context window and risk hallucination.
Numeric parameters lack explicit range constraints. 'minHangMs' (hang-start), 'topN' (hang-stop), 'budgetTokens' (hang-stop) are numbers with no min/max documented. LLMs can pass negative, zero, or absurd values (e.g. topN=9999, budgetTokens=999999) that may break the pipeline or cause timeouts.
idb-targets tool combines 5 operations (list, describe, focus, connect, disconnect) into one with an overloaded 'operation' string parameter. This violates pattern:tool (each tool should do ONE thing). Should split into idb-list-targets, idb-describe-target, idb-focus-target, idb-connect-target, idb-disconnect-target with clear per-operation parameter sets.
No error handling guidance in descriptions. Tools do not explain what errors LLMs should expect or how to recover. E.g. hang-get-details says 'Unknown hang session' but does not guide the LLM to call hang-list first. Pattern:recovery-guide requires actionable error context.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite framework supporting them. Risk classifications are noted in metadata (WRITE vs READ_ONLY) but not exposed in tool definitions. Pattern:command-tool requires explicit state-mutation marking for agents to know which calls are safe to retry.
simctl-appearance 'reset' parameter declared incompatible with others but documentation does not enforce mutual exclusivity in a machine-parseable way. An LLM might pass reset=true alongside theme='dark', causing ambiguous behavior.
Parameters accept free-form UDID strings ('udim' or 'booted') with auto-detection logic buried in tool code. Pattern:natural-identifiers suggests accepting multiple identifier types (UDID, simulator name) with resolution inside the tool, but this is not documented for users. Risk: LLM does not know what values are valid.