.claude-plugin/plugins/axiom/skills/axiom-xcode-mcp-setup/SKILL.md
Xcode MCP setup — enable mcpbridge, per-client config, permission handling, multi-Xcode targeting, troubleshooting
npx skillsauth add charleswiltgen/axiom axiom-xcode-mcp-setupInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Without this toggle, xcrun mcpbridge connects but returns no tools.
claude mcp add --transport stdio xcode -- xcrun mcpbridge
Verify: claude mcp list should show xcode server.
codex mcp add xcode -- xcrun mcpbridge
Create or edit .cursor/mcp.json in your project root:
{
"mcpServers": {
"xcode": {
"command": "xcrun",
"args": ["mcpbridge"]
}
}
}
Cursor-specific note: Cursor is a strict MCP client. Xcode's mcpbridge omits structuredContent when tools declare outputSchema, which violates the MCP spec. If Cursor rejects responses, use XcodeMCPWrapper as a proxy:
{
"mcpServers": {
"xcode": {
"command": "/path/to/XcodeMCPWrapper",
"args": []
}
}
}
Create or edit .vscode/mcp.json:
{
"servers": {
"xcode": {
"type": "stdio",
"command": "xcrun",
"args": ["mcpbridge"]
}
}
}
gemini mcp add xcode -- xcrun mcpbridge
After configuration, call XcodeListWindows (no parameters). You should see:
tabIdentifier: <uuid>, workspacePath: /path/to/YourProject.xcodeproj
If you see an empty list, ensure a project is open in Xcode.
When an MCP client first connects, Xcode shows a permission dialog:
PID-based approval: Permission is granted per-process. If the client restarts (new PID), you'll see the dialog again. This is expected behavior.
When multiple Xcode instances are running:
mcpbridge auto-selects using this fallback:
xcode-selectSet MCP_XCODE_PID to target a specific instance:
# Find Xcode PIDs
pgrep -x Xcode
# Claude Code with specific PID
claude mcp add --transport stdio xcode -- env MCP_XCODE_PID=12345 xcrun mcpbridge
MCP_XCODE_SESSION_ID provides a stable UUID for tool sessions, useful when tracking interactions across reconnections.
digraph troubleshoot {
rankdir=TB;
"Connection failed?" [shape=diamond];
"tools/list empty?" [shape=diamond];
"Wrong project?" [shape=diamond];
"Repeated permission prompts?" [shape=diamond];
"Client rejects responses?" [shape=diamond];
"Check Xcode running + toggle on" [shape=box];
"Open a project in Xcode" [shape=box];
"Use MCP_XCODE_PID or check tab targeting" [shape=box];
"Expected: PID changes on restart" [shape=box];
"Use XcodeMCPWrapper proxy" [shape=box];
"Connection failed?" -> "Check Xcode running + toggle on" [label="refused/timeout"];
"Connection failed?" -> "tools/list empty?" [label="connects OK"];
"tools/list empty?" -> "Open a project in Xcode" [label="no tools"];
"tools/list empty?" -> "Wrong project?" [label="tools listed"];
"Wrong project?" -> "Use MCP_XCODE_PID or check tab targeting" [label="yes"];
"Wrong project?" -> "Repeated permission prompts?" [label="no"];
"Repeated permission prompts?" -> "Expected: PID changes on restart" [label="yes"];
"Repeated permission prompts?" -> "Client rejects responses?" [label="no"];
"Client rejects responses?" -> "Use XcodeMCPWrapper proxy" [label="strict client (Cursor)"];
}
| Symptom | Cause | Fix |
|---------|-------|-----|
| "Connection refused" | Xcode not running or MCP toggle off | Launch Xcode, enable MCP in Settings > Intelligence |
| tools/list returns empty | No project open, or permission not granted | Open a project, check for permission dialog in Xcode |
| Tools target wrong project | Multiple Xcode windows, wrong tab | Call XcodeListWindows, use correct tabIdentifier |
| Repeated permission prompts | Client restarted (new PID) | Expected behavior — approve each time |
| Cursor/strict client errors | Missing structuredContent in response | Use XcodeMCPWrapper as proxy |
| "No such command: mcpbridge" | Xcode < 26.3 | Update to Xcode 26.3+ |
| Slow/hanging tool calls | Large project indexing | Wait for Xcode indexing to complete |
Xcode also supports MCP servers for its built-in assistants. Config files live at:
~/Library/Developer/Xcode/CodingAssistant/codex
~/Library/Developer/Xcode/CodingAssistant/ClaudeAgentConfig
These are for configuring Xcode's internal assistant, separate from external MCP client setup.
Docs: /xcode/mcp-server
Skills: axiom-xcode-mcp-tools, axiom-xcode-mcp-ref
development
Use when building ANY watchOS app — app structure, independent apps, Watch Connectivity, Smart Stack widgets, complications, controls, RelevanceKit, background tasks, ClockKit migration.
development
Use when working with HealthKit, WorkoutKit, health data, workouts, or fitness features on iOS or watchOS. Covers permissions, queries, background delivery, custom workouts, multidevice coordination.
development
Use when building, fixing, or improving ANY SwiftUI UI — views, navigation, layout, animations, performance, architecture, gestures, debugging, iOS 26 features.
content-media
Use when working with camera, photos, audio, haptics, ShazamKit, or Now Playing. Covers AVCaptureSession, PHPicker, PhotosPicker, AVFoundation, Core Haptics, audio recognition, MediaPlayer, CarPlay, MusicKit.