Claude Code will happily write you a whole iOS app. Then you hit the part it cannot see: Xcode signing, provisioning profiles, App Store Connect's fifteen required fields, screenshots in four exact sizes, and a review process that rejects most first submissions on metadata alone. That wall has a name ("everything after the build") and this guide is the map over it.
It is written for Claude Code but applies verbatim to Cursor and Codex. The configs for each are at the end.
What Claude Code can already do alone
With plain shell access on a Mac, Claude Code can scaffold the project, write Swift or React Native, and run xcodebuild. Where it starts guessing: parsing build errors out of log noise, anything inside the Simulator, and literally everything inside appstoreconnect.apple.com, a browser UI it cannot drive.
Step 1: let it build (Xcode MCP)
claude mcp add XcodeBuildMCP -- npx -y xcodebuildmcp@latest mcp
What changes: structured build errors instead of log scraping, scheme and destination management, test results it can parse. Full depth on this layer lives in the iOS agent stack guide.
Step 2: let it see (iOS Simulator MCP)
claude mcp add ios-simulator -- npx -y ios-simulator-mcp
The loop this unlocks: build, screenshot, tap, verify. Tell Claude "the tab bar overlaps the home indicator, look at it" and it looks, then fixes what it saw.
Step 3: let it ship (connect App Store Connect)
claude mcp add --transport http lance https://api.lance.app/mcp
No API keys to hunt down: the first time Claude Code talks to Lance, it opens a browser and you sign in. That is the whole handshake. (Running headless or in CI? An API key works too, covered in the docs.)
This is the step that removes the wall. Lance is a hosted App Store Connect MCP backed by a real operator: Claude Code delegates in plain language, and the operator does the App Store Connect work on its own Mac. Listing, screenshots, TestFlight upload from your repo, in-app purchases, review submission, rejection fixes. Your Apple credentials never enter Claude's context.
Real prompts, verbatim, from here on out:
- "Ship this repo to TestFlight. Bundle id com.myapp.ios."
- "Create the App Store listing. Pull the copy from the README."
- "Apple rejected us under 2.1. Read the rejection, fix it, resubmit."
- "Add a $2.99 monthly subscription and wire up the paywall."
The route without a Mac
On Windows or Linux, skip steps 1 and 2: push to git, and delegate the build itself to Lance. It builds, signs, and uploads on Apple hardware. You lose the local simulator loop; Expo developers can keep Expo Go for that.
Before any of this: your Apple Developer account
You cannot ship without the $99 per year Apple Developer Program, and enrollment is where first time shippers actually get stuck: pending purgatory, D-U-N-S numbers, the LLC question. That is its own guide: Apple Developer enrollment, unstuck.
Same setup for Cursor and Codex
Cursor: add the same three servers to .cursor/mcp.json in your project. The blocks are identical to the Claude Code ones; the full combined config is in the iOS agent stack guide. The outcome is the same: Cursor's agent builds, sees, and ships.
Codex: add each server to ~/.codex/config.toml. Lance's entry:
[mcp_servers.lance]
url = "https://api.lance.app/mcp"
Any other MCP client: point it at https://api.lance.app/mcp and sign in when prompted. If your client does not support OAuth sign-in, use an API key instead; setup details live in the docs.