← All Posts

Two MCP Servers Made Claude Code an iOS Build System

I develop 11 iOS apps with Claude Code. I have hooks that guard my git safety, rules that enforce code quality, and agent definitions that encode my team’s patterns. But until yesterday, every build error meant copying terminal output, pasting it back, and hoping the agent understood the context. Simulator management was raw xcrun simctl commands. Test results came as unstructured walls of text.

Two claude mcp add commands changed that. MCP (Model Context Protocol) is an open standard, specified at modelcontextprotocol.io, that lets AI agents call tools on external systems through structured JSON requests and responses — the same idea as a REST API, but designed for agent-to-tool communication.5

TL;DR

XcodeBuildMCP (59 tools, open source) handles builds, tests, simulators, real device deployment, and LLDB debugging — all without Xcode running. Apple’s native Xcode MCP (20 tools, ships with Xcode 26.3) bridges into a running Xcode process for file operations, real-time diagnostics, documentation search, Swift REPL, and SwiftUI previews. Together they give Claude Code full programmatic access to the iOS development toolchain — structured JSON instead of log parsing, tool calls instead of shell commands. Setup takes under 2 minutes.


The Gap

Claude Code is exceptional at reading and writing Swift. It understands SwiftUI patterns, SwiftData relationships, and Swift 6 concurrency. But it was blind to the build system.

When a build failed, the agent had to:

  1. Run xcodebuild via Bash
  2. Parse thousands of lines of unstructured output
  3. Hope it found the actual error among the noise
  4. Guess which file and line caused the failure

When I wanted tests run:

  1. Agent constructs the full xcodebuild test command from memory
  2. Parse the xcresult bundle (or more likely, the raw stdout)
  3. Try to figure out which tests passed and which failed

The workflow was equivalent to asking a developer to write code by reading compiler output through a keyhole. The information was technically there, but the interface was wrong.

The Fix: Two Complementary MCP Servers

XcodeBuildMCP (Community, Open Source)

XcodeBuildMCP wraps xcodebuild and related tools into 59 structured MCP tools. The agent calls build_sim and gets back JSON with categorized errors, warnings, and file locations — not a 3,000-line build log.

Key tools:

Tool What It Does
build_sim / build_device Build for simulator or device with structured error output
test_sim Run tests with pass/fail results per test method
list_sims / boot_sim Simulator lifecycle management
discover_projs / list_schemes Project introspection
debug_attach_sim / debug_stack LLDB debugging with breakpoints and variable inspection
snapshot_ui / screenshot UI automation and visual capture

Installation:

claude mcp add XcodeBuildMCP \
  -s user \
  -e XCODEBUILDMCP_SENTRY_DISABLED=true \
  -- npx -y xcodebuildmcp@latest mcp

The -s user flag makes it global — available in every project without per-project configuration. The env var disables telemetry (the default sends crash reports to Sentry; I prefer to opt out).1

Apple Xcode MCP (Native, Ships with Xcode 26.3)

Apple shipped their own MCP server in Xcode 26.3 via xcrun mcpbridge. It exposes 20 tools that bridge directly into Xcode’s process via XPC. Important caveat: Apple has not published standalone documentation for the MCP server as of February 2026. The tool list below is based on the author’s testing and Rudrank Riyam’s early analysis. Tool names and capabilities may change in future Xcode releases:

Category Key Tools
File operations XcodeRead, XcodeWrite, XcodeUpdate, XcodeGlob, XcodeGrep
Build & test BuildProject, GetBuildLog, RunAllTests, RunSomeTests
Diagnostics XcodeListNavigatorIssues, XcodeRefreshCodeIssuesInFile
Code & docs ExecuteSnippet (Swift REPL), DocumentationSearch, RenderPreview

Installation:

claude mcp add --transport stdio xcode -s user -- xcrun mcpbridge

Requires Xcode 26.3+.

Why Both?

They overlap on builds and tests, but the architecture differs:

  • XcodeBuildMCP works standalone via xcodebuild CLI — no Xcode process required. It adds 59 tools covering simulators, real devices, LLDB debugging, UI automation, and project scaffolding. The standalone architecture matters because it enables headless workflows: the agent can build and test without opening Xcode, which is faster and consumes less system memory.
  • Apple Xcode MCP requires a running Xcode instance and communicates via XPC (Apple’s inter-process communication framework). It provides file operations within the Xcode project context, real-time code diagnostics (not just build output), and native doc search including WWDC sessions. The XPC bridge matters because it exposes Xcode’s internal state — live diagnostics, resolved symbols, preview rendering — that no CLI tool can access.

