MCP server for iOS app testing, diagnosis, and automation. Provides tools for accessibility checks, localization testing, multi-device layout verification, UI automation planning, and comprehensive build/test/runtime diagnostics.
XCForge provides 15 tools with complete input schemas and descriptions. Naming is action-oriented (accessibility_check, diagnose_start, run_plan). Descriptions are detailed (100-300 chars) and explain WHAT and WHEN. However, parameter descriptions lack specificity on constraints (e.g., 'threshold' has no min/max bounds, 'sizes' accepts free-form strings instead of enums). Output schemas are not documented, LLMs cannot predict response structure for chaining. Error handling is minimal; no recovery guidance. Tool composition is reasonable (separate diagnose_* tools for different phases), but run_plan's step syntax is complex and underdocumented.
Render the current app screen across multiple Dynamic Type content size categories and detect truncation or layout issues. Takes a screenshot at each size and compares against the base size.
Diagnose a build for an existing diagnosis run. Equivalent to `xcforge diagnose build --json`. Returns a JSON object with build diagnosis summary, evidence, and failure details. If run_id is omitted, uses the newest active or recent run.
Compare an original diagnosis result against the latest rerun. Equivalent to `xcforge diagnose compare --json`. If run_id is omitted, uses the newest active or recent run.
Inspect all available evidence for an active or recent diagnosis run. Equivalent to `xcforge diagnose evidence --json`. If run_id is omitted, uses the newest active or recent run.
Consolidated troubleshooting view for investigating workflow outcomes. Equivalent to `xcforge diagnose inspect --json`. Correlates the action timeline, evidence availability, terminal classification with observed-vs-inferred separation, and context provenance in one result. If run_id is omitted, uses the newest active or recent run.
Output schemas not documented. LLMs cannot predict response structure for diagnose_* tools, blocking downstream chaining and forcing exploratory calls.
Parameter constraints missing. 'threshold' (numeric) lacks min/max bounds; 'sizes' and 'locales' accept free-form strings instead of enums, inviting invalid values.
run_plan step syntax underdocumented. The 'steps' array accepts arbitrary JSON objects with action keys (find, click, verify, etc.), but no schema or examples guide LLM construction of valid steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Return the final proof-oriented result for a diagnosis run. Equivalent to `xcforge diagnose result --json`. If run_id is omitted, uses the newest terminal run.
Launch the app for an existing diagnosis run and capture runtime signals. Equivalent to `xcforge diagnose runtime --json`. Returns a JSON object with runtime diagnosis results. If run_id is omitted, uses the newest active or recent run.
Create a diagnosis run with resolved context. Equivalent to `xcforge diagnose start --json`. Returns a JSON object with schemaVersion, workflow, phase, status, runId, and resolvedContext.
Inspect the status of an active or recent diagnosis run. Equivalent to `xcforge diagnose status --json`. If run_id is omitted, uses the newest active or recent run.
Diagnose a test run for an existing diagnosis run. Equivalent to `xcforge diagnose test --json`. Returns a JSON object with test diagnosis summary and failure details. If run_id is omitted, uses the newest active or recent run.
Rerun validation for a prior diagnosis run. Equivalent to `xcforge diagnose verify --json`. Accepts optional overrides for project, scheme, simulator, and configuration. If run_id is omitted, uses the newest active or recent run.
Render the current app screen across multiple languages/locales and detect layout breaks. Supports RTL languages (Arabic, Hebrew). Takes a screenshot at each locale and compares against the base.
Install and launch an app on multiple simulators in parallel, take screenshots, and compare them. Supports Dark Mode, Landscape, and iPad. Returns inline screenshots, pixel-diff for same-resolution pairs, and a Layout Score (0-100, weighted average of per-pair similarity across all device combinations). Use to verify responsive layout across different screen sizes in a single call.
Execute a multi-step UI automation plan server-side. Dramatically reduces round-trips: 1 call replaces 15+ sequential find/click/verify calls. Each step is a JSON object with a single action key (find, click, verify, etc.). Steps run sequentially. Use "$var" to bind and reference elements across steps. If a "judge" or "handleUnexpected" step is reached, the plan suspends — call run_plan_decide with the returned session_id to resume. Returns a structured report with per-step status and optional screenshots.
Resume a suspended plan after a judge/handleUnexpected step. Provide the session_id from the run_plan response and your decision. Decisions: 'accept' (accept alert/continue), 'dismiss' (dismiss alert), 'skip' (skip this step), 'abort' (stop the plan), or any freeform text as guidance for the next step. Returns the merged report covering all steps (before and after suspend).
Error handling lacks recovery guidance. Tools return generic failures without actionable next steps (e.g., 'run_id not found' should suggest diagnose_start or list recent runs).
Diagnose tool descriptions are generic. 'Inspect the status of an active or recent diagnosis run' does not explain what status fields are returned or when to call this vs diagnose_evidence or diagnose_inspect.