- Cursor editor installed
- Xcode 26.3+ with Xcode Tools MCP enabled
- The wrapper installed (via uvx, pip, or manual)
- Open Cursor Settings (
⌘,) - Go to Features > MCP
- Click + Add New MCP Server
- Select stdio as the transport type
- Enter settings:
- Name:
xcode-tools - Command:
uvx - Args:
--from mcpbridge-wrapper mcpbridge-wrapper
- Name:
Edit ~/.cursor/mcp.json directly:
{
"mcpServers": {
"xcode-tools": {
"command": "uvx",
"args": ["--from", "mcpbridge-wrapper", "mcpbridge-wrapper"]
}
}
}{
"mcpServers": {
"xcode-tools": {
"command": "uvx",
"args": [
"--from",
"mcpbridge-wrapper[webui]",
"mcpbridge-wrapper",
"--web-ui",
"--web-ui-port",
"8080"
]
}
}
}--broker auto-detects: connects if a daemon is running, spawns one otherwise. Stale socket/PID files from a crashed daemon are cleaned up automatically.
{
"mcpServers": {
"xcode-tools": {
"command": "uvx",
"args": [
"--from",
"mcpbridge-wrapper",
"mcpbridge-wrapper",
"--broker"
]
}
}
}If you manage a dedicated host with --broker-daemon, keep client args on
--broker: clients will attach when the host is alive and auto-recover by
spawning when it is not.
If you want explicit monitoring/control across multiple editors, follow the
Broker Mode Guide and attach
the browser dashboard and/or mcpbridge-wrapper --tui to that same host.
If you installed manually to ~/bin/xcodemcpwrapper:
{
"mcpServers": {
"xcode-tools": {
"command": "/Users/YOUR_USERNAME/bin/xcodemcpwrapper"
}
}
}{
"mcpServers": {
"xcode-tools": {
"command": "/Users/YOUR_USERNAME/bin/xcodemcpwrapper",
"args": ["--web-ui", "--web-ui-port", "8080"]
}
}
}Replace YOUR_USERNAME with your actual macOS username.
If you cloned the repo and installed via make install in a virtual environment:
{
"mcpServers": {
"xcode-tools": {
"command": "/path/to/XcodeMCPWrapper/.venv/bin/mcpbridge-wrapper"
}
}
}With Web UI:
{
"mcpServers": {
"xcode-tools": {
"command": "/path/to/XcodeMCPWrapper/.venv/bin/mcpbridge-wrapper",
"args": ["--web-ui", "--web-ui-port", "8080"]
}
}
}Replace /path/to/XcodeMCPWrapper with the actual path to your cloned repository.
- Migration to broker mode: add
--brokerto your existingargs, then restart Cursor. - Rollback to direct mode: remove broker flags from
argsand restart Cursor. - After rollback, stop stale broker state files if needed:
PID_FILE="$HOME/.mcpbridge_wrapper/broker.pid"; SOCK="$HOME/.mcpbridge_wrapper/broker.sock"; if [ -f "$PID_FILE" ]; then kill "$(cat "$PID_FILE")" 2>/dev/null || true; fi; rm -f "$PID_FILE" "$SOCK"See Broker Mode Guide for full start/stop/status flows.
- Open Cursor
- Start a new chat
- You should see the Xcode tools available in the tool palette
- Try asking "List my open Xcode windows"
If you keep more than one editor on --broker, use the shared-daemon checks in
Troubleshooting
to confirm both editors attach to the same host instead of spawning separate
owners.
This error means you're connecting directly to xcrun mcpbridge without the wrapper. Ensure your MCP client is configured to use the wrapper command (uvx or xcodemcpwrapper), not xcrun mcpbridge directly.
Install uv:
curl -LsSf https://astral.sh/uv/install.sh | shOr via Homebrew:
brew install uvThen restart Cursor.
Make sure Xcode Tools MCP is enabled in Xcode:
- Open Xcode > Settings (
⌘,) - Select Intelligence
- Toggle Xcode Tools ON
- Restart Cursor
Broker mode could not reach a ready broker socket. If using --broker, it will have already attempted stale-file recovery; confirm the broker process state with the broker mode guide. To rollback, remove broker flags from args and restart Cursor.
If Cursor is configured with Web UI args and behavior looks stale after upgrading, force a one-time uvx refresh:
{
"mcpServers": {
"xcode-tools": {
"command": "uvx",
"args": [
"--refresh",
"--from",
"mcpbridge-wrapper[webui]",
"mcpbridge-wrapper",
"--web-ui",
"--web-ui-port",
"8080"
]
}
}
}Restart Cursor after saving config. Once verified, you can remove --refresh from args.