dsh-mcp-xcode:把 Xcode headless 能力接入 DSH agent

前言

在 DSH(DeepSeek Harness)里做 macOS / iOS 开发,有一个现实问题:构建工程、跑单元测试、看 SwiftUI Preview、操作模拟器,这些事平时都在 Xcode UI 里完成,agent 插不上手。DSH 的理念是「一切皆插件」,这类能力缺口通常靠插件来补。

Xcode 27 起,系统内置了 headless MCP 服务(xcrun mcp-server / xcrun mcpbridge),把上述能力以 MCP 工具的形式暴露出来。但要在 DSH 里用上它们,还需要一层桥接,把这些 MCP 工具转成 DSH 原生工具。本文介绍的 dsh-mcp-xcode 就是这样一个插件。

这是什么

dsh-mcp-xcode 是 nanshanyi 维护的 DSH 插件,定位一句话:把 Xcode Headless MCP(xcrun mcpbridge)桥接为 DSH 原生工具。装上之后,DSH agent 无需打开 Xcode UI,就能直接调用 Xcode 的全部 headless 能力。

实现上,插件通过 subprocess 启动 /usr/bin/xcrun mcpbridge,在 stdio 上自行实现 MCP(JSON-RPC 2.0)客户端,连接建立后把 tools/list 返回的工具逐个注册为 DSH 工具。运行环境要求 Node >= 20,零运行时依赖。

核心功能

桥接之后,agent 可用的能力包括:

  • 创建 / 打开工程、构建、测试;
  • 渲染 SwiftUI Preview 为 PNG;
  • 启动模拟器并交互(tap / type / swipe);
  • 读取截图与无障碍层级;
  • 读取 OSLog。

Xcode 27 实测共有 54 个工具,插件把它们统一注册为 xcode_<原名> 格式的 DSH 工具。工具调用过程中的截图会自动存入 attachment,并通过 deferContext 注入下一轮模型上下文。

插件自带一个控制工具 xcode_mcp_status,用于查看连接状态、强制重连、查看 bridge stderr。

另外有断桥自愈机制:xcrun mcpbridge 进程崩溃或被终止后,xcode_* 工具保持注册,下一次调用会自动重连并同步注册(按名对账,不会出现 already registered),不需要人工干预。

安装与启用

先确认前置条件:macOS + Xcode 27 或更高(headless MCP 自 Xcode 27 beta 5 起内置,更早版本没有这些命令;本项目在 27.0 27A5237l 上开发验证),并保证 headless 服务已开启并运行:

xcrun mcp-server status          # Permission: enabled / mcp-server: running
sudo xcrun mcp-server enable     # 若未启用
xcrun mcp-server start           # 若未运行

然后一条命令安装:

# 从 GitHub 安装(推荐)
dsh plugin --profile web add "github:nanshanyi/dsh-mcp-xcode#v1.0.0"

# 或本地路径
dsh plugin --profile web add file:/path/to/dsh-mcp-xcode

本包通过 dsh.bundle.patch 自描述挂载:安装后无需编辑任何 profile 文件,重启 DSH 即生效,插件列表里可见,xcode_* 工具对所有会话可用。如果你之前手动在 cordis.patch.yml 里写过本插件的行,请先删掉,避免双挂载。

首次连接会弹出 Xcode agent 授权框,批准一次即可。DSH 是签名应用,授权永久有效;未签名客户端则约 24 小时过期。构建报 Operation not permitted 时,需要给 headless 服务授权工程所在文件夹:

sudo xcrun mcp-server allow-folder /path/to/your/projects

配置(可选)

全部配置写在 patch 行的 config 下:

config:
  clientName: deepseek-harness   # 显示在 Xcode 授权弹窗里的客户端名
  bridgePath: /usr/bin/xcrun     # 桥可执行文件
  bridgeArgs: ['mcpbridge']      # 桥参数
  includeTools: ['BuildProject', 'XcodeList*']   # 只注册匹配的工具
  excludeTools: ['StringCatalog*']               # 排除匹配的工具

includeTools / excludeTools 按 Xcode 工具原名做锚定匹配,支持 *? 通配,大小写敏感,excludeTools 优先。xcode_mcp_status 是控制通道,不受筛选影响,永远注册。筛选的常见用途是给模型瘦身——54 个工具的 schema 描述会占用不少上下文。

典型用法

经过上面的步骤,工具已经全部可用。直接用自然语言描述任务即可,比如:

打开 /path/to/Project.xcodeproj,跑一遍单元测试,把失败的用例列出来

遇到连接问题时,让 agent 调用 xcode_mcp_status(必要时带 reconnect: true)排障。

适用场景与注意

适合在 DSH 里搭建 macOS / iOS agent 工作流的开发者:构建验证、批量跑测试、查看 Preview 渲染结果、模拟器交互这一类需要 Xcode 能力的任务。

使用前注意几点:

  • 和所有第三方插件一样,dsh-mcp-xcode 以当前 dsh 进程的权限运行,安装前建议先检查源码与许可证(MIT,README 与 package.json 均有注明);
  • 连接走的是 Xcode 官方 headless 权限模型,签名应用一次批准长期有效;
  • 插件不发布任何 service,也不修改 Xcode 权限存储;停止或禁用插件会终止它持有的 mcpbridge 子进程。

小结

dsh-mcp-xcode 做的事情很克制:把 xcrun mcpbridge 暴露的 54 个工具原样接进 DSH,配上授权引导、断桥自愈和状态排查工具,让 agent 在不开 Xcode UI 的情况下完成构建、测试和模拟器操作。

  • 社区目录页:https://www.skillhub.cn/plugins/nanshanyi/dsh-mcp-xcode
  • GitHub 仓库:https://github.com/nanshanyi/dsh-mcp-xcode
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye