两个 MCP 服务器将 Claude Code 变成了 iOS 构建系统
我使用 Claude Code 开发 11 款 iOS 应用。我有守护 Git 安全的 hooks、强制执行代码质量的规则,以及编码了团队模式的代理定义。但在昨天之前,每次构建错误都意味着复制终端输出、粘贴回去,然后祈祷代理能理解上下文。模拟器管理靠的是原始的 xcrun simctl 命令。测试结果则是一堵堵无结构的文本墙。
两条 claude mcp add 命令改变了这一切。
摘要
XcodeBuildMCP(76 个工具,开源)处理构建、测试、模拟器、真机部署和 LLDB 调试——全程无需运行 Xcode。Apple 原生 Xcode MCP(20 个工具,随 Xcode 26.3 发布)通过 XPC 桥接到运行中的 Xcode 进程,提供文件操作、实时诊断、文档搜索、Swift REPL 和 SwiftUI 预览。两者结合,赋予 Claude Code 对 iOS 开发工具链的完整编程访问能力——结构化 JSON 取代日志解析,工具调用取代 shell 命令。设置不到 2 分钟。
缺口
Claude Code 在读写 Swift 方面表现出色。它理解 SwiftUI 模式、SwiftData 关系和 Swift 6 并发。但它对构建系统一无所知。
当构建失败时,代理必须:
- 通过 Bash 运行
xcodebuild - 解析数千行无结构的输出
- 期望能在噪音中找到真正的错误
- 猜测是哪个文件的哪一行导致了失败
当我想运行测试时:
- 代理凭记忆构造完整的
xcodebuild test命令 - 解析 xcresult 包(或更可能是原始 stdout)
- 试图弄清哪些测试通过了、哪些失败了
这相当于让开发者通过钥匙孔阅读编译器输出来编写代码。信息在技术上确实存在,但接口是错误的。
解决方案:两个互补的 MCP 服务器
XcodeBuildMCP(社区版,开源)
XcodeBuildMCP 将 xcodebuild 及相关工具封装为 76 个结构化 MCP 工具。代理调用 xcode_build 后获得的是包含分类错误、警告和文件位置的 JSON——而非 3,000 行构建日志。
关键工具:
| 工具 | 功能 |
|---|---|
build_sim / build_device |
针对模拟器或真机构建,带结构化错误输出 |
test_sim |
运行测试,按测试方法返回通过/失败结果 |
list_sims / boot_sim |
模拟器生命周期管理 |
discover_projs / list_schemes |
项目内省 |
debug_attach_sim / debug_stack |
LLDB 调试,支持断点和变量检查 |
snapshot_ui / screenshot |
UI 自动化和视觉截图 |
安装:
claude mcp add XcodeBuildMCP \
-s user \
-e XCODEBUILDMCP_SENTRY_DISABLED=true \
-- npx -y xcodebuildmcp@latest mcp
-s user 标志使其全局生效——在每个项目中都可用,无需逐项目配置。环境变量禁用遥测(默认会向 Sentry 发送崩溃报告;我选择退出)。1
Apple Xcode MCP(原生版,随 Xcode 26.3 发布)
Apple 在 Xcode 26.3 中通过 xcrun mcpbridge 发布了自己的 MCP 服务器。它暴露了 20 个工具,通过 XPC 直接桥接到 Xcode 进程:
| 类别 | 关键工具 |
|---|---|
| 文件操作 | XcodeRead、XcodeWrite、XcodeUpdate、XcodeGlob、XcodeGrep |
| 构建与测试 | BuildProject、GetBuildLog、RunAllTests、RunSomeTests |
| 诊断 | XcodeListNavigatorIssues、XcodeRefreshCodeIssuesInFile |
| 代码与文档 | ExecuteSnippet(Swift REPL)、DocumentationSearch、RenderPreview |
安装:
claude mcp add --transport stdio xcode -s user -- xcrun mcpbridge
需要 Xcode 26.3+(目前为候选发布版,即将正式发布)。
为什么需要两者?
它们在构建和测试上有重叠,但架构不同:
- XcodeBuildMCP 通过
xcodebuildCLI 独立工作——无需 Xcode 进程。它提供 76 个工具,涵盖模拟器、真机、LLDB 调试、UI 自动化和项目脚手架。适用于无头工作流和类 CI 开发。 - Apple Xcode MCP 需要运行中的 Xcode 实例,通过 XPC 通信。它在 Xcode 项目上下文中提供文件操作、实时代码诊断(不仅是构建输出),以及包含 WWDC 会议在内的原生文档搜索。
我同时使用两者:XcodeBuildMCP 用于构建-测试-调试循环(无需打开 Xcode 即可工作),Apple 的 MCP 用于文档查询、Swift REPL 验证或 SwiftUI 预览渲染。
真实场景测试
我对 Water 应用(SwiftUI + Metal 流体模拟 + HealthKit)进行了完整的健康检查,使用了以下提示词:
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)
发生了什么
模拟器设置使用了 list_sims、session_set_defaults 和 boot_sim。代理发现 iOS 26 运行时中不存在 iPhone 16 Pro(已停产),因此自动切换到 iPhone 17 Pro。这种自适应行为在硬编码的 xcodebuild 命令中是不可能实现的。
构建最初失败了——新 Xcode 安装尚未下载 Metal Toolchain。代理从结构化错误输出中检测到这一点,并运行 xcodebuild -downloadComponent MetalToolchain 来修复。构建随后成功,带有 3 个警告:
HomeView.swift:132 UIScreen.main deprecated in iOS 26.0
LogWaterIntent.swift:61 Result of try? is unused
结构化输出意味着这些警告以分类形式返回,带有精确的文件:行号引用,而非淹没在日志中。
测试失败了——但失败信息很有价值。结构化输出显示 5 个测试方法引用了 injectTapRipple(atNormalizedX:),这是我在之前的提交中已删除的方法。代理精确定位了相关提交(7657068 — "remove tap ripple interaction entirely"),并列出了哪些测试需要更新。零歧义。
文档搜索和 Swift REPL 确认 HKQuantityType(.dietaryWater) 有效,返回标识符 HKQuantityTypeIdentifierDietaryWater。
结果汇总
| 步骤 | 状态 | 使用的 MCP 工具 |
|---|---|---|
| 模拟器启动 | iPhone 17 Pro(iOS 26.2) | list_sims、session_set_defaults、boot_sim |
| 构建 | 通过(3 个警告) | build_sim、discover_projs、list_schemes |
| 测试 | 失败(过期测试引用) | test_sim |
| HealthKit 文档 | 已检索 | DocumentationSearch |
| Swift REPL | 已验证 | ExecuteSnippet |
整个健康检查自主运行。我没有打开 Xcode,没有复制任何错误消息,没有构造任何 xcodebuild 命令。
教会代理
安装 MCP 服务器还不够。代理需要知道这些工具的存在,以及何时优先于原始 shell 命令使用它们。我更新了 ios-developer 代理定义,加入了明确的指导:
## 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.
如果没有这些指导,代理有时会退回到通过 Bash 使用 xcodebuild,或者使用 WebSearch 搜索 Apple 文档而非原生搜索。代理定义弥补了这一差距。2
实际工作流的变化
引入 MCP 之前,我使用 Claude Code 的 iOS 工作流是:
- 用 Claude 编写代码
- 在 Xcode 中手动构建(或在终端中使用 xcodebuild)
- 将错误复制回 Claude
- 重复
引入 MCP 之后:
- 描述我想要的功能
- Claude 编写代码、构建、读取错误、修复、运行测试、验证 API 行为
- 我审查最终结果
过去需要我主动参与的构建-报错-修复循环,现在可以自主完成。代理不再从原始文本中猜测哪里出了问题——它读取的是结构化数据,精确告诉它什么失败了、在哪里、为什么。
这是我在 AI 工具中反复看到的模式:突破点不在于让 AI 更聪明,而在于赋予它对开发者已有工具的结构化访问。 MCP 是实现这一点的协议——正如 hooks 为 Claude Code 提供了确定性护栏,MCP 为它提供了确定性工具接口。Xcode 不是第一个,也不会是最后一个通过 MCP 暴露自身能力的开发工具。3
设置清单
适用于使用 Claude Code 开发 iOS 项目的所有人:
-
安装 XcodeBuildMCP(需要 Xcode 26.3+):
bash claude mcp add XcodeBuildMCP -s user \ -e XCODEBUILDMCP_SENTRY_DISABLED=true \ -- npx -y xcodebuildmcp@latest mcp -
安装 Apple Xcode MCP(需要 Xcode 26.3+):
bash claude mcp add --transport stdio xcode \ -s user -- xcrun mcpbridge -
验证两者已连接:
bash claude mcp list # XcodeBuildMCP: ... - Connected # xcode: xcrun mcpbridge - Connected -
更新您的代理定义以引用新工具(否则代理有时会退回到 shell 命令)。
-
启动新的 Claude Code 会话——会话中途注册的 MCP 工具在重启前不会出现在工具搜索中。
就是这样。两条命令,完整的 iOS 构建系统访问。
常见问题
我还需要安装 Xcode 吗?
是的。两个 MCP 服务器都是 Xcode 工具链(xcodebuild、xcrun、simctl)的封装。必须安装并配置好 Xcode。MCP 服务器为 Claude Code 提供对这些工具的结构化访问——而非替代它们。
XcodeBuildMCP 是否支持纯 SwiftPM 项目?
是的。XcodeBuildMCP 同时支持 .xcodeproj/.xcworkspace 和 Swift Package Manager 项目。使用 discover_projs 查找可用的项目类型,然后使用 build_sim 或 build_device 配合相应的 scheme。
CI/CD 管道怎么办?
MCP 服务器在本地与 Claude Code 一起运行。对于 CI/CD,您仍然应该直接使用 xcodebuild 或 Fastlane 等工具。MCP 方案专门用于交互式开发循环,即 AI 代理在代码-构建-测试周期中需要结构化反馈的场景。
-
XcodeBuildMCP 默认包含 Sentry 遥测。该项目的隐私文档详细说明了发送的内容:错误消息、堆栈跟踪,以及某些情况下的文件路径。
XCODEBUILDMCP_SENTRY_DISABLED=true环境变量可完全退出。 ↩ -
Claude Code 在总工具数量较多时使用 Tool Search 延迟加载 MCP 工具。仅 XcodeBuildMCP 就有 76 个工具,明确的代理指导帮助代理在第一次尝试时就找到正确的工具,而非退回到 shell 命令。 ↩
-
这呼应了我在 Claude Code hooks 文章中提到的模式:在概率性 AI 之上建立确定性基础设施。MCP 服务器提供结构化、可靠的接口。AI 提供关于何时以及如何使用它们的判断。两者缺一不可。 ↩