Apps
Create, list, and manage apps and their users via MCP tools.
Apps represent a specific platform build within a project. Each app has a platform (apple, android, web, backend) and an optional bundle identifier — required for non-backend platforms, immutable after creation. Creating an app auto-generates a client_secret API key for SDK use.
Locale demand. Each user carries two locale signals captured by the SDK: their wanted language (Locale.preferredLanguages.first, e.g. fr-FR) and the shown locale (Locale.current, constrained to what the app already ships). The SDK also reports the languages the app binary ships (Bundle.main.localizations), so the localization gap — demand for a language the app doesn't ship yet — is computed automatically: a language is flagged shipped: false when its base language isn't in the app's shipped set. The country breakdown works for every user today; the language breakdown fills in as users upgrade to the SDK that reports preferred language. Like user listings, locale demand respects the data_mode filter (production default, development, or all), so test installs don't skew which languages your real users want.
list-apps
List all apps accessible to this agent.
| Parameter | Type | Required | Description |
|---|---|---|---|
team_id | UUID | No | Filter by team ID |
Returns { apps: [...] } with each app's id, name, platform, bundle_id, client_secret, project_id, and timestamps. Each app also carries latest_app_version, latest_app_version_updated_at, and latest_app_version_source ("app_store" or "computed") — compare these against an event's app_version to tell whether the data is from the current release. See Latest Version Detection.
get-app
Get an app by ID, including its client_secret for SDK configuration.
| Parameter | Type | Required | Description |
|---|---|---|---|
app_id | UUID | Yes | The app ID |
create-app
Create a new app under a project. Returns a client_secret for SDK use. Requires apps:write permission.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | App name |
platform | string | Yes | apple, android, web, or backend |
project_id | UUID | Yes | Parent project ID |
bundle_id | string | Conditional | Required for non-backend platforms. Immutable after creation. |
{
"name": "iOS App",
"platform": "apple",
"project_id": "550e8400-...",
"bundle_id": "com.example.myapp"
}Backend apps omit bundle_id:
{
"name": "API Server",
"platform": "backend",
"project_id": "550e8400-..."
}update-app
Update an app's name. Requires apps:write permission.
| Parameter | Type | Required | Description |
|---|---|---|---|
app_id | UUID | Yes | The app ID |
name | string | Yes | New app name |
list-app-users
List users for a specific app. Supports search, filtering, and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
app_id | UUID | Yes | The app ID |
search | string | No | Search by user ID |
is_anonymous | string | No | "true" or "false" to filter by anonymous status |
billing_status | string | No | Comma-separated billing tiers to include: paid, trial, free. Derived from RevenueCat-synced user properties. Omit or pass all three for no filter. |
data_mode | string | No | production (default), development, or all. A user's dev/prod flag is derived from their client (non-backend) events. |
cursor | string | No | Pagination cursor |
limit | number | No | Max results (default 50, max 200) |
list-user-locales
Locale demand for deciding where to localize next. Returns by_locale (users grouped by their wanted language with a shipped flag), by_country (works for every user today), supported_languages, and totals.
| Parameter | Type | Required | Description |
|---|---|---|---|
team_id | UUID | No | Filter to a team you belong to |
project_id | UUID | No | Narrow to one project (enables the shipped/gap flags) |
app_id | UUID | No | Narrow to one app (enables the shipped/gap flags) |
data_mode | string | No | production (default), development, or all |
team_id ⊥ project_id ⊥ app_id. shipped is false for languages the app doesn't ship yet, true when shipped, and null (no flag) when more than one app is in scope. The language breakdown fills in as users upgrade to the SDK that reports preferred language — until then, lean on by_country.
