Three MCP servers turn a coding agent into a full iOS development setup: an Xcode MCP to build and run, an iOS Simulator MCP to see and tap the app, and an App Store Connect MCP to ship it. This guide covers what each layer does, which servers to install, and the exact configs for Cursor and Claude Code.
Layer 1: Xcode MCP for building, testing, running
There are things your agent cannot do with shell access alone: read structured build errors, manage schemes and destinations, run tests with results it can parse. An Xcode MCP server wraps xcodebuild and friends into tools an agent uses reliably instead of scraping log soup.
Our pick: XcodeBuildMCP (open source, maintained by Sentry).
{
"mcpServers": {
"XcodeBuildMCP": {
"command": "npx",
"args": ["-y", "xcodebuildmcp@latest", "mcp"]
}
}
}
An honest note: if your project is pure Expo or React Native with EAS, you may not need this layer locally at all. Skip to layer 3.
Layer 2: iOS Simulator MCP so the agent has eyes
Agents write UIs they cannot see. A simulator MCP fixes the loop: boot a simulator, take screenshots, tap, type, read the view hierarchy. Your agent catches its own layout bugs instead of shipping them to TestFlight.
Our pick: ios-simulator-mcp (wraps simctl plus accessibility inspection).
{
"mcpServers": {
"ios-simulator": {
"command": "npx",
"args": ["-y", "ios-simulator-mcp"]
}
}
}
This layer requires a Mac with Xcode installed, because simulators run nowhere else. No Mac? That is exactly what layer 3 exists for.
Layer 3: App Store Connect MCP for everything after the build
This is the layer where the open source options thin out. API wrapper MCPs exist for App Store Connect, but the App Store is not an API problem. It is a workflow problem: listings with rules, in-app purchase metadata that blocks review, screenshots in exact sizes, rejections written in guideline speak.
Lance is a hosted MCP backed by a real operator on a real Mac. Your agent delegates outcomes ("get this ready to submit", "fix this rejection", "create a $4.99 subscription") and the operator carries them out against your actual App Store Connect account, while your Apple credentials never enter the agent's context. It also builds and uploads from a git repo on its own Mac, which is why the path without a Mac works.
npx add-mcp https://api.lance.app/mcp
The full stack, assembled
One config, all three layers. Lance needs no keys in the file: your client discovers its OAuth and opens a browser to sign you in on first use.
{
"mcpServers": {
"XcodeBuildMCP": {
"command": "npx",
"args": ["-y", "xcodebuildmcp@latest", "mcp"]
},
"ios-simulator": {
"command": "npx",
"args": ["-y", "ios-simulator-mcp"]
},
"lance": {
"url": "https://api.lance.app/mcp"
}
}
}
A realistic session with the full stack:
- Agent fixes a bug, builds with XcodeBuildMCP, tests pass.
- Screenshots the fix in the simulator, confirms the layout.
- Delegates to Lance: bump the build, upload to TestFlight, update the What's New text, submit for review once I confirm.
- You confirm. You wake up to "Waiting for Review."