I use both: XcodeBuildMCP for the build-test-debug cycle (it works without Xcode open), and Apple’s MCP when I need documentation lookups, Swift REPL verification, or SwiftUI preview rendering.

The deeper insight is the difference between structured and unstructured interfaces. When an AI agent runs xcodebuild via Bash, it receives a stream of unstructured text and must parse it heuristically — guessing where errors start and end, inferring file paths from partial matches, and hoping the format hasn’t changed. When the same agent calls build_sim via MCP, it receives a JSON response with categorized errors, warnings, file paths, and line numbers in predictable fields. The agent’s task shifts from parsing to reasoning. The difference matters doubly for LLM-based agents: every character of unstructured build output consumes context window tokens, which means a 3,000-line build log can exhaust working memory before the agent finds the one error that matters. Structured JSON responses let the agent read the error directly instead of searching for it. MCP does not make the agent smarter. It makes the information the agent receives legible.


The Real-World Test

I ran a full health check on my Water app (SwiftUI + Metal fluid simulation + HealthKit) using this prompt:

Use the XcodeBuildMCP and Apple Xcode MCP tools to do a full
health check of this project:

1. List available simulators and boot an iPhone 16 Pro
2. Build the project for that simulator
3. Run existing tests and report pass/fail results
4. Search Apple docs for "HealthKit water intake"
5. Use the Swift REPL to verify HKQuantityType(.dietaryWater)

What Happened

Simulator setup used list_sims, session_set_defaults, and boot_sim. The agent discovered that no iPhone 16 Pro exists in the iOS 26 runtime (it was retired), so it automatically switched to iPhone 17 Pro. The automatic fallback is the kind of adaptive behavior that breaks with hardcoded xcodebuild commands.

Build initially failed — the Metal Toolchain was not downloaded on the new Xcode installation. The agent detected this from the structured error output and ran xcodebuild -downloadComponent MetalToolchain to fix it. Build then succeeded with 3 warnings:

HomeView.swift:132    UIScreen.main deprecated in iOS 26.0
LogWaterIntent.swift:61   Result of try? is unused

Structured output meant these came back as categorized warnings with exact file:line references, not buried in a log.

Tests failed — but the failure was informative. The structured output showed that 5 test methods referenced injectTapRipple(atNormalizedX:), a method I removed in a previous commit. The agent identified the exact commit (7657068 — "remove tap ripple interaction entirely") and listed which tests needed updating. Zero ambiguity.

Documentation search and Swift REPL confirmed that HKQuantityType(.dietaryWater) is valid, returning identifier HKQuantityTypeIdentifierDietaryWater.

The Result Table

Step Status MCP Tools Used
Simulator boot iPhone 17 Pro (iOS 26.2) list_sims, session_set_defaults, boot_sim
Build PASS (3 warnings) build_sim, discover_projs, list_schemes
Tests FAIL (stale test refs) test_sim
HealthKit docs Researched DocumentationSearch
Swift REPL Verified ExecuteSnippet

The entire health check ran autonomously in approximately 90 seconds, including simulator boot time. I did not open Xcode, did not copy any error messages, did not construct any xcodebuild commands. Before MCP, the same five-step health check required approximately 8-10 minutes of active human involvement: writing xcodebuild commands, parsing output, switching to Xcode for documentation search, opening Swift Playgrounds for REPL verification. The time savings come not from faster builds (the build takes the same amount of time) but from eliminating the human-in-the-loop parsing steps between each stage.

Structured vs. Unstructured: What the Agent Actually Sees

The difference is concrete. Here is the same build error through both interfaces:

Via Bash (xcodebuild raw output) — 47 lines of noise surrounding one error:

CompileSwift normal arm64 /Users/.../HomeView.swift
...
/Users/blake/Projects/Water/Water/Views/HomeView.swift:132:9:
warning: 'main' is deprecated: Use UIScreen.main in iOS 16.0+
         ^~~~~~~~
** BUILD FAILED **
The following build commands failed:
  CompileSwift normal arm64 .../FluidRenderer.swift
...

The agent must parse thousands of lines, guess where errors start and end, and infer file paths from partial matches — consuming context window tokens for every line of noise.

