# PushEngage (npm · @pushengage/mcp)

Send push notifications, build audiences, and view campaign analytics from PushEngage.

- Trust score: 72/100 (medium)
- Change this week: +5
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-16

## Components

- npm · `@pushengage/mcp`: 72/100 (this document), [markdown](https://verifymcp.io/servers/awesomemotive-pushengage-mcp/pushengage-mcp.md), [page](https://verifymcp.io/servers/awesomemotive-pushengage-mcp/pushengage-mcp)

## Channel facts

- Registry: `npm`
- Package: `@pushengage/mcp`
- Version: `1.0.0`
- 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-08-16.

- **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.
  - 33 of 106 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 23 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 70/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 5936 tokens (~219/item across 27 items; 27 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 33/100
  - Stability observed for 10 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.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add awesomemotive-pushengage-mcp -- npx -y @pushengage/mcp
```

### Codex

```bash
codex mcp add awesomemotive-pushengage-mcp -- npx -y @pushengage/mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add awesomemotive-pushengage-mcp --command npx --arg -y --arg @pushengage/mcp
```

### Hermes

```yaml
mcp_servers:
  awesomemotive-pushengage-mcp:
    command: "npx"
    args: ["-y", "@pushengage/mcp"]
```

### Other

```json
{
  "mcpServers": {
    "awesomemotive-pushengage-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@pushengage/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-08-16 (score 72, −1)

- [functional regression] Security disclosure: pass → unverified

### 2026-08-15 (score 73, +1)

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

### 2026-08-14 (score 72, +1)

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

### 2026-08-13 (score 71, +3)

- [functional improvement] Stability: unverified → 0.23

### 2026-08-11 (score 68, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-08-10 (score 67, 0)

- [functional improvement] Security disclosure: unverified → pass

### 2026-08-09 (score 67, 0)

- [functional regression] Security disclosure: pass → unverified

### 2026-08-07 (score 67, +4)

- [security improvement] Known CVEs: partial → pass
- [functional improvement] Security disclosure: fail → pass
- [functional] Dependency health: partial → 0.85

## MCP tools (27)

### `pushengage_auth_login` (~77 tokens)

Log in to PushEngage

Opens a browser window to the PushEngage dashboard. After you click Authorize, an access token is stored locally and used for subsequent calls; the expiry is shown in the result. Requires a browser on the local machine. In headless or SSH environments the authorization URL is printed to the terminal so it can be opened manually.

Output parameters:

- `authorized` (boolean)
- `expires_at` (string)

### `pushengage_auth_status` (~60 tokens)

Check authentication and site status

Returns the current login state: authenticated (bool), expires_at (token expiry ISO string), current_site_id, api_url, dashboard_url, and client_name. Use this to check whether pushengage_auth_login is needed before making other calls.

Output parameters:

- `api_url` (string)
- `authenticated` (boolean)
- `client_name` (string)
- `current_site_id` (number)
- `dashboard_url` (string)
- `expires_at` (string)

### `pushengage_auth_logout` (~51 tokens)

Log out

Revokes the current PushEngage session on the server and deletes the locally stored token. After this call, all site-scoped tools require pushengage_auth_login before they can be used again.

Output parameters:

- `server_session_revoked` (boolean|null)
- `status` (string)

### `pushengage_list_sites` (~83 tokens)

List sites

Lists PushEngage sites the authenticated user can access. Returns site_id, site_name, site_url, and site_status. Also returns current_site_id so the assistant can see which site is already active without calling pushengage_auth_status. When the user asks to send a notification linking to their site's homepage, use site_url as the notification's url field.

Output parameters:

- `current_site_id` (number)
- `sites` (array)

### `pushengage_select_site` (~101 tokens)

Select current site

Sets the current site used by all site-scoped tools (pushengage_send_notification, pushengage_list_segments, pushengage_get_analytics_summary, pushengage_list_drip_campaigns, etc.) when no site_id is provided. Persists across MCP restarts. Call pushengage_list_sites first to get a valid site_id.

Input parameters:

- `site_id` (integer, required): PushEngage site_id from pushengage_list_sites

Output parameters:

- `current_site_id` (number)
- `site_name` (string)
- `site_url` (string)

### `pushengage_get_site_details` (~63 tokens)

Get site details

Returns the current site's details, matching the dashboard's Site Details page: name, URL, image, timezone, geolocation toggle, and the "Powered By PushEngage" branding toggle.

Input parameters:

- `site_id` (integer): Override the currently selected site.

Output parameters:

- `enable_geolocation` (boolean)
- `remove_powered_by_pushengage` (boolean)
- `site_id` (number)
- `site_image` (string)
- `site_name` (string)
- `site_url` (string)
- `timezone` (string)

### `pushengage_update_site_details` (~242 tokens)

Update site details

Updates the current site's details. Pass only the fields you want to change: site_name (Site Name), site_url (Site URL), timezone (Website Time Zone, an IANA name), enable_geolocation (Enable Geolocation), and/or remove_powered_by_pushengage (Remove "Powered By PushEngage", which needs a paid plan). Provide at least one field. Returns the updated site details.

Input parameters:

- `enable_geolocation` (boolean): Enable Geolocation. Personalizes notifications based on the subscriber's location and timezone.
- `remove_powered_by_pushengage` (boolean): Remove "Powered By PushEngage" branding from notifications. Requires a paid (white-label) plan; the API rejects it otherwise.
- `site_id` (integer): Override the currently selected site.
- `site_name` (string): Site Name. 3-150 characters.
- `site_url` (string): Site URL. A full http(s) URL, e.g. https://example.com.
- `timezone` (string): Website Time Zone as an IANA name, e.g. "America/New_York" or "Asia/Kolkata".

Output parameters:

- `enable_geolocation` (boolean)
- `remove_powered_by_pushengage` (boolean)
- `site_id` (number)
- `site_image` (string)
- `site_name` (string)
- `site_url` (string)
- `timezone` (string)

### `pushengage_get_campaign_defaults` (~95 tokens)

Get campaign defaults

Returns the current site's campaign default settings: utm_parameters (enabled + source/medium/campaign/term/content), fallback_notification (title/message/url), fallback_attributes (city/country), and default_expiry (broken into total_seconds + days/hours/minutes). These are the defaults applied to push campaigns, matching the dashboard's Campaign Defaults page.

Input parameters:

- `site_id` (integer): Override the currently selected site.

Output parameters:

- `default_expiry` (object)
- `fallback_attributes` (object)
- `fallback_notification` (object)
- `utm_parameters` (object)

### `pushengage_update_campaign_defaults` (~293 tokens)

Update campaign defaults

Updates one or more of the current site's campaign default settings. Pass only the groups and fields you want to change: utm_parameters, fallback_notification, fallback_attributes, and/or default_expiry. The tool reads the current values and merges your changes, so partial edits are fine (e.g. change just utm_parameters.source, or set default_expiry to {days:7}). default_expiry is given as days/hours/minutes (omitted components count as 0; total must be between 1 minute and 28 days). When utm_parameters.enabled is true, source/medium/campaign must be non-empty after the merge. Provide at least one group. Returns the updated settings.

Input parameters:

- `default_expiry` (object): Default notification expiry. Set as days/hours/minutes; omitted components count as 0. Total must be between 1 minute and 28 days.
- `fallback_attributes` (object): Fallback subscriber city/country used when the browser can't resolve them.
- `fallback_notification` (object): Notification shown if the browser cannot fetch the sent notification. Title, message, and URL are all required by the API, so any you omit are kept from the current values.
- `site_id` (integer): Override the currently selected site.
- `utm_parameters` (object): UTM defaults appended to campaign URLs. Provide only the fields you want to change.

Output parameters:

- `default_expiry` (object)
- `fallback_attributes` (object)
- `fallback_notification` (object)
- `utm_parameters` (object)

### `pushengage_get_service_worker_settings` (~89 tokens)

Get service worker settings

Returns the current site's Service Worker Settings (from the Advanced Settings page), using the dashboard labels: enable_service_worker_registration ("Enable the service worker registration from PushEngage"), enable_service_worker_in_subfolder ("Enable addition of service worker in another sub-folder"), and service_worker_file_path ("Path for service worker file").

Input parameters:

- `site_id` (integer): Override the currently selected site.

Output parameters:

- `enable_service_worker_in_subfolder` (boolean)
- `enable_service_worker_registration` (boolean)
- `service_worker_file_path` (string)

### `pushengage_update_service_worker_settings` (~191 tokens)

Update service worker settings

Updates the current site's Service Worker Settings. Pass only the fields you want to change: enable_service_worker_registration, enable_service_worker_in_subfolder, and/or service_worker_file_path. The tool reads the current values and merges your changes. When enable_service_worker_registration is true, service_worker_file_path must be non-empty after the merge. Provide at least one field. Returns the updated settings.

Input parameters:

- `enable_service_worker_in_subfolder` (boolean): Enable addition of service worker in another sub-folder.
- `enable_service_worker_registration` (boolean): Enable the service worker registration from PushEngage. Disable it only if your site already registers its own service worker. When true, service_worker_file_path is required.
- `service_worker_file_path` (string): Path for service worker file. Required when the service worker registration is enabled.
- `site_id` (integer): Override the currently selected site.

Output parameters:

- `enable_service_worker_in_subfolder` (boolean)
- `enable_service_worker_registration` (boolean)
- `service_worker_file_path` (string)

### `pushengage_list_segments` (~167 tokens)

List segments

Lists segments on the current site, paginated (response includes `has_more`). Each item carries segment_id, name, current subscriber count, status, and any URL matching criteria.

Input parameters:

- `limit` (integer): How many segments to return in this page. Min 1, max 100, default 10. To browse past the first 100, increase `page` instead of asking for a larger limit.
- `name_contains` (string): Optional case-insensitive substring filter on segment_name.
- `page` (integer): Page number (1-indexed) for paginating beyond the first batch. e.g. with limit=100 the second page (segments 101–200) is page=2.
- `site_id` (integer): Override the currently selected site.

Output parameters:

- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `segments` (array)
- `total` (number)

### `pushengage_create_segment` (~301 tokens)

Create a segment

Creates a new segment on the current site. Required: segment_name. Optionally pass segment_criteria with URL `include` and/or `exclude` rules to define what subscribers belong to the segment — each rule is `{ rule: "start" | "exact" | "contains", value: "<url>" }`. By default, segment criteria are evaluated only when a visitor subscribes to push notifications. Set add_segment_on_page_load=true (Segment on Page Visit) to evaluate those criteria on every page visit instead, so segment membership can change as subscribers browse the site. Only include segment_criteria and add_segment_on_page_load when the user explicitly describes the matching rules.

Input parameters:

- `add_segment_on_page_load` (boolean): Segment on Page Visit. By default (false), segment criteria (such as URL rules) are evaluated only when a visitor subscribes to push notifications. Set to true to evaluate those criteria on every pag…
- `segment_criteria` (object): URL-based include/exclude rules that decide which subscribers belong to this segment. Omit to create a name-only segment that the user populates later via the dashboard or workflows. When provided, a…
- `segment_name` (string, required): Segment display name. 1–150 characters.
- `site_id` (integer): Override the currently selected site.

Output parameters:

- `add_segment_on_page_load` (boolean)
- `segment_criteria`
- `segment_id` (number)
- `segment_name` (string)
- `view_url` (string)

### `pushengage_list_attributes` (~191 tokens)

List subscriber attributes

Lists subscriber attributes (custom keys set on subscribers via the JS SDK) on the current site, paginated (response includes `has_more`). Use this to discover attribute `key` values before constructing an audience-group filter rule with field="attributes".

Input parameters:

- `key_contains` (string): Optional substring filter on the attribute `key`. Maps to API `key_like`. Use this when looking up an attribute by name (e.g. searching for "plan" to find the "plan" attribute key).
- `limit` (integer): How many attributes to return in this page. Min 1, max 100, default 10. To browse past the first 100, increase `page` instead of asking for a larger limit.
- `page` (integer): Page number (1-indexed) for paginating beyond the first batch.
- `site_id` (integer): Override the currently selected site.

Output parameters:

- `attributes` (array)
- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `total` (number)

### `pushengage_create_attribute` (~251 tokens)

Create a subscriber attribute

Creates a new subscriber attribute on the current site. Required: `name` (human-readable label, e.g. "Customer Plan") and `key` (machine identifier, e.g. "plan"). The `key` must start with a letter and contain only letters, numbers, hyphens, and underscores. The created `key` becomes a usable value for audience-group rules with field="attributes" (the rule's `key` property). PushEngage caps each site at 50 attributes; the API returns 422 if the limit is exceeded.

Input parameters:

- `key` (string, required): The machine identifier used in the JavaScript SDK and in audience-group rules. Must start with a letter and only contain letters, numbers, hyphens, and underscores. Max 64 chars. e.g. "plan", "signup…
- `name` (string, required): Human-readable attribute name shown in the dashboard. 1–128 chars. e.g. "Customer Plan", "Sign-up Source".
- `site_id` (integer): Override the currently selected site.

Output parameters:

- `id` (number)
- `key` (string)
- `name` (string)
- `status`
- `use_with_audience_group_rule` (object)
- `view_url` (string)

### `pushengage_list_audience_groups` (~198 tokens)

List audience groups

Lists audience groups on the current site, paginated (response includes `has_more`). Use this to look up audience-group IDs when the user references a group by name; those IDs are what pushengage_send_notification / pushengage_send_ab_notification accept in their `audience_groups` field.

Input parameters:

- `limit` (integer): How many audience groups to return in this page. Min 1, max 100, default 10. To browse past the first 100, increase `page` instead of asking for a larger limit.
- `name_contains` (string): Optional substring filter on the audience-group name. Maps to API `name_like`.
- `page` (integer): Page number (1-indexed) for paginating beyond the first batch. e.g. with limit=100 the second page (101–200) is page=2.
- `site_id` (integer): Override the currently selected site.

Output parameters:

- `audience_groups` (array)
- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `total` (number)

### `pushengage_create_audience_group` (~477 tokens)

Create an audience group

Creates a new audience group on the current site. Required: `name` and `filter`. The `filter` is a subscriber-filter expression — { op: "or" | "and" (default "or"), value: 2-D array of rule groups }. Each rule is { field, op, value?, key? }. Rules WITHIN a group are AND-ed; groups in `value` are combined with the top-level `op`. See the inputSchema field descriptions for the supported `field` and `op` enums. Common patterns: "Mobile subscribers" → filter={ op: "or", value: [[{ field: "device", op: "in", value: ["mobile"] }]] }. "Subscribed in the last 7 days" → filter={ op: "or", value: [[{ field: "ts_created", op: "ts_elapsed_lt", value: 604800 }]] }. "Highly engaged" (≥20 sent AND ≥2 clicks) → filter={ op: "or", value: [[{ field: "sent_count", op: "gt", value: 20 }, { field: "click_count", op: "gt", value: 2 }]] }. Only set description and complex filters when the user explicitly describes them.

Input parameters:

- `description` (string): Optional human-readable description, up to 256 chars.
- `filter` (object, required): Required. The subscriber-filter expression that decides which subscribers belong to this group. Use SubscriberFilterSchema: an outer op ("or"/"and") + a 2-D `value` array (groups of AND-ed rules). Ea…
- `name` (string, required): Audience-group display name. 1–150 chars.
- `site_id` (integer): Override the currently selected site.

Output parameters:

- `description` (string)
- `filter`
- `id` (number)
- `name` (string)
- `use_with_send_notification` (object)
- `view_url` (string)

### `pushengage_list_notifications` (~432 tokens)

List notifications

Lists push notifications on the current site, newest first, paginated (response includes `has_more`). Use this to discover notification IDs and review past or upcoming sends. Set include_analytics=true only when the user asks for stats — it costs an extra lookup and adds rolled-up counts and goal conversions to each row. Each item carries content, status, targeting criteria, and delivery stats; the criteria.audience_groups ids are reusable as the send tools' audience_groups input, and absent criteria means the notification went to all subscribers.

Input parameters:

- `exclude_tags` (array): Exclude notifications carrying any of these tags (up to 5).
- `include_analytics` (boolean): When true, merge in full delivery analytics (A/B variant totals and subscriber-timezone child sends roll up into the parent row) and goal conversions (goal_count/goal_value per row). Costs extra look…
- `limit` (integer): How many notifications to return in this page. Min 1, max 100, default 10. To browse past the first 100, increase `page` instead of asking for a larger limit.
- `page` (integer): Page number (1-indexed) for paginating beyond the first batch.
- `sent_after` (string): Only notifications sent on or after this date (YYYY-MM-DD, site timezone). Must be 2017-07-01 or later, and must be paired with sent_before.
- `sent_before` (string): Only notifications sent on or before this date (YYYY-MM-DD, site timezone). Must be paired with sent_after and be on or after it.
- `site_id` (integer): Override the currently selected site
- `status` (string): Filter by status, matching the dashboard tabs: "sent" (includes currently sending), "scheduled" (includes active and paused recurring notifications), "draft" (includes archived). "all" (default) retu…
- `tags` (array): Only notifications carrying at least one of these tags (up to 5).

Output parameters:

- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `notifications` (array)
- `page` (number)
- `total` (number)

### `pushengage_send_notification` (~798 tokens)

Send a push notification

Creates and sends a push notification on the current site. Required fields: title, message, url. Do not add optional fields (tags, image_url, utm_params, audience_groups, actions, etc.) unless the user explicitly asks for them — for example, do not infer tags from the notification topic. Delivery modes (mutually exclusive — pick AT MOST one): (a) status="schedule" + schedule_date for a one-shot scheduled send; (b) pass recurring_schedule { days, times, start_date, end_date } for a recurring/repeating notification — leave status at "sent" (default) to activate the recurrence, or use "draft" to save without activating; (c) when scheduling one-shot, optionally pass send_in_subscribers_timezone=true to deliver at the scheduled wall-clock time in each subscriber's local timezone (only when the user explicitly asks, e.g. "send at 9am in their timezone"). Otherwise the notification is sent immediately. Use status="draft" to save without sending or activating. Audience: by default sends to all subscribers. Pass `audience_groups` (array of 1-20 predefined audience-group IDs) only when the user mentions a saved/predefined audience group. When the user asks to use the site URL, call pushengage_list_sites and use the current site's site_url.

Input parameters:

- `actions` (array): Action buttons. Only when the user explicitly asks.
- `android_push` (object): Android-specific options. Requires channel_id when set. Only when the user explicitly asks.
- `audience_groups` (array): Send to one or more predefined audience groups (1-20 group IDs). Each ID refers to an audience group already configured in PushEngage. Omit this field to send to all subscribers. Only set this when t…
- `big_image_url` (string): Large hero image. Only when the user explicitly asks for a big image.
- `expire_in` (integer): Expiry in seconds (60–2419200). Only when the user explicitly asks.
- `image_url` (string): Small notification icon. Only when the user explicitly asks for an image.
- `ios_push` (object): iOS-specific options. Only when the user explicitly asks.
- `message` (string, required): Notification message body
- `recurring_schedule` (object): OPTIONAL. Turns this into a recurring notification that fires on the chosen days/times between start_date and end_date. Mutually exclusive with status="schedule", schedule_date, and send_in_subscribe…
- `schedule_date` (string): Required when status is "schedule". Format: YYYY-MM-DD HH:mm:ss in the site timezone.
- `send_in_subscribers_timezone` (boolean): Only valid when status="schedule" (and not combined with recurring_schedule). When true, schedule_date is interpreted in each subscriber's local timezone instead of the site timezone — one delivery i…
- `site_id` (integer): Override the currently selected site
- `status` (string): Send now (sent), schedule for later (schedule), or save without sending (draft)
- `tags` (array): Up to 5 tags, 36 chars each. Only when the user explicitly asks for tags.
- `title` (string, required): Notification title
- `url` (string, required): Destination URL when the subscriber clicks the notification
- `utm_params` (object): UTM tracking params. Only when the user explicitly asks.

Output parameters:

- `message` (string)
- `notification_id`
- `status`
- `title` (string)
- `url` (string)
- `view_url` (string)

### `pushengage_send_ab_notification` (~527 tokens)

Send an A/B push notification

Creates an A/B notification on the current site with two variants (variant_a and variant_b). Required: variant_a (title, message, url) and variant_b (title, message, url). By default (intelligent_ab_test omitted) both variants ship as-is to the audience — no automatic winner picking. Pass intelligent_ab_test to enable intelligent / auto-winner mode: each variant is sent to sent_limit_percentage% of subscribers, and after winner_delay_minutes the higher-CTR variant is automatically delivered to the remaining audience (up to sent_limit total). Only include intelligent_ab_test when the user explicitly asks for an intelligent / auto-winner test. Do not add other optional fields (tags, audience_groups, per-variant image_url, utm_params, actions, etc.) unless the user explicitly asks. Audience: by default sends to all subscribers. Pass `audience_groups` (1-20 predefined audience-group IDs) only when the user mentions a saved/predefined audience group. Use status="schedule" with schedule_date to schedule for later, or status="draft" to save without sending.

Input parameters:

- `audience_groups` (array): Send to one or more predefined audience groups (1-20 group IDs). Applies to both variants. Omit to send to all subscribers. Only set when the user mentions a saved/predefined audience group.
- `intelligent_ab_test` (object): OPTIONAL. Enables intelligent A/B testing: each variant is delivered to sent_limit_percentage% of subscribers, then after winner_delay_minutes the variant with the higher click-through rate is automa…
- `schedule_date` (string): Required when status is "schedule". Format: YYYY-MM-DD HH:mm:ss in the site timezone.
- `site_id` (integer): Override the currently selected site
- `status` (string): Send now (sent), schedule for later (schedule), or save without sending (draft). The API only accepts sent and scheduled in the body; draft is conveyed via the action query param while the body still…
- `tags` (array): Up to 5 tags, 36 chars each. Only when the user explicitly asks for tags.
- `variant_a` (object, required): A/B variant A. Required.
- `variant_b` (object, required): A/B variant B. Required.

Output parameters:

- `ab_notification_id`
- `notification_id`
- `status`
- `view_url` (string)

### `pushengage_get_analytics_summary` (~78 tokens)

Get all-time analytics totals

Returns the current site's all-time, site-wide totals: subscribers (current active count), notifications sent, views, clicks, and goal conversions/value. Not bounded by any date range — for trends over a period use pushengage_get_analytics_timeseries instead.

Input parameters:

- `site_id` (integer): Override the currently selected site.

Output parameters:

- `total_clicks` (number)
- `total_goal_count` (number)
- `total_goal_value` (number)
- `total_notifications_sent` (number)
- `total_subscribers` (number)
- `total_views` (number)

### `pushengage_get_analytics_timeseries` (~167 tokens)

Get analytics over a date range

Returns a time series of the current site's analytics between start_date and end_date, bucketed by group_by. Each point has subscribers gained, notifications sent, views, clicks, ctr, and unsubscribes for that bucket. Use this for trends or metrics over a period; for all-time totals use pushengage_get_analytics_summary instead.

Input parameters:

- `end_date` (string, required): End of the range (inclusive). Format: YYYY-MM-DD. Must be on or after start_date.
- `group_by` (string): How to bucket the series: one point per day, week, or month.
- `site_id` (integer): Override the currently selected site.
- `start_date` (string, required): Start of the range (inclusive). Format: YYYY-MM-DD.

Output parameters:

- `count` (number)
- `end_date` (string)
- `group_by` (string)
- `points` (array)
- `start_date` (string)

### `pushengage_list_drip_campaigns` (~222 tokens)

List drip campaigns

Lists the drip autoresponder campaigns on the current site, paginated (response includes `has_more`). Optionally filter by status (default "all" = every status), mirroring the dashboard filter tabs. Set include_analytics=true only when the user asks for stats/performance (it costs an extra analytics lookup per page). Each item then also carries an analytics object: sent, seen, clicked, ctr, goal_count, goal_value.

Input parameters:

- `include_analytics` (boolean): When true, include per-campaign analytics (sent/seen/clicked/CTR and goal count/value). Costs an extra analytics lookup, so only set it when the user asks for stats/performance.
- `limit` (integer): How many to return per page. Min 1, max 100, default 10.
- `page` (integer): Page number (1-indexed).
- `site_id` (integer): Override the currently selected site.
- `status` (string): Filter by status. "all" (default) returns every status.

Output parameters:

- `campaigns` (array)
- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `total` (number)

### `pushengage_list_triggered_campaigns` (~234 tokens)

List triggered campaigns

Lists the triggered campaigns (Price Drop / Inventory Alert / Cart Abandonment / etc.) on the current site, paginated (response includes `has_more`). Optionally filter by status (default "all" = every status), mirroring the dashboard filter tabs. Set include_analytics=true only when the user asks for stats/performance (it costs an extra analytics lookup per page). Each item then also carries an analytics object: sent, seen, clicked, ctr, goal_count, goal_value.

Input parameters:

- `include_analytics` (boolean): When true, include per-campaign analytics (sent/seen/clicked/CTR and goal count/value). Costs an extra analytics lookup, so only set it when the user asks for stats/performance.
- `limit` (integer): How many to return per page. Min 1, max 100, default 10.
- `page` (integer): Page number (1-indexed).
- `site_id` (integer): Override the currently selected site.
- `status` (string): Filter by status. "all" (default) returns every status.

Output parameters:

- `campaigns` (array)
- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `total` (number)

### `pushengage_list_rss_campaigns` (~133 tokens)

List RSS auto push campaigns

Lists the RSS auto push campaigns on the current site, paginated (response includes `has_more`). Each item includes the feed_url. Optionally filter by status (default "all" = every status), mirroring the dashboard filter tabs.

Input parameters:

- `limit` (integer): How many to return per page. Min 1, max 100, default 10.
- `page` (integer): Page number (1-indexed).
- `site_id` (integer): Override the currently selected site.
- `status` (string): Filter by status. "all" (default) returns every status.

Output parameters:

- `campaigns` (array)
- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `total` (number)

### `pushengage_list_workflows` (~219 tokens)

List workflow automations

Lists the workflow automations on the current site, paginated (response includes `has_more`). Optionally filter by status (default "all" = every status), mirroring the dashboard filter tabs. Set include_analytics=true only when the user asks for stats/performance (it costs an extra analytics lookup per page). Each item then also carries an analytics object: entered, active, completed, failed (user counts), goal_count, goal_value.

Input parameters:

- `include_analytics` (boolean): When true, include per-workflow analytics (entered/active/completed/failed users and goal count/value). Costs an extra analytics lookup; only set it when the user asks for stats.
- `limit` (integer): How many to return per page. Min 1, max 100, default 10.
- `page` (integer): Page number (1-indexed).
- `site_id` (integer): Override the currently selected site.
- `status` (string): Filter by status. "all" (default) returns every status.

Output parameters:

- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `total` (number)
- `workflows` (array)

### `pushengage_list_chat_widgets` (~196 tokens)

List chat widgets

Lists the chat widgets on the current site, paginated (response includes `has_more`). A chat widget is the floating button that surfaces support channels (WhatsApp, Messenger, Email, etc.) on the site. Each item carries the configured channels, target devices, business-hours restriction, and a country/page targeting summary.

Input parameters:

- `limit` (integer): How many chat widgets to return in this page. Min 1, max 100, default 10. To browse past the first 100, increase `page` instead of asking for a larger limit.
- `name_contains` (string): Optional case-insensitive substring filter on the widget name.
- `page` (integer): Page number (1-indexed) for paginating beyond the first batch.
- `site_id` (integer): Override the currently selected site.
- `status` (string): Filter by status. "all" (default) returns every status.

Output parameters:

- `chat_widgets` (array)
- `has_more` (boolean)
- `last_page` (number)
- `limit` (number)
- `page` (number)
- `total` (number)

## Diagnostics

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

## Score history

- 2026-08-16: 72
- 2026-08-15: 73
- 2026-08-14: 72
- 2026-08-13: 71
- 2026-08-12: 68
- 2026-08-11: 68
- 2026-08-10: 67
- 2026-08-09: 67
- 2026-08-08: 67
- 2026-08-07: 67
- 2026-08-06: 63
- 2026-08-05: 35

## Links

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