MCP server / for mobile apps
Find the leak.Ship the fix.Prove the lift.
Add mob to your coding agent. It reads your Mixpanel, RevenueCat and Superwall, finds where users drop off before they pay, and runs an in-app experiment against a holdout. Nothing ships until you approve it.
One loop. Four tools.
Your agent calls them in order, and the output of each one is the input to the next.
diagnose() → Leak[]
Reads your analytics and subscription data. Returns leaks ranked by impact, each with evidence, a hypothesis and a suggested experiment.
instrument(leak) → PR
Finds the events a leak needs that you don't track yet and proposes them as a pull request. You merge it.
run_flow(leak) → Experiment
Drafts one in-app message for the leak's segment, with a holdout. It waits for your explicit approval before anyone sees it.
measure(exp) → Verdict
Lift on the one metric the experiment targeted, against the holdout, with confidence. Then keep, kill or iterate.
↻ then it runs diagnose again.
What you need
mob doesn't replace your stack. It reads and writes through the services you already use. Here's what each tool needs.
- Mixpanelraw event export, read through the data connectors of JJ, Ninefold's analytics agent
- RevenueCatsubscription charts, for churn evidence
- Superwallpaywall views to purchases
- MobSur SDKFlutter 2.1+, in your app
- Your app forwards its analytics events and sets
is_subscribedanddays_since_install
- MobSurdraft, approval, and the experiment with its holdout
- MobSur SDKshows the message in your app
- Superwalloryour own paywall: the button opens a paywall placement
- NinaNinefold's content agent writes the message, if configured
- Claude APIwrites it otherwise
- MobSurwho saw what, per arm
- Mixpanelwho converted, joined on your user id
- Superwalla second place to run experiments: run_flow and measure on paywall campaigns, through Superwall's API
Third-party service names are plain labels, and mob isn't affiliated with them. Nina and JJ are Ninefold's own agents.
Built with guardrails
Your agent proposes the experiments and you approve each one. Every experiment keeps a holdout, so the number you get at the end is lift you can defend.
There's no dashboard to learn and no campaign builder. mob works from any MCP client, such as Claude Code, Codex or Cursor, and it returns text and JSON your agent can act on.
# invariants holdout always on, random by user id approval explicit, per experiment surface in-app messages first reads mixpanel · revenuecat · superwall writes PRs you review, drafts you approve ui none. your agent is the interface