Via MCP (build_sim structured response) — exact error in predictable fields (simplified for illustration; actual response includes additional fields like build duration and scheme):

{
  "status": "failed",
  "errors": [{
    "file": "FluidRenderer.swift",
    "line": 89,
    "message": "Cannot find 'MTLPixelFormat' in scope",
    "severity": "error"
  }],
  "warnings": [{
    "file": "HomeView.swift",
    "line": 132,
    "message": "'main' is deprecated in iOS 26.0",
    "severity": "warning"
  }]
}

The agent reads the error directly, identifies the file and line, and starts reasoning about the fix. No parsing, no guessing, no wasted tokens. The context window cost drops from thousands of tokens to dozens.


Teaching the Agent

Installing MCP servers is not enough. The agent needs to know the tools exist and when to prefer them over raw shell commands. I updated my ios-developer agent definition to include explicit guidance:

## Build & Test Tools (XcodeBuildMCP)

Prefer MCP tools over raw xcodebuild commands:

- **Build**: Use `build_sim` / `build_device` for structured errors
- **Test**: Use `test_sim` / `test_device` for pass/fail results
- **Simulators**: Use `list_sims`, `boot_sim`, `open_sim`
- **Debug**: Use `debug_attach_sim`, `debug_stack`, `debug_variables`

## Apple Xcode MCP (mcpbridge)

- **Documentation**: Use `DocumentationSearch` for Apple docs
- **Swift REPL**: Use `ExecuteSnippet` for API verification
- **Previews**: Use `RenderPreview` for headless SwiftUI rendering

Prefer these over WebSearch for Apple API questions
and over Bash `swift` for REPL tasks.

Without this, the agent will sometimes fall back to xcodebuild via Bash or use WebSearch for Apple documentation instead of the native search. The agent definition closes that gap.2


What Changes in Practice

Before MCP, my iOS workflow with Claude Code was:

  1. Write code with Claude
  2. Build manually in Xcode (or via xcodebuild in terminal)
  3. Copy errors back to Claude
  4. Repeat

After MCP:

  1. Describe what I want
  2. Claude writes the code, builds it, reads the errors, fixes them, runs tests, and verifies the API behavior
  3. I review the final result

The build-error-fix loop that used to require my active participation now happens autonomously. The agent is not guessing what went wrong from raw text — it reads structured data that tells it exactly what failed, where, and why.

The pattern keeps repeating across AI tooling: the breakthrough is not making the AI smarter, it is giving it structured access to the tools developers already use. MCP is the protocol that makes this possible — just as hooks gave Claude Code deterministic guardrails, MCP gives it deterministic tool interfaces. Xcode is not the first and will not be the last development tool to expose itself through MCP.3

Other developers report similar results with MCP-based build systems. Rudrank Riyam’s detailed walkthrough of Apple’s Xcode MCP tools confirmed the documentation search and Swift REPL capabilities described here and noted the same XPC dependency limitation.6 The broader MCP ecosystem now includes servers for Docker, PostgreSQL, GitHub, and Kubernetes — each following the same pattern of wrapping CLI tools in structured JSON interfaces.7 Apple’s WWDC 2025 session “Meet the Xcode MCP server” (session 250) introduced the feature as part of Apple’s broader investment in AI-assisted development, positioning MCP as the standard interface between AI agents and development tools rather than a niche protocol.8

The efficiency gain from structured interfaces is consistent with broader research on AI tool use. Jimenez et al.’s SWE-bench (2024) found that agents with access to structured tooling (file-level edit tools, test runners with structured output) solved significantly more GitHub issues than agents limited to bash commands with unstructured output.9 The pattern is not Xcode-specific: structured tool access improves agent performance across domains because it shifts the agent’s task from parsing to reasoning.


Limitations and Current Gaps

MCP is not a universal fix. Honest accounting of what it cannot do:

No visual debugging. MCP returns structured data about build errors and test results, but it cannot show you the visual state of the app. A layout bug where a view renders 10 pixels off-center produces no build error and passes all logic tests. The screenshot and snapshot_ui tools in XcodeBuildMCP capture the screen, but interpreting visual correctness still requires human review (or a separate vision model). The agent can build, run, and test — it cannot see.

