{
  "markdown": "# @pushengage/mcp\n\n[![pushengage-mcp MCP server](https://glama.ai/mcp/servers/awesomemotive/pushengage-mcp/badges/score.svg)](https://glama.ai/mcp/servers/awesomemotive/pushengage-mcp)\n\n> Manage your [PushEngage](https://www.pushengage.com/) account from any AI assistant, in plain language.\n\n\n\n[PushEngage](https://www.pushengage.com/) is a push notification platform for web push, mobile app push, WhatsApp, and on-site chat widgets, used to grow subscribers and recover revenue (cart abandonment, price drops, back-in-stock, and more).\n\nThis package is a [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server. It connects MCP-capable assistants such as Claude Desktop, Claude Code, and Cursor to your PushEngage account so you can send and schedule notifications, run A/B tests, build audiences, inspect analytics, and manage site settings just by asking, without leaving your chat.\n\nYou log in once through your browser; the assistant then acts on your behalf against whichever PushEngage site you select.\n\n## Contents\n\n- [What you can do](#what-you-can-do)\n- [Requirements](#requirements)\n- [Install](#install)\n- [First run: logging in](#first-run-logging-in)\n- [Tools](#tools)\n- [Configuration](#configuration)\n- [Security and token storage](#security-and-token-storage)\n- [Troubleshooting](#troubleshooting)\n- [License](#license)\n\n## What you can do\n\nOnce connected, just describe what you want. A few examples:\n\n**Send and schedule**\n- \"Send a notification titled 'Sale ends tonight', message 'Last call, 50% off', linking to https://example.com/sale.\"\n- \"Schedule that for 9 AM in each subscriber's local timezone.\"\n- \"Set up a recurring digest every Monday and Thursday at 8 AM through the end of the month.\"\n- \"Run an A/B test of two headlines and auto-roll-out the winner by click rate.\"\n\n**Target the right people**\n- \"Create a segment for visitors of /pricing.\"\n- \"Build an audience of gold-plan customers in the US and send only to them.\"\n\n**Understand performance**\n- \"How many subscribers do I have, and what was my click rate over the last 30 days?\"\n- \"List my active drip campaigns with their sent, seen, and clicked stats.\"\n\n**Configure a site**\n- \"Set my default notification expiry to 7 days.\"\n- \"Change my site timezone to Asia/Kolkata and turn on geolocation.\"\n\n## Requirements\n\n- A [PushEngage](https://www.pushengage.com/) account (free or paid) with at least one site.\n- Node.js 18 or newer (the assistant runs the server via `npx`).\n- An MCP-capable client (Claude Desktop, Claude Code, Cursor, or any other).\n\n## Install\n\nAdd the server to your client's MCP config. No global install is needed; `npx` fetches it on demand.\n\n### Claude Desktop (one-click bundle)\n\nThe easiest path on Claude Desktop is the MCP Bundle:\n\n1. Download the latest `pushengage-mcp-<version>.mcpb` file from the [GitHub releases page](https://github.com/awesomemotive/pushengage-mcp/releases/latest).\n2. Open it with Claude Desktop (double-click it, or drag it onto the window) and click **Install**.\n\nEverything is bundled — no JSON editing needed. The install dialog optionally lets you set the label shown on the PushEngage authorize screen and a custom token file path (for running multiple accounts).\n\n### Claude Desktop (manual config)\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or the equivalent on your platform:\n\n```json\n{\n  \"mcpServers\": {\n    \"pushengage\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@pushengage/mcp\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop. The \"pushengage\" server should appear in your tool list.\n\n### Cursor\n\nEdit `~/.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"pushengage\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@pushengage/mcp\"]\n    }\n  }\n}\n```\n\n### Other MCP clients\n\nAny client that speaks MCP over stdio works. Configure it to run the command `npx -y @pushengage/mcp`.\n\n## First run: logging in\n\nAuthentication is browser-based, so your credentials never touch the assistant.\n\n1. Ask: **\"Log me into PushEngage.\"** The server opens a browser tab to the PushEngage authorize page.\n2. Click **Authorize**. The tab confirms success and an access token is saved locally.\n3. Ask: **\"Show my PushEngage sites,\"** then **\"Use site 12345\"** to pick the site to work with. The selection is remembered across restarts.\n\nEvery site-scoped tool acts on this current site unless you pass an explicit `site_id`. When the token expires you will see an `AUTH_EXPIRED` message; just ask to log in again.\n\n## Tools\n\nAll site-scoped tools default to the current site.\n\n### Authentication and sites\n\n| Tool | Purpose |\n|---|---|\n| `pushengage_auth_login` | Opens the browser to PushEngage and stores the token on success. |\n| `pushengage_auth_status` | Shows whether you are authenticated and which site is selected. |\n| `pushengage_auth_logout` | Deletes the locally stored token. |\n| `pushengage_list_sites` | Lists the PushEngage sites you can access. |\n| `pushengage_select_site` | Sets the current site used by the other tools. |\n\n### Site settings\n\n| Tool | Purpose |\n|---|---|\n| `pushengage_get_site_details` / `pushengage_update_site_details` | Site name, URL, timezone, geolocation, and the \"Powered By PushEngage\" branding toggle. |\n| `pushengage_get_campaign_defaults` / `pushengage_update_campaign_defaults` | UTM parameters, fallback notification, fallback attributes, and default notification expiry. Updates merge over current values, so partial edits work. |\n| `pushengage_get_service_worker_settings` / `pushengage_update_service_worker_settings` | Service worker registration, sub-folder support, and the worker file path. |\n\n### Audiences\n\n| Tool | Purpose |\n|---|---|\n| `pushengage_list_segments` / `pushengage_create_segment` | URL-rule based subscriber segments. |\n| `pushengage_list_audience_groups` / `pushengage_create_audience_group` | Saved targeting groups (device, country, segment, engagement, dates, attributes). Referenced by the send tools' `audience_groups`. |\n| `pushengage_list_attributes` / `pushengage_create_attribute` | Custom subscriber attribute keys used in audience-group rules (max 50 per site). |\n\n### Campaigns and automations\n\n| Tool | Purpose |\n|---|---|\n| `pushengage_list_drip_campaigns` | Drip autoresponders. Filter by status; set `include_analytics` for per-campaign stats. |\n| `pushengage_list_triggered_campaigns` | Triggered campaigns (cart/browse abandonment, price drop, etc.). Filter by status; optional analytics. |\n| `pushengage_list_rss_campaigns` | RSS auto push campaigns. Filter by status. |\n| `pushengage_list_workflows` | Workflow automations. Filter by status; set `include_analytics` for entered/active/completed/failed and goal stats. |\n\n### Chat widgets\n\n| Tool | Purpose |\n|---|---|\n| `pushengage_list_chat_widgets` | The on-site widget that surfaces WhatsApp, Messenger, and other channels. Shows status, channels, devices, business-hours restriction, and targeting. |\n\n### Analytics\n\n| Tool | Purpose |\n|---|---|\n| `pushengage_get_analytics_summary` | Lifetime totals: subscribers, notifications sent, views, clicks, and goal count/value. |\n| `pushengage_get_analytics_timeseries` | Per-bucket (day/week/month) subscribers, sends, views, clicks, CTR, and unsubscribes over a date range. |\n\n### Sending notifications\n\n| Tool | Purpose |\n|---|---|\n| `pushengage_list_notifications` | Lists sent, scheduled, and draft notifications, newest first. Filter by status (dashboard-tab semantics), sent-date range, or tags; set `include_analytics` for rolled-up A/B and timezone-send stats. |\n| `pushengage_send_notification` | Sends or schedules a notification. One tool, three delivery modes: send now, one-shot schedule (optionally per-subscriber timezone), and recurring. Optional `audience_groups` targeting; otherwise all subscribers. |\n| `pushengage_send_ab_notification` | An A/B notification with two variants. Pass `intelligent_ab_test` to sample each variant, pick the winner by click rate after a delay, and roll the winner out to the rest. |\n\n## Configuration\n\nNo configuration is required — the server talks to PushEngage's production API out of the box. These environment variables are available for less common setups:\n\n| Env var | Default | Purpose |\n|---|---|---|\n| `PE_MCP_CLIENT_NAME` | `AI assistant` | Label shown on the authorize screen as the requesting app. Set it if you want a specific label, e.g. `\"Claude Desktop\"`. |\n| `PE_MCP_CONFIG_PATH` | `~/.pushengage/mcp.json` | Where the token is stored. Set this to run more than one PushEngage account side by side (see below). Must be an absolute path — it's used exactly as given, with no `~` expansion. |\n\n### Running multiple PushEngage accounts side by side\n\nRegister the server under two different names, each with its own `PE_MCP_CONFIG_PATH` so the tokens don't collide:\n\n```json\n{\n  \"mcpServers\": {\n    \"pushengage-client-a\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@pushengage/mcp\"],\n      \"env\": {\n        \"PE_MCP_CONFIG_PATH\": \"/Users/you/.pushengage/mcp-client-a.json\",\n        \"PE_MCP_CLIENT_NAME\": \"Claude Desktop (Client A)\"\n      }\n    },\n    \"pushengage-client-b\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@pushengage/mcp\"],\n      \"env\": {\n        \"PE_MCP_CONFIG_PATH\": \"/Users/you/.pushengage/mcp-client-b.json\",\n        \"PE_MCP_CLIENT_NAME\": \"Claude Desktop (Client B)\"\n      }\n    }\n  }\n}\n```\n\nAsk the assistant to log in under each server name separately; each authorizes against whichever PushEngage account you choose in the browser.\n\n## Security and token storage\n\n- Login is browser-based. The assistant never sees your PushEngage password.\n- The dashboard sends the token to the server as a POST request, so it never appears in a URL, browser history, or access log.\n- The token is stored at `~/.pushengage/mcp.json` with `0600` permissions (readable only by you). Its expiry is set by PushEngage and is shown by `pushengage_auth_status`.\n- To revoke it, run `pushengage_auth_logout` or log out of all sessions in PushEngage under Settings → Security.\n\n## Troubleshooting\n\n### The server won't connect at all (\"Connection closed\")\n\nIf `npx -y @pushengage/mcp` runs fine when you type it directly in a terminal, but your client (Claude Desktop, Cursor, etc.) shows the server as disconnected or logs something like `MCP error -32000: Connection closed`, this is almost always a `PATH` problem, not a bug in the server.\n\nThese clients are launched from your Dock/Finder, not from a terminal, so they never load your shell's startup files (`.zshrc`, `.zprofile`, etc). If Node was installed via a version manager (`nvm`, `fnm`, `volta`, ...), those tools only add `node`/`npx` to `PATH` from inside those startup files — so the client can't find `npx` at all, the server process never starts, and you get a generic connection error instead of a clear \"command not found.\"\n\n**Fix:** point the client at the absolute path to `npx` (this skips the `PATH` lookup for finding it) and also pass that same folder as `PATH` in `env` (so `npx`'s own `#!/usr/bin/env node` shebang can find `node` when it re-execs). Run `which npx` in your terminal to get the path, then use it in your client's config:\n\n```json\n{\n  \"mcpServers\": {\n    \"pushengage\": {\n      \"command\": \"/absolute/path/from/which-npx\",\n      \"args\": [\"-y\", \"@pushengage/mcp\"],\n      \"env\": {\n        \"PATH\": \"/absolute/folder/containing/that/npx:/usr/bin:/bin:/usr/sbin:/sbin\"\n      }\n    }\n  }\n}\n```\n\nRestart the client after editing. If `which npx` instead prints something under `/usr/local/bin` or `/opt/homebrew/bin`, your Node install isn't version-manager-based and this likely isn't your issue — check the client's own MCP logs for the actual error instead.\n\n### Other errors\n\n- **`AUTH_EXPIRED`** — your token expired. Ask the assistant to log you in again.\n- **`NO_SITE_SELECTED`** — call `pushengage_list_sites` and then ask to use one of the returned sites before using a site-scoped tool.\n- **Browser doesn't open** — this happens in headless or remote (e.g. SSH) sessions. The authorize URL is printed to the terminal running the server; open it manually.\n- **Something else** — every error the server returns starts with a `[CODE]` tag and a plain-language explanation; share that with support if you need help.\n\n## License\n\n[MIT](./LICENSE)\n",
  "bytes": 12288,
  "sha": "5b2f0976ff057837f4580b5ccd267a56502d76101d0bd80313e41f3cbf5d5039",
  "repo_slug": "awesomemotive/pushengage-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_awesomemotive_pushengage_mcp_fb3f4e0e/readme"
}