Owlmetry
MCP

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.

ParameterTypeRequiredDescription
team_idUUIDNoFilter 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.

ParameterTypeRequiredDescription
app_idUUIDYesThe app ID

create-app

Create a new app under a project. Returns a client_secret for SDK use. Requires apps:write permission.

ParameterTypeRequiredDescription
namestringYesApp name
platformstringYesapple, android, web, or backend
project_idUUIDYesParent project ID
bundle_idstringConditionalRequired 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.

ParameterTypeRequiredDescription
app_idUUIDYesThe app ID
namestringYesNew app name

list-app-users

List users for a specific app. Supports search, filtering, and pagination.

ParameterTypeRequiredDescription
app_idUUIDYesThe app ID
searchstringNoSearch by user ID
is_anonymousstringNo"true" or "false" to filter by anonymous status
billing_statusstringNoComma-separated billing tiers to include: paid, trial, free. Derived from RevenueCat-synced user properties. Omit or pass all three for no filter.
data_modestringNoproduction (default), development, or all. A user's dev/prod flag is derived from their client (non-backend) events.
cursorstringNoPagination cursor
limitnumberNoMax 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.

ParameterTypeRequiredDescription
team_idUUIDNoFilter to a team you belong to
project_idUUIDNoNarrow to one project (enables the shipped/gap flags)
app_idUUIDNoNarrow to one app (enables the shipped/gap flags)
data_modestringNoproduction (default), development, or all

team_idproject_idapp_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.

Ready to get started?

Connect your agent via MCP or CLI and start tracking.