Xcode process dependency for Apple MCP. Apple’s xcrun mcpbridge requires a running Xcode instance. If Xcode crashes or is closed, every MCP call through that server fails silently or hangs. XcodeBuildMCP avoids this by using xcodebuild directly, but any tool that bridges into Xcode’s XPC interface inherits Xcode’s process lifecycle. In practice, this means keeping Xcode open during sessions that use documentation search or SwiftUI previews.

No incremental build awareness. The build_sim tool runs a full build. It does not know whether the previous build succeeded and only one file changed. The agent rebuilds from scratch on every invocation. For large projects, this adds 15-30 seconds per build cycle that xcodebuild with incremental build support would avoid. The overhead is acceptable for the structured output, but it is a real cost.

Apple MCP tool instability. Apple shipped the MCP server in Xcode 26.3 without public documentation. Tool names, parameter formats, and response structures may change in future Xcode releases without deprecation warnings. Any code that depends on specific Apple MCP tool signatures should be treated as provisional. XcodeBuildMCP, being open source and community-maintained, provides more stable interfaces with semantic versioning and changelogs.4

No code signing diagnostics. Provisioning profile errors, certificate mismatches, and entitlement conflicts produce some of the most opaque build failures in iOS development. Neither MCP server provides structured diagnosis of code signing issues beyond the raw error message. The agent receives “Code signing failed” with a file path, but not “your provisioning profile expired on February 15” or “this entitlement requires a specific App ID prefix.” Code signing remains a manual debugging domain.


Setup Checklist

For anyone running Claude Code with iOS projects:

  1. Install XcodeBuildMCP (requires Xcode 26.3+): bash claude mcp add XcodeBuildMCP -s user \ -e XCODEBUILDMCP_SENTRY_DISABLED=true \ -- npx -y xcodebuildmcp@latest mcp

  2. Install Apple Xcode MCP (requires Xcode 26.3+): bash claude mcp add --transport stdio xcode \ -s user -- xcrun mcpbridge

  3. Verify both are connected: bash claude mcp list # XcodeBuildMCP: ... - Connected # xcode: xcrun mcpbridge - Connected

  4. Update your agent definitions to reference the new tools (or the agent will sometimes fall back to shell commands).

  5. Start a fresh Claude Code session — MCP tools registered mid-session will not appear in tool search until restart.

That is it. Two commands, full iOS build system access.

Try this after setup: Ask Claude Code to “build this project for the simulator and report any errors.” Compare the response to what you get from running xcodebuild -scheme YourScheme -sdk iphonesimulator build via Bash. The MCP response categorizes errors by file and severity in structured fields. The raw xcodebuild output buries the same information in thousands of lines of interleaved compiler output. The difference is immediately visible on the first build error.


Key Takeaways

For iOS developers using AI agents:

  • Structured tool access changes what agents can do. The gap between “agent writes code and hopes you build it” and “agent writes code, builds it, reads the errors, and fixes them” is the gap between a text completion tool and a development partner. MCP closes that gap by giving the agent structured JSON instead of unstructured build logs.

  • Two MCP servers cover complementary needs. XcodeBuildMCP works without Xcode open (headless builds, simulators, debugging). Apple’s Xcode MCP bridges into a running Xcode process (diagnostics, documentation, SwiftUI previews). Use both for full coverage of the iOS development workflow.

For engineers evaluating MCP for other toolchains:

  • The pattern generalizes beyond Xcode. Any development tool that outputs unstructured text (compilers, linters, test runners, package managers) becomes more useful to AI agents when wrapped in structured MCP interfaces. The protocol matters less than the insight: agents reason better when information arrives in predictable fields rather than variable-format logs.

  • Agent definitions close the last-mile gap. Installing MCP servers is necessary but insufficient. Explicit guidance in agent definitions (“prefer build_sim over xcodebuild”) prevents the agent from falling back to shell commands when structured alternatives exist.


FAQ

Do I still need Xcode installed to use MCP with Claude Code?

Yes. Both MCP servers are wrappers around Xcode’s toolchain (xcodebuild, xcrun, simctl). Xcode must be installed and configured. The MCP servers give Claude Code structured access to these tools — they do not replace them.

Does XcodeBuildMCP work with SwiftPM-only projects?

Yes. XcodeBuildMCP supports both .xcodeproj/.xcworkspace and Swift Package Manager projects. Use discover_projs to find available project types, then build_sim or build_device with the appropriate scheme.

What about CI/CD pipelines?

