dsh-xcode-mcp
English | 中文
Apple Xcode MCP bridge for DeepSeek Harness.
Xcode 27 ships a headless MCP tool service. /usr/bin/xcrun mcpbridge is the
STDIO bridge to it. This bundle wires that bridge into the MCP client already
shipped with DeepSeek Harness, so every Xcode tool reaches the model as an
ordinary native tool named mcp__xcode__<ToolName>.
On Xcode 27.0 that is 54 tools: project and scheme inspection, builds, tests, SwiftUI Preview rendering, simulator launch and interaction (tap / type / swipe), screenshots, the accessibility hierarchy, OSLog, and Swift package, localization and instrumentation helpers.
Why a bundle
Hand-wiring xcrun mcpbridge means editing the profile's cordis.patch.yml and
remembering the transport fields, the tool-call timeout and the failure policy.
This package carries that configuration instead, so the connection becomes one
installable thing that is named, versioned, listed in the Plugins page and
removable like any other plugin.
What actually gets installed
No JavaScript runs. A configuration-only bundle is a manifest plus a patch —
8 files, about 4 kB unpacked, no dependencies, no scripts, no build step:
package.json cordis.patch.yml icon.svg
locale/en.json locale/zh.json README.md README-zh.md LICENSE
@deepseek-ai/dsh-mcp-client, the plugin that does the talking, ships with dsh
itself and is deliberately not a dependency of this package. There is nothing to
audit here beyond the ~40 lines of YAML under Configure.
Requirements
macOS, Xcode 27 or later.
mcpbridgedoes not exist in earlier versions.The headless service enabled and running:
xcrun mcp-server status # expect: Permission: enabled / mcp-server: running sudo xcrun mcp-server enable xcrun mcp-server startFor the project-scoped tools, a project open in Xcode, plus permission for the folders you build in:
sudo xcrun mcp-server allow-folder /path/to/your/projects
On first connection Xcode shows an agent-authorization prompt. A signed client such as DeepSeek Harness is remembered permanently; an unsigned client's grant expires after about 24 hours.
Install
From the Plugins page in the sidebar, enter the package name:
dsh-xcode-mcp
Installing enables the bundle; it usually activates through HMR. If the
mcp__xcode__* tools do not appear, restart the profile so the new bundle layer
is composed.
An absolute path to a checkout works the same way, for a pre-publish install.
Verify
Ask for something that needs Xcode, or check the tool list for mcp__xcode__*.
A good first call is mcp__xcode__XcodeListWorkspaces:
* workspaceIdentifier: workspace-xxxxxxxxxx, workspacePath: /path/to/App.xcodeproj
Then mcp__xcode__XcodeListSchemes with that identifier lists the project's
schemes. Both were verified against Xcode 27.0 (27A266a).
Upgrading
DSH does not update installed plugins automatically. Its own Plugins page says so, and re-installing over an existing copy is refused with "this plugin is already installed" — the uninstall is what makes the upgrade possible.
So the Plugins-page route is: uninstall, then install again.
From a shell, the same upgrade without the uninstall step:
dsh plugin --profile <profile> update dsh-xcode-mcp
One thing to expect either way: the plugin manager installs through pnpm, whose
minimumReleaseAge defaults to 1440
minutes. A release less than a day old will not install, and the command
reports Already up to date even though a newer version exists. That is
supply-chain protection, not a failure — wait a day, or lower the setting in the
profile's pnpm-workspace.yaml if you know the release is yours.
Because this bundle is configuration only, an upgrade replaces a handful of declaration files. It runs no code before or after.
Configure
The row is mcp-xcode; its config is the full
@deepseek-ai/dsh-mcp-client
schema, so any field documented there works. To change one, override the row in
the profile's own cordis.patch.yml — a matching override replaces the whole
config, so restate every field you still want:
- id: mcp-xcode
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: xcode
transport: stdio
command: /usr/bin/xcrun
args: ['mcpbridge']
toolCallTimeoutMs: 900000 # default is 60 s; builds need more
failOnStartupError: false # Xcode closed must not block harness startup
To point at a specific Xcode instead of the one xcode-select names, add env
with MCP_XCODE_PID.
A note on the 54 tools
Every tool's JSON Schema is offered to the model each turn. If that is more
context than you want, @deepseek-ai/dsh-mcp-client has no include/exclude
filter — the alternative is a bridge that implements one.
Remove
Through the Plugins page, or by removing the bundle from dsh.profile.bundles
and uninstalling the package. Disabling the bundle stops the mcpbridge
subprocess with it.
License
MIT
No comments yet. Be the first to write one.