# io.github.pavellunev/appmetrica-mcp (npm · appmetrica-mcp)

AppMetrica (Yandex) analytics: reports, funnels, segments, dashboards, logs export, push

- Trust score: 79/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-23

## Components

- npm · `appmetrica-mcp`: 79/100 (this document), [markdown](https://verifymcp.io/servers/pavellunev-appmetrica-mcp/appmetrica-mcp.md), [page](https://verifymcp.io/servers/pavellunev-appmetrica-mcp/appmetrica-mcp)

## Channel facts

- Registry: `npm`
- Package: `appmetrica-mcp`
- Version: `0.3.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-23.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 34 of 107 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 19 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 82/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 7336 tokens (~163/item across 45 items; 45 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 67/100
  - Stability observed for 20 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_segment" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 45 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the io.github.pavellunev/appmetrica-mcp server?

io.github.pavellunev/appmetrica-mcp runs locally as an npm package, launched with npx -y appmetrica-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add pavellunev-appmetrica-mcp -- npx -y appmetrica-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "pavellunev-appmetrica-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "appmetrica-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "pavellunev-appmetrica-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "appmetrica-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add pavellunev-appmetrica-mcp -- npx -y appmetrica-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "pavellunev-appmetrica-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "appmetrica-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add pavellunev-appmetrica-mcp --command npx --arg -y --arg appmetrica-mcp
```

### Hermes

```yaml
mcp_servers:
  pavellunev-appmetrica-mcp:
    command: "npx"
    args: ["-y", "appmetrica-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "pavellunev-appmetrica-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "appmetrica-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add pavellunev-appmetrica-mcp -t stdio -c npx -a -y appmetrica-mcp
```

### Other

```json
{
  "mcpServers": {
    "pavellunev-appmetrica-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "appmetrica-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-23 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-21 (score 78, 0)

- [functional regression] Security disclosure: fail → unverified

### 2026-10-20 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 77, 0)

- [functional regression] Security disclosure: unverified → fail

### 2026-10-18 (score 77, +1)

- [functional regression] Security disclosure: fail → unverified

### 2026-10-16 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-14 (score 75, +5)

- [functional improvement] Stability: unverified → 0.37

### 2026-10-12 (score 70, 0)

- [functional regression] Security disclosure: unverified → fail

## MCP tools (45)

### `list_applications` (~34 tokens)

List all AppMetrica applications available to the authenticated user. Returns application IDs, names, platforms, and creation dates.

### `get_application` (~37 tokens)

Get detailed information about a specific AppMetrica application by its ID.

Input parameters:

- `app_id` (number, required): AppMetrica application ID

### `list_events` (~58 tokens)

List the client event names reported by an AppMetrica application (Management API "events list"). Use these names as steps in get_funnel_report or as eventLabel filters.

Input parameters:

- `app_id` (number, required): AppMetrica application ID

### `list_conversions` (~68 tokens)

List conversions (attributed-event definitions) configured for an AppMetrica application: id, name, event_type, attribution_rule, status, mandatory, etc. Conversion metrics are in the ym:ae2:* namespace.

Input parameters:

- `app_id` (number, required): AppMetrica application ID

### `get_logs_api_status` (~56 tokens)

Check whether the Logs API is enabled for the account ("enabled" / "disabled"). When it is disabled, export_events / export_logs keep returning 202 (queued) or 429 — this is how to find out why.

### `get_report` (~527 tokens)

Retrieve aggregated statistics from AppMetrica (/stat/v1/data).
Call list_metrics first (overview) or list_metrics with search/namespace to find exact keys.
Quick reference: ym:u:* users · ym:s:* sessions · ym:ce:* client events · ym:cr2:* crashes · ym:i:* installs · ym:r2:* revenue · ym:pc:* push.
Revenue metrics carry a literal <currency> placeholder (e.g. ym:r2:revenue<currency>) — pass currency (RUB|USD|EUR|YND) alongside.
Funnel step metrics (ym:uf:*) need a funnel pattern — use get_funnel_report instead.
Keep one namespace prefix per call. Known non-existent keys (4002): ym:u:sessions, ym:u:crashes, ym:u:revenue, ym:r2:revenue without <currency>.
Filters use the segmentation syntax, e.g. "ym:u:operatingSystemInfo=='iOS'"; segment_id (from list_segments) ANDs a saved segment expression into filters.
A sporadic 400 "Запрос слишком сложный" means: retry, narrow the date range, or pass accuracy (e.g. 0.1, sampled result).

Input parameters:

- `accuracy` (string): Sampling accuracy, e.g. '0.1' (faster, sampled result)
- `app_id` (number, required): AppMetrica application ID
- `currency` (string): Currency for <currency>-parametrised revenue metrics
- `date_from` (string, required): Start date in YYYY-MM-DD format
- `date_to` (string, required): End date in YYYY-MM-DD format
- `dimensions` (array): Dimension keys for breakdown, e.g. ['ym:u:date', 'ym:u:appVersion']
- `filters` (string): Segmentation filter expression, e.g. "ym:u:operatingSystemInfo=='iOS'"
- `include_undefined` (boolean): Include rows with undefined dimension values
- `lang` (string): Language of dimension names
- `limit` (number): Maximum number of rows to return
- `metrics` (array, required): Metric keys to retrieve, e.g. ['ym:u:users', 'ym:s:sessions']
- `offset` (number): Row offset for paging
- `segment_id` (number): Saved segment ID (see list_segments); its expression is ANDed with filters
- `sort` (string): Sort by a metric/dimension: '-ym:u:users' descending, 'ym:u:users' ascending

### `get_report_bytime` (~350 tokens)

Retrieve AppMetrica statistics as a time series (/stat/v1/data/bytime): the same metrics/dimensions as get_report, split by day/week/month/hour or a single interval (group=all).
Response: data[i].metrics[m][t] arrays aligned with time_intervals, plus totals.
IMPORTANT: use ONE namespace prefix per call (all metrics and dimensions ym:u:*, or all ym:s:*, ...). Mixing prefixes fails with error 4011 — issue one call per namespace.
Revenue metrics with a <currency> placeholder need the currency param. segment_id (from list_segments) is ANDed with filters.
A sporadic 400 "Запрос слишком сложный" means: retry, narrow the date range, or pass accuracy (e.g. 0.1).

Input parameters:

- `accuracy` (string): Sampling accuracy, e.g. '0.1'
- `app_id` (number, required): AppMetrica application ID
- `currency` (string): Currency for <currency>-parametrised revenue metrics
- `date_from` (string, required): Start date in YYYY-MM-DD format
- `date_to` (string, required): End date in YYYY-MM-DD format
- `dimensions` (array): Dimension keys (same namespace as metrics)
- `filters` (string): Segmentation filter expression
- `group` (string): Time bucket size (default day)
- `limit` (number): Maximum number of dimension rows
- `metrics` (array, required): Metric keys (single namespace), e.g. ['ym:u:users', 'ym:u:newUsers']
- `segment_id` (number): Saved segment ID (see list_segments); its expression is ANDed with filters

### `get_drilldown` (~140 tokens)

Retrieve drilldown statistics for a specific parent dimension value in AppMetrica. Useful for hierarchical data exploration.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `date_from` (string, required): Start date in YYYY-MM-DD format
- `date_to` (string, required): End date in YYYY-MM-DD format
- `dimensions` (array): Dimension keys for the drilldown levels
- `filters` (string): Segmentation filter expression
- `limit` (number): Maximum number of rows to return
- `metrics` (array, required): Metric keys to retrieve
- `parent_id` (string, required): Parent dimension value ID for drilldown

### `list_metrics` (~223 tokens)

Catalogue of AppMetrica Reporting API metric and dimension keys, built from the official docs (scripts/update-catalog.mjs): 197 metrics, 188 dimensions.
Without search/namespace returns a compact overview: namespaces table, keys verified live, known non-existent keys (traps) and recipes for analytics that need a special tool.
With search (case-insensitive substring over key/name/description) and/or namespace (e.g. 'ym:u:' or 'u') returns matching entries, truncated to limit with a total count.
Metrics are listed with full keys (some contain placeholders like <currency>); dimensions are listed by suffix plus the namespaces where they exist (key = namespace + suffix, e.g. ym:u: + appVersion).

Input parameters:

- `kind` (string): What to list (default all)
- `limit` (number): Max entries per kind (default 50)
- `namespace` (string): Namespace filter, e.g. 'ym:u:' or 'u'
- `search` (string): Case-insensitive substring over key/name/description

### `export_events` (~362 tokens)

Export raw event logs from AppMetrica Logs API.
Revenue and in-app purchase data is stored in the event_json field as structured JSON.
Default fields: event_name, event_datetime, event_json, appmetrica_device_id, app_version_name, os_version, device_model, country_iso_code, city.
To get subscription/purchase data: filter by event_name (e.g. "subscription_purchase") and parse event_json field.

Logs API is asynchronous — the first request usually returns "data not ready" (HTTP 202) and the wrapper re-polls the same query (default budget ~150s, tunable via APPMETRICA_MAX_WAIT_MS). A busy or wide query may still need a manual retry after a few minutes; re-running the identical query resumes the same server-side export.
Start with 1-day windows; multi-day exports take noticeably longer to materialise.
Run export_events strictly sequentially and avoid rapid retries — the Logs API has a low export-request quota; on HTTP 429 the wrapper honours Retry-After and backs off, but exhausting the quota also blocks the AppMetrica web UI for a few minutes.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `date_from` (string, required): Start date YYYY-MM-DD
- `date_to` (string, required): End date YYYY-MM-DD
- `event_name` (string): Filter by specific event name (e.g. subscription_purchase)
- `fields` (string): Comma-separated fields to return. Defaults: event_name,event_datetime,event_json,appmetrica_device_id,app_version_name,os_version,device_model,country_iso_code,city
- `limit` (number): Maximum number of events to return (default 1000)

### `export_crashes` (~207 tokens)

Export raw crash logs from AppMetrica for a given application and time range.
Use this for per-crash-name breakdowns — get_report only exposes the total ym:cr:crashes count.
Same async/rate-limit behaviour as export_events: the wrapper re-polls 202 (default ~150s budget), honours Retry-After on 429, and backs off. Run sequentially and avoid rapid retries — wide ranges may need a manual retry after a few minutes.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `date_from` (string, required): Start date YYYY-MM-DD
- `date_to` (string, required): End date YYYY-MM-DD
- `fields` (string): Comma-separated fields to return. Defaults: crash_name,crash_datetime,crash_receive_datetime,appmetrica_device_id,app_version_name,os_version,device_model,country_iso_code
- `limit` (number): Maximum number of crash records to return

### `export_installations` (~179 tokens)

Export raw installation logs from AppMetrica for a given application and time range.
Same async/rate-limit behaviour as export_events: the wrapper re-polls 202 (default ~150s budget), honours Retry-After on 429, and backs off. Run sequentially and avoid rapid retries — wide ranges may need a manual retry after a few minutes.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `date_from` (string, required): Start date YYYY-MM-DD
- `date_to` (string, required): End date YYYY-MM-DD
- `fields` (string): Comma-separated fields to return. Defaults: installation_id,install_datetime,appmetrica_device_id,app_version_name,os_version,device_model,country_iso_code,city
- `limit` (number): Maximum number of installation records to return

### `export_logs` (~267 tokens)

Export raw rows from any Logs API table: clicks, installations, postbacks, events, ecommerce_events, profiles_v2, revenue_events, ad_revenue_events, deeplinks, crashes, errors, push_tokens, sessions_starts.
Field names per table come from the official AppMetrica docs; unknown fields are rejected with the list of allowed ones. Default fields = all fields of the table.
date_from/date_to (YYYY-MM-DD) are required for every table except push_tokens, which takes no dates.
Same async/rate-limit behaviour as export_events: the wrapper re-polls 202 and honours Retry-After on 429. Run sequentially, start with 1-day windows and select only the fields you need. If exports keep queuing, check get_logs_api_status.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `date_from` (string): Start date YYYY-MM-DD (not used for push_tokens)
- `date_to` (string): End date YYYY-MM-DD (not used for push_tokens)
- `fields` (array): Fields to return (default: all fields of the table)
- `limit` (number): Maximum number of rows to return (default 1000)
- `table` (string, required): Logs API table

### `list_push_campaigns` (~64 tokens)

List push notification campaigns (groups) for an AppMetrica application. Optionally filter by campaign status.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `status` (string): Filter campaigns by status: active, paused, or finished

### `get_push_stats` (~52 tokens)

Get summary statistics for a specific push notification campaign in AppMetrica.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `campaign_id` (number, required): Push campaign (group) ID

### `create_push_campaign` (~89 tokens)

Create a new push notification campaign in AppMetrica. Requires APPMETRICA_ALLOW_WRITE=true to be set.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `audience` (object): Audience targeting options
- `message` (object, required): Push notification message content
- `name` (string, required): Campaign name
- `schedule` (object): Schedule options for the campaign

### `list_segments` (~86 tokens)

List saved segments of an AppMetrica application (the segments from the web UI). Returns segment_id, name, expression and edit_access. Pass segment_id to get_report / get_report_bytime / get_funnel_report / get_dashboard to restrict the report to a segment (its expression is ANDed into filters).

Input parameters:

- `app_id` (number, required): AppMetrica application ID

### `get_segment` (~67 tokens)

Get a saved segment of an AppMetrica application with all fields (segment_id, api_key, name, params, expression, owner, edit_access).

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `segment_id` (number, required): Segment ID from list_segments

### `create_segment` (~195 tokens)

Create a saved segment in AppMetrica (shown in the web UI; pass its segment_id to get_report / get_report_bytime / get_funnel_report / get_dashboard). Requires APPMETRICA_ALLOW_WRITE=true.
Condition: events — users who did ALL the listed client events (expression "exists ym:ce:device with (eventLabel=='X')" AND-joined; editable in the web segment editor). The API derives the expression from the editor filter JSON, so other condition types (device, geo, version, profile…) must be created in the web UI; for ad-hoc filtering use the filters parameter of the report tools instead.
Returns {segment_id, name, expression, edit_access}.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `events` (array, required): Client event names; users who did all of them (list_events)
- `name` (string, required): Segment name

### `update_segment` (~131 tokens)

Update a saved segment in AppMetrica: fetches the segment, merges the given fields and saves it. Requires APPMETRICA_ALLOW_WRITE=true.
Give name and/or events (new condition: users who did all listed client events). Omitted fields keep their saved values.
Returns {segment_id, name, expression, edit_access}.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `events` (array): New condition: users who did all these client events
- `name` (string): New segment name
- `segment_id` (number, required): Segment ID from list_segments

### `delete_segment` (~67 tokens)

Delete a saved segment from AppMetrica (irreversible; reports and dashboards using its segment_id will fail). Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `segment_id` (number, required): Segment ID from list_segments

### `list_funnels` (~85 tokens)

List saved funnels of an AppMetrica application (funnel reports from the web UI): id, name, comment, decoded steps (title, events, kind), single_session, events_between_steps, grouping and the raw API pattern. Pass funnel_id to get_funnel_report to compute a saved funnel.

Input parameters:

- `app_id` (number, required): AppMetrica application ID

### `get_funnel_report` (~499 tokens)

Funnel report — the web "Funnels" report via the Reporting API: devices reaching each step in sequence, with absolute (% of step 1) and relative (% of previous step) conversion.
Provide exactly one of: funnel_id (saved funnel from list_funnels — its pattern is used verbatim and the options below are ignored) or steps (ad-hoc funnel, e.g. [{"events":["app_open"]},{"events":["purchase"]}]; event names from list_events).
Ad-hoc options: foreground_only (default true, count only foreground sessions), single_session (default false; true = all steps within one session), events_between_steps (default true; false = steps must follow each other directly). window_seconds limits the time from first to last step.
Under the hood: ym:uf:devicesInStepN (ym:sf: for single-session) with funnel_pattern / funnel_restriction params, one request. dimensions break the funnel down (full keys or bare suffixes such as 'date', 'appVersion', 'operatingSystemInfo', 'regionCountry'); group (day|week|month) adds a time series via one extra /bytime request.
filters / segment_id restrict the audience (segment expression is ANDed with filters).

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `date_from` (string, required): Start date in YYYY-MM-DD format
- `date_to` (string, required): End date in YYYY-MM-DD format
- `dimensions` (array): Breakdown dimensions, full keys or bare suffixes (prefixed with ym:uf:/ym:sf:)
- `events_between_steps` (boolean): Ad-hoc: allow other events between steps (default true)
- `filters` (string): Segmentation filter expression
- `foreground_only` (boolean): Ad-hoc: count only foreground sessions (default true)
- `funnel_id` (number): Saved funnel ID (list_funnels)
- `group` (string): Add a per-interval series (extra bytime request)
- `limit` (number): Max dimension rows (default 50)
- `segment_id` (number): Saved segment ID (list_segments); ANDed with filters
- `single_session` (boolean): Ad-hoc: all steps within one session (default false)
- `steps` (array): Ad-hoc funnel steps
- `window_seconds` (integer): Max seconds from first to last step

### `create_funnel` (~301 tokens)

Create a saved funnel in AppMetrica (visible in the web "Funnels" report and in list_funnels). Requires APPMETRICA_ALLOW_WRITE=true.
Verify the steps with get_funnel_report(steps=...) first. Steps must be representable in the web funnel editor: client events (several names = any of them; at most ONE event_params entry per step, applied to every event of the step) or kind "install". Other step kinds (crash, purchase, session_start, ...) are rejected — use get_funnel_report for those ad-hoc.
Options: foreground_only (default true), single_session (default false), events_between_steps (default true; false is saved as a "next"-joined pattern without funnel_restriction, which the API does not store — unverified, prefer the default).
Returns {id, name, steps, pattern, next}.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `comment` (string): Funnel comment
- `events_between_steps` (boolean): Allow other events between steps (default true)
- `foreground_only` (boolean): Count only foreground sessions (default true)
- `name` (string, required): Funnel name
- `single_session` (boolean): All steps within one session (default false)
- `steps` (array, required): Funnel steps, e.g. [{"events":["app_open"]},{"events":["purchase"]}] (event names from list_events)

### `update_funnel` (~208 tokens)

Update a saved funnel in AppMetrica. Requires APPMETRICA_ALLOW_WRITE=true.
Only name/comment given: the saved pattern is kept verbatim. If steps or any of foreground_only / single_session / events_between_steps is given, pattern and frontend_pattern are rebuilt from the existing steps (or the new steps) merged with the given options; steps the web editor cannot represent are rejected (see create_funnel).
Returns {id, name, steps, pattern, next}.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `comment` (string): New funnel comment
- `events_between_steps` (boolean): Allow other events between steps
- `foreground_only` (boolean): Count only foreground sessions
- `funnel_id` (number, required): Funnel ID from list_funnels
- `name` (string): New funnel name
- `single_session` (boolean): All steps within one session
- `steps` (array): New funnel steps (replace all existing steps)

### `delete_funnel` (~59 tokens)

Delete a saved funnel from AppMetrica (irreversible). Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `funnel_id` (number, required): Funnel ID from list_funnels

### `audit_events` (~303 tokens)

Audit the client-event instrumentation of an application (read-only): compares event names registered in AppMetrica (list_events) with event volumes of a period (ym:ce:allEvents / ym:ce:devices by ym:ce:eventLabel).
Each event is classified as active (has data in the period), zero_volume (registered but no data in the period) or missing (in expected_events but neither registered nor active). With expected_events (e.g. names found in the app's source code) every event carries expected=true/false, so active events with expected=false are the unexpected ones.
System events (appmetrica_*, com.yandex.*) are listed separately in system_events and excluded from the counts. findings are plain-language heuristics: missing / zero-volume / low-volume (<=5 devices) events, mixed snake_case and CamelCase naming, and no event resembling first launch / onboarding, registration or purchase.
Two requests: /v1/traffic/sources/events and /stat/v1/data.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `date_from` (string, required): Start date in YYYY-MM-DD format
- `date_to` (string, required): End date in YYYY-MM-DD format
- `expected_events` (array): Event names the app is expected to report (e.g. collected from source code)
- `limit` (number): Max events requested from the report, by volume (default 500)

### `get_dashboard` (~416 tokens)

Dashboard: a set of widgets computed from the public Reporting API, similar to the AppMetrica web "Обзор". The web workspaces/dashboards themselves are NOT accessible via the public API (internal cookie-auth endpoint), so dashboards are composed from presets or from a locally saved workspace (save_workspace).
Presets: audience, installs, installs_by_country, engagement, app_versions, events, crashes, errors, anr, revenue, ad_revenue, ad_revenue_by_type, conversions, traffic, push, funnels, retention. Default set: audience, installs, engagement, crashes, events. See list_dashboard_presets for the metrics of each preset.
Pass either widgets (preset names) or workspace (name of a locally saved workspace, which defines the widgets and may define a default app_id) — not both. With neither, the default set is used.
Each widget costs one Reporting API request, run sequentially (quota: 30 requests/second, 5000/day); the 'funnels' preset costs one request per saved funnel. A failing widget returns {name, error} and does not fail the whole dashboard. Namespaces are never mixed within a request.
group (day|week|month) turns widgets without breakdown into time series (no period-wide total then). segment_id (list_segments) is ANDed with each widget's own filters/segment. currency (default USD) applies to revenue widgets.

Input parameters:

- `app_id` (number): AppMetrica application ID (optional only when the workspace defines app_id)
- `currency` (string): Currency for revenue widgets (default USD)
- `date_from` (string, required): Start date in YYYY-MM-DD format
- `date_to` (string, required): End date in YYYY-MM-DD format
- `group` (string): Time bucket for widgets without breakdown
- `segment_id` (number): Saved segment ID applied to all widgets
- `widgets` (array): Preset widget names
- `workspace` (string): Name of a saved local workspace

### `list_dashboard_presets` (~47 tokens)

List the preset dashboard widgets usable in get_dashboard / save_workspace: name, title, namespace, metrics, breakdown dimensions, limit, whether a currency is needed, and the default set.

### `list_workspaces` (~69 tokens)

List locally saved workspaces (named widget sets) from /tmp/.config/appmetrica-mcp/workspaces.json (override with APPMETRICA_WORKSPACES_FILE). These are the MCP's own local workspaces — AppMetrica web workspaces are not exposed by the public API.

### `get_workspace` (~28 tokens)

Get a locally saved workspace with its full widget specs.

Input parameters:

- `name` (string, required): Workspace name

### `save_workspace` (~203 tokens)

Create or update (upsert) a local workspace: a named set of dashboard widgets stored in /tmp/.config/appmetrica-mcp/workspaces.json. Local file operation only — nothing is written to AppMetrica, so it is not gated by APPMETRICA_ALLOW_WRITE.
Each widget has a name and exactly one of: preset (audience, installs, installs_by_country, engagement, app_versions, events, crashes, errors, anr, revenue, ad_revenue, ad_revenue_by_type, conversions, traffic, push, funnels, retention), metrics (custom, single namespace; optional dimensions/filters/segment_id/limit) or funnel_id (saved funnel). Use it later via get_dashboard(workspace=name).

Input parameters:

- `app_id` (number): Default app_id for get_dashboard(workspace=...)
- `description` (string): Free-text description
- `name` (string, required): Workspace name
- `widgets` (array, required): Widget specs

### `delete_workspace` (~38 tokens)

Delete a local workspace by name (local file operation only; nothing is changed in AppMetrica).

Input parameters:

- `name` (string, required): Workspace name

### `web_session_status` (~96 tokens)

[Experimental web session] Check the AppMetrica web session (Chrome profile with a Yandex login) used by the web_* tools: logged_in, Yandex login, profile directory. Starts headless Chrome on first use (about 7 seconds). Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex.

### `web_list_workspaces` (~121 tokens)

[Experimental web session] List the app's AppMetrica web workspaces (dashboards): system ones (id "<appId>/General" = Overview, "<appId>/Audience", ...) and custom ones. Returns dashboard_id, name, is_system, preset_kind, number of groups and widgets. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex.

Input parameters:

- `app_id` (number, required): AppMetrica application ID

### `web_get_workspace` (~118 tokens)

[Experimental web session] Get one AppMetrica web workspace: groups with headers and widgets (dashboard_widget_id, widget_id, view kind, funnel_id), enriched with the widget name, namespace, metrics and dimensions. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `dashboard_id` (string, required): Dashboard ID from web_list_workspaces

### `web_list_widget_presets` (~120 tokens)

[Experimental web session] List the web preset widgets usable in web_create_workspace / web_add_widgets (widget_id is the `preset` value): name, namespace, categories, metrics, dimensions, default view kind. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `category` (string): Only presets of this category, e.g. Product

### `web_list_report_namespaces` (~135 tokens)

[Experimental web session] List report namespaces of the web constructor (id, name, Reporting API prefix, e.g. Audience = ym:u:). With namespace_id: the metrics and dimensions (id, title; first 200 each) valid for custom widgets of that namespace. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `namespace_id` (string): Namespace id, e.g. Audience, Revenue, Events

### `web_create_workspace` (~220 tokens)

[Experimental web session] Create a workspace (dashboard) in AppMetrica itself in one call. groups is an ordered list of rows; a group is {header?: string, widgets?: WidgetInput[]} (header and widgets in one group become a header row followed by a widgets row). A widget is exactly one of: preset (web preset id), funnel_id (saved funnel), or metrics (custom widget: namespace derived from the metric prefix, metric/dimension ids validated against the namespace). Limits: 20 dashboards per app, 20 widgets and 40 groups per dashboard. Returns {dashboard_id, name, url, groups}. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex. Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `groups` (array): Initial groups (rows) of the workspace
- `name` (string, required): Workspace name

### `web_add_widgets` (~186 tokens)

[Experimental web session] Add one group (a row of widgets) to an existing AppMetrica workspace. A widget is exactly one of: preset (web preset id), funnel_id (saved funnel), or metrics (custom widget: namespace derived from the metric prefix, metric/dimension ids validated against the namespace). position is the 0-based index among the groups (default: append). Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex. Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `dashboard_id` (string, required): Dashboard ID from web_list_workspaces
- `position` (integer): 0-based index among groups
- `widgets` (array, required): Widgets of the new row

### `web_add_header` (~137 tokens)

[Experimental web session] Add a section header row to an AppMetrica workspace. position is the 0-based index among the groups (default: append). Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex. Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `dashboard_id` (string, required): Dashboard ID from web_list_workspaces
- `position` (integer): 0-based index among groups
- `title` (string, required): Header text

### `web_rename_workspace` (~105 tokens)

[Experimental web session] Rename an AppMetrica workspace. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex. Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `dashboard_id` (string, required): Dashboard ID from web_list_workspaces
- `name` (string, required): New name

### `web_remove_widget` (~123 tokens)

[Experimental web session] Remove one widget from an AppMetrica workspace by dashboard_widget_id (see web_get_workspace). Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex. Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `dashboard_id` (string, required): Dashboard ID from web_list_workspaces
- `dashboard_widget_id` (string, required): dashboard_widget_id from web_get_workspace

### `web_delete_workspace` (~110 tokens)

[Experimental web session] Delete a custom AppMetrica workspace. System dashboards (id like "<appId>/General") are refused. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex. Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID
- `dashboard_id` (string, required): Dashboard ID from web_list_workspaces

### `web_push_workspace` (~350 tokens)

[Experimental web session] Create an AppMetrica workspace from a LOCAL workspace (save_workspace / list_workspaces). Each local widget becomes a header row (its name) plus a row of web widgets. Local presets map to web presets where there is a clear counterpart (audience -> AudienceMulti, installs -> Installs, engagement -> UserTimeSpent + AvgSessionTime + UserSessionsCount, app_versions -> AppVersion, crashes -> CrashFreeSessions + Crashes, errors -> ErrorLogsIos + ErrorLogsAndroid, revenue -> RevenueTotal + RevenuePurchases, ad_revenue -> AdRevenue + AdRevenueARPU + AdRevenueECPM, traffic -> Clicks + Installs + InstallConversion, push -> PushSent + PushReceived + PushOpened, retention -> RetentionDynamics, funnels -> one Funnels widget per saved funnel); the rest (installs_by_country, events, conversions, anr, ad_revenue_by_type) and local custom metrics become custom widgets; funnel_id widgets become Funnels widgets. Widgets that cannot be created (unknown metric ids, no saved funnels) are skipped and listed in "skipped". Returns {dashboard_id, name, url, groups, skipped?, notes?}. Uses the unofficial AppMetrica web API through a headless Chrome session: run `npx appmetrica-mcp login` once to log in to Yandex. Requires APPMETRICA_ALLOW_WRITE=true.

Input parameters:

- `app_id` (number, required): AppMetrica application ID to create the workspace in
- `name` (string): Name of the AppMetrica workspace (default: the local workspace name)
- `workspace` (string, required): Name of the local workspace

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/pavellunev-appmetrica-mcp/appmetrica-mcp#diagnostics

## Score history

- 2026-10-23: 79
- 2026-10-22: 78
- 2026-10-21: 78
- 2026-10-20: 78
- 2026-10-19: 77
- 2026-10-18: 77
- 2026-10-17: 76
- 2026-10-16: 76
- 2026-10-15: 75
- 2026-10-14: 75
- 2026-10-13: 70
- 2026-10-12: 70
- 2026-10-11: 70
- 2026-10-04: 70
- 2026-10-03: 44

## Common questions

### What is the io.github.pavellunev/appmetrica-mcp server?

io.github.pavellunev/appmetrica-mcp is listed in the public MCP registry as io.github.pavellunev/appmetrica-mcp. AppMetrica (Yandex) analytics: reports, funnels, segments, dashboards, logs export, push. This page covers its npm package (appmetrica-mcp).

### Is the io.github.pavellunev/appmetrica-mcp server safe to use?

io.github.pavellunev/appmetrica-mcp scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.pavellunev/appmetrica-mcp server expose?

io.github.pavellunev/appmetrica-mcp exposes 45 tools: list_applications, get_application, list_events, list_conversions, get_logs_api_status, and 40 more. Their descriptions and schemas cost roughly 7,336 tokens of context every time the server is loaded.

### Is the io.github.pavellunev/appmetrica-mcp server still maintained?

io.github.pavellunev/appmetrica-mcp is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the io.github.pavellunev/appmetrica-mcp server under?

io.github.pavellunev/appmetrica-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/appmetrica-mcp
- Socket report: https://socket.dev/npm/package/appmetrica-mcp
- Repository: https://github.com/pavellunev/app_metrica_mcp
- Changelog RSS feed: https://verifymcp.io/servers/pavellunev-appmetrica-mcp/appmetrica-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/pavellunev-appmetrica-mcp/appmetrica-mcp.json
- HTML version of this page: https://verifymcp.io/servers/pavellunev-appmetrica-mcp/appmetrica-mcp
