Expo's own local server, pointed at the dev server your app is already running on: app logs, screenshots, taps and the DevTools, from the project the simulator is showing.
Mobile app desk
Runs a React Native or Expo app on a simulator, reads what it is doing, and takes it through an SDK upgrade and a store release.
Built for: The small team shipping one app to two stores, where the person who wrote the screen is also the person who tests it on a phone.
The button opens the checkout, where the 4 servers and 7 skills are listed one by one. Every member is free, so the checkout lists them and asks for no card.
What your agent can do with this
The reason to buy a stack rather than five listings: each line below needs more than one member connected at the same time.
- 01
Run a flow on an iOS simulator or Android emulator through agent-device and keep the screenshots, instead of describing what the screen ought to do.
- 02
Read Metro's console, network requests and component tree while a screen misbehaves, without adding debug code to the app.
- 03
Move the app to a new Expo SDK or React Native version with the vendors' own upgrade guides, then write the component test that proves the screen still renders.
- 04
Pull the App Store reviews of the version that just shipped and the crash reports TestFlight testers sent for its build, and put them next to the performance checklist.
The assembly, part by part
What each part contributes, and why it was picked over the obvious alternative. Prices and permissions are read from the listings, so nothing here can disagree with the catalogue.
Callstack's device automation for iOS simulators, Android emulators and physical devices, so a flow is tapped through on the device rather than described.
Attaches to Metro over the Chrome DevTools Protocol and reads console output, network requests, the component tree and Redux state without changes to the app code.
App Store Connect's API: customer reviews, TestFlight crash reports, analytics reports and Xcode Cloud builds — where a build is judged before and after it ships.
File-based routes, native stacks, tabs and modals in Expo Router, written the way the Expo team documents them.
Moves the project to a new Expo SDK and sorts out the dependency conflicts that follow — the upgrade most teams keep postponing.
For bare React Native: applies the template diff and carries the iOS and Android configuration, CocoaPods and Gradle changes with it.
Callstack's performance guidance — dropped frames, start-up time, bundle size, re-renders — for the review before a release rather than after the one-star ratings.
Component tests with React Native Testing Library, so a fixed bug leaves a test that renders the screen instead of a note in the ticket.
An exploratory pass over the app on a device through agent-device that ends in a report with reproducible steps and screenshots.
Build and submit to TestFlight, the App Store and Google Play with EAS — eas.json, signing, build numbers. EAS is a paid Expo service, and the skill says so.
What it costs, and on what assumption
Every member is free, so the monthly figure is $0 whatever you do with the stack: nothing here is billed by the call, and only adding a paid member could change it.
| Part | What you are paying for | Monthly, as quoted |
|---|---|---|
| Expo | Free | — |
| Agent Device | Free | — |
| Metro | Free | — |
| App Store Connect | Free | — |
| Skills | ||
| Expo Router Navigation | Free · context cost only | — |
| Expo Upgrade | Free · context cost only | — |
| Upgrading React Native | Free · context cost only | — |
| React Native Best Practices | Free · context cost only | — |
| RNTL Test Writing Guide | Free · context cost only | — |
| Dogfood (agent-device) | Free · context cost only | — |
| App Store Deployment | Free · context cost only | — |
| Everything above | $0 of servers plus $0 of skills, the same in a quiet month and a busy one | $0/mo |
Subscriptions at their monthly plan price; one-off licences spread over 12 months.
Install only these and the bill is nothing: 4 servers and 7 skills, and all 47 tools.
Nothing in this stack carries a call allowance, so nothing here can run out before the month does. The bill is decided when you install it, not when you use it.
The spend cap is one figure for the whole account, set in your dashboard and checked when an order is placed. On the call path what stops a retry loop is the plan's call allowance and its rate limit, and a refused call is never billed.
Setting it up, in order
The steps below come before the install lines: what to decide and scope before connecting anything, in the order it matters. The lines themselves follow, part by part, for the client you pick.
npx mcprush@latest stack add mobile-desk writes all 4 servers into Claude Code’s config in one go — or run the lines below one by one. The 7 skills are not included — add them with lines 05–11.
- App Store Connect
APP_STORE_KEY_ID— App Store Connect API Key IDAPP_STORE_ISSUER_ID— App Store Connect Issuer IDAPP_STORE_PRIVATE_KEY_PATH— Path to the .p8 private key file for App Store Connect authentication
Set them where you start Claude Code — export APP_STORE_KEY_ID=… in your shell profile on macOS and Linux, setx APP_STORE_KEY_ID "…" on Windows, then open a new terminal. Claude Code reads them at start; the config keeps only the names.
# 01 · Expo
claude mcp add --scope user expo-mcp '--' npx -y expo-mcp --dev-server-url http://localhost:8081
# 02 · Agent Device
claude mcp add --scope user agent-device-mcp '--' npx -y agent-device mcp
# 03 · Metro
claude mcp add --scope user metro-mcp '--' npx -y metro-mcp
# 04 · App Store Connect
claude mcp add --scope user --env 'APP_STORE_KEY_ID=${APP_STORE_KEY_ID}' --env 'APP_STORE_ISSUER_ID=${APP_STORE_ISSUER_ID}' --env 'APP_STORE_PRIVATE_KEY_PATH=${APP_STORE_PRIVATE_KEY_PATH}' --transport stdio gjeltep-app-store-connect-mcp '--' uvx --with 'mcp<2' app-store-connect-mcp
# 05 · Expo Router Navigation
npx mcprush@latest skill add expo/expo-router-navigation
# 06 · Expo Upgrade
npx mcprush@latest skill add expo/expo-upgrade
# 07 · Upgrading React Native
npx mcprush@latest skill add callstackincubator/upgrading-react-native
# 08 · React Native Best Practices
npx mcprush@latest skill add callstackincubator/react-native-best-practices
# 09 · RNTL Test Writing Guide
npx mcprush@latest skill add callstackincubator/rntl-test-writing-guide
# 10 · Dogfood (agent-device)
npx mcprush@latest skill add callstackincubator/dogfood-agent-device
# 11 · App Store Deployment
npx mcprush@latest skill add expo/app-store-deploymentRequirements and Windows tips
- Node.js — the current LTS (24) is the safe choice (for
npx). - uv (for
uvx, docs.astral.sh/uv). - Windows PowerShell says 'running scripts is disabled on this system'? Run
Set-ExecutionPolicy -Scope CurrentUser RemoteSignedonce, or typenpx.cmdinstead ofnpx(codex.cmd,gemini.cmd,grok.cmdlikewise). PowerShell 7 needs neither.
Nothing is connected until you approve it in Claude Code. mcprush is not in the path and meters nothing here.
- 1 member wants an API key, set in your own client’s config on your machine — this marketplace never holds it.
- 3 members have not declared what credential they need — check each one’s own page before you start.
- What this stack can write is not recorded — 1 member of 4 has no imported tool surface. Section 05 says what is known before you approve anything.
- 4 members are connected straight from their own package or address — nothing in them goes through mcprush.
What the whole stack can reach
Installed together, these tool surfaces add up. It is the first thing a security reviewer asks for, so what has been counted — and what nobody has counted yet — is on the page rather than in a PDF.
| Member | Tool surface | Write tools |
|---|---|---|
| App Store Connect | imported | 7 |
| Metro | not imported | not recorded |
A stack's blast radius is the union of its members, not the worst of them. That union cannot be taken here, because 1 member of 4 has no imported tool surface — so the figure a review asks for is missing rather than low, and a member marked not imported is one nobody has counted rather than one that cannot write.
Sensible swaps
A stack is a default, not a verdict. These are the substitutions the maintainer would make, and what each one costs or saves.
A team whose device tests already live in Appium keeps them there: Appium's own server drives iOS and Android sessions and helps write the tests, instead of a second automation layer.
Where this stack stops
Written by the maintainer, kept on the page rather than in a support thread.
It does not press the release button. Store submission goes through EAS or App Store Connect with your own account and signing credentials, and a person decides when it ships.
The iOS side needs a Mac with Xcode and a simulator; on Linux or Windows this desk covers Android and the JavaScript side only.
It does not see crashes from App Store users. The App Store Connect member reads customer reviews and the crash reports TestFlight testers submit; crashes in production need a crash reporter inside the app.
Who keeps this current
A stack has an owner: whoever keeps it re-checks the combination when a member changes, and the members themselves are published by the people named on each row.
Other ready-made stacks
Code review
Tools to inspect code changes, run checks and prepare a pull request review.
Bug reproduction
Tools to investigate a bug report and work toward a reproducible test case.
On-call
Tools to investigate alerts, check recent changes and follow the runbook.