MCP servers run locally with Claude Code. For CI/CD, you would continue using xcodebuild directly or tools like Fastlane. The MCP approach is specifically for the interactive development loop where an AI agent needs structured feedback during the code-build-test cycle.

What is MCP and why does it matter for AI development tools?

Model Context Protocol (MCP) is an open standard that defines how AI agents communicate with external tools through structured JSON requests and responses. Before MCP, agents interacted with developer tools by running shell commands and parsing their unstructured text output — a brittle approach that breaks when output formats change and wastes context window tokens on noise. MCP standardizes the interface: the agent sends a structured request (build_sim with parameters), and the tool returns a structured response (JSON with categorized errors, file paths, and line numbers). The agent’s task shifts from parsing to reasoning. MCP is to AI agent tooling what REST was to web APIs: a shared protocol that lets any tool expose structured capabilities to any agent.



  1. XcodeBuildMCP includes Sentry telemetry by default. The project’s privacy documentation details what gets sent: error messages, stack traces, and in some cases file paths. The XCODEBUILDMCP_SENTRY_DISABLED=true env var opts out entirely. 

  2. Claude Code uses Tool Search to lazy-load MCP tools when the total tool count is high. With 59 tools from XcodeBuildMCP alone, explicit agent guidance helps the agent discover the right tool on the first try rather than falling back to shell commands. 

  3. This echoes a pattern from my Claude Code hooks article: deterministic infrastructure on top of probabilistic AI. MCP servers provide structured, reliable interfaces. The AI provides the judgment about when and how to use them. Neither alone is sufficient. 

  4. XcodeBuildMCP follows semantic versioning. The tool list and parameter formats are documented in the project’s README and CHANGELOG. See github.com/getsentry/XcodeBuildMCP/releases for version history. As of February 2026, the latest release is version 1.x with 59 tools across simulator, device, debugging, and UI automation workflows. 

  5. Anthropic, “Model Context Protocol Specification,” modelcontextprotocol.io/specification. The MCP specification defines the JSON-RPC transport, tool discovery, and resource protocol that both XcodeBuildMCP and Apple’s Xcode MCP implement. The specification is open and maintained by Anthropic with community contributions. 

  6. Rudrank Riyam, “Exploring Xcode Using MCP Tools,” rudrank.com/exploring-xcode-using-mcp-tools-cursor-external-clients, 2026. Riyam’s walkthrough independently confirms the 20-tool count, the XPC dependency on a running Xcode instance, and the documentation search capabilities described in this post. His analysis also covers using Apple’s MCP server with Cursor and other external clients. 

  7. The MCP ecosystem catalog at modelcontextprotocol.io/examples lists community-maintained servers for Docker, PostgreSQL, GitHub, Kubernetes, Slack, and dozens of other tools. Each follows the same pattern: wrapping an existing CLI or API in structured JSON tool interfaces. The breadth of the ecosystem validates that MCP is not Xcode-specific but a general-purpose protocol for AI-agent-to-tool communication. 

  8. Apple, “Meet the Xcode MCP server,” WWDC 2025. Apple introduced the Xcode MCP server as part of their intelligent developer tools initiative, positioning MCP as the interface layer between AI coding assistants and the Xcode toolchain. The session demonstrated Swift REPL execution, documentation search, and build diagnostics through the MCP bridge — the same capabilities described in this post. Session available at developer.apple.com/wwdc25/

  9. Jimenez, C.E., Yang, J., Wettig, A., et al., “SWE-bench: Can Language Models Resolve Real-World GitHub Issues?” ICLR 2024. arxiv.org/abs/2310.06770. SWE-bench evaluates language models on their ability to resolve real GitHub issues. Agents with structured tool access (targeted file editing, structured test output) significantly outperformed agents limited to unstructured shell commands. The finding validates the core thesis of this post: structured interfaces improve agent effectiveness not by making agents smarter but by making the information they receive legible. 

Related Posts

Context Window Management: What 50 Sessions Taught Me About AI Development

I measured token consumption across 50 Claude Code sessions. Context exhaustion degrades output before you notice. Here …

6 min read

Claude Code Hooks: Why Each of My 95 Hooks Exists

I built 95 hooks for Claude Code. Each one exists because something went wrong. Here are the origin stories and the arch…

7 min read

PRD-Driven Development: How I Use 30+ PRDs to Ship with AI Agents

I've written 30+ PRDs for AI agent tasks. Here's where PRD-driven development works, where it fails, and how my template…

7 min read