A side-by-side look at the AdLoop and Appmetrica MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose AdLoop for marketing work as a local process; choose Appmetrica MCP for marketing as a local process. You can also run both side by side in one mcpServers block.
health_check, get_account_summaries, run_ga4_report.list_applications, get_application, list_events.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Marketing | Marketing |
| Quality signal | 65/100 · Great | 64/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | OAuth 2.0 | OAuth 2.0 |
| Pricing | Not declared | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 284 | 3 |
| Directory activity | 1 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 134 | 45 |
| Full listing | View AdLoop | View Appmetrica MCP |
health_checkTest AdLoop connectivity — checks OAuth token, GA4 API, Google Ads API,
and (when configured) the Reddit Ads API.
Returns the status of each service and actionable guidance when something
is broken, which makes it the diagnostic for failures in other tools.
Google Ads API: https://developers.google.com/google-ads/api/docs/start, Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Reddit Ads API: https://ads-api.reddit.com/docs/v3/get_account_summariesList all GA4 accounts and properties accessible by the authenticated user.
Serves as the discovery step for which GA4 properties are available.
Returns account names, property names, and property IDs.
Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1run_ga4_reportRun a custom GA4 report with optional filters, ordering, paging and a comparison period.
Returns the property, the date range, the dimension and metric headers,
one row per dimension combination (values as strings), row_count and
total_row_count (plus next_offset while more rows remain). At least one
dimension or metric is required. With compare_start/compare_end the
comparison period is a second date range: every row then carries a
dateRange value of "current" or "comparison", and date_ranges maps both
labels to their dates. Invalid filters or ordering return "Validation
failed" with details, before anything is sent.
Queries the GA4 Data API. Dimensions and metrics:
https://developers.google.com/analytics/devguides/reporting/data/v1/api-schemarun_realtime_reportRun a GA4 realtime report showing current active users and events.
Useful for checking if tracking is firing correctly after code changes.
Returns the dimension and metric headers and one row per dimension
combination over the realtime window (the last 30 minutes).
Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1get_tracking_eventsList all GA4 events and their volume for the given date range.
Returns every distinct event name with its total event count, sorted by
count (highest first). Shows what tracking is configured and active.
Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1list_key_eventsList the key events (conversions) configured on a GA4 property.
Returns each key event's event name, counting method (ONCE_PER_EVENT or
ONCE_PER_SESSION), create time, whether GA4 allows deleting it, whether
it is a custom event, and its resource name, sorted by event name, plus
the total. Reads the GA4 Admin API (keyEvents.list).
Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1list_ga4_dimensions_and_metricsList the dimensions and metrics a GA4 property can report on, including custom ones.
Returns the exact API names valid in run_ga4_report for this property:
each with its UI name, category, whether it is a custom definition
(customEvent:..., customUser:...), and deprecated API names; metrics
also carry their type and, for calculated metrics, the expression.
Reads the GA4 Data API metadata (properties.getMetadata), which uses no
report quota.
Google Analytics Data API: https://developers.google.com/analytics/devguides/reporting/data/v1 and Admin API: https://developers.google.com/analytics/devguides/config/admin/v1list_gsc_sitesList all Google Search Console properties the authenticated user can access.
Serves as the discovery step for the site URLs that search analytics
reports (run_gsc_report) take. Returns the site URL and permission level
for each property.
Search Console API: https://developers.google.com/webmaster-toolsrun_gsc_reportRun a Google Search Console search analytics report.
Returns clicks, impressions, CTR, and average position broken down by
the requested dimensions. Useful for diagnosing organic traffic drops,
finding keyword opportunities, and cross-referencing with GA4 and Ads data.
One request returns at most 25,000 rows; a full page carries
next_start_row for the following request. With data_state "all" the
response metadata names the first date whose data is still incomplete.
Queries the Search Console API:
https://developers.google.com/webmaster-tools/v1/searchanalytics/queryanalyze_page_speedRun PageSpeed Insights for a landing page — Lighthouse + real-user data.
Returns the performance score (0-100), lab Core Web Vitals (LCP, CLS,
TBT, FCP), CrUX field data from real Chrome users where available
(p75 LCP/INP/CLS/FCP/TTFB + FAST/AVERAGE/SLOW ratings), and the top
improvement opportunities with estimated savings. When the page itself
has too little traffic for field data, the origin-wide field data is
returned instead, marked field.scope="origin".
Typical input is an ad final_url: slow landing pages depress Quality
Score and waste paid clicks. Takes 10-30s; that is normal for a
Lighthouse run.
PageSpeed Insights API: https://developers.google.com/speed/docs/insights/v5/aboutlist_merchant_accountsList Google Merchant Center accounts the connected user can access.
Returns each account's numeric ID, name and whether it is a test
account. Provides the account_id used by get_merchant_feed_health;
not needed when merchant.account_id is set in the config.
Merchant API: https://developers.google.com/merchant/api/overviewget_merchant_feed_healthMerchant Center feed health — disapproved products + account issues.
Disapproved feed items silently starve Shopping and Performance Max
campaigns; this reports approved/pending/disapproved counts per
reporting context (Shopping ads, free listings, ...), the top product
issues by affected products (with documentation links), and
account-level issues — CRITICAL ones stop offers serving entirely.
Product-status data lags reality by ~30 minutes.
Merchant API: https://developers.google.com/merchant/api/overviewlist_applicationsList all AppMetrica applications available to the authenticated user. Returns application IDs, names, platforms, and creation dates.get_applicationGet detailed information about a specific AppMetrica application by its ID.list_eventsList 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.list_conversionsList 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.get_logs_api_statusCheck 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_reportRetrieve 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).get_report_bytimeRetrieve 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).get_drilldownRetrieve drilldown statistics for a specific parent dimension value in AppMetrica. Useful for hierarchical data exploration.list_metricsCatalogue 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).export_eventsExport 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.export_crashesExport 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.export_installationsExport 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.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"adloop": {
"command": "uvx",
"args": [
"adloop"
]
}
}
}
{
"mcpServers": {
"appmetrica-mcp": {
"command": "npx",
"args": [
"-y",
"appmetrica-mcp"
]
}
}
}