A side-by-side look at the Callrail MCP and PushEngage MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Callrail MCP for marketing work as a local process; choose PushEngage for marketing as a local process. You can also run both side by side in one mcpServers block.
CALLRAIL_API_KEY, CALLRAIL_API_KEY_FILE.list_accounts, list_companies, list_trackers.PE_MCP_CLIENT_NAME, PE_MCP_CONFIG_PATH.pushengage_auth_login, pushengage_auth_status, pushengage_auth_logout.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Marketing | Marketing |
| Quality signal | 60/100 · Good | 60/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | API key required | Not declared |
| Pricing | BYOK (pay the provider) | Not declared |
| Required env vars | CALLRAIL_API_KEYCALLRAIL_API_KEY_FILE | PE_MCP_CLIENT_NAMEPE_MCP_CONFIG_PATH |
| Verified owner | Community listing | Community listing |
| GitHub stars | 2 | 8 |
| Directory activity | 3 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 57 | 27 |
| Full listing | View Callrail MCP | View PushEngage |
list_accountsList CallRail accounts accessible to this API key.
Most users have one account per agency. The returned `id` is used as
`account_id` in all other tools (auto-resolved if omitted).
list_companiesList companies (client businesses) under a CallRail account.
Args:
account_id: CallRail account ID. Auto-resolves if omitted.
per_page: Page size (max 250).
status: Filter by status. Defaults to None (returns all). Common values:
'active' (excludes disabled/soft-deleted), 'disabled'.
page: 1-indexed. Agencies with more than `per_page` companies
need this to reach the rest. Previously there was no way
to fetch page 2 via this tool.
list_trackersList tracking phone numbers (trackers). Each tracker maps a pool of
phone numbers to a traffic source (Google Ads, Organic, Direct, etc.).
Args:
account_id: Auto-resolves if omitted.
company_id: Filter to one company.
per_page: Page size (max 250).
page: 1-indexed.
status: Filter by status. Defaults to None (returns all, including
soft-deleted/disabled). Common values: 'active', 'disabled'.
get_trackerGet full detail for a specific tracker.
Args:
tracker_id: 'TRK...' id.
account_id: Auto-resolves if omitted.
create_tracker⚠️ Create a new tracking phone number (tracker). **THIS COSTS MONEY.**
CallRail charges per provisioned number. Typical pricing as of 2026:
- Local numbers: ~$3/month each
- Toll-free (8XX): ~$3-5/month each
- Session pools: charged per number × pool_size (so pool_size=8 = 8x)
- Plus per-minute usage (~$0.05/min on answered calls)
Most plans bundle 5-10 numbers; provisioning beyond your bundle adds
overage charges. Some plans prorate partial-month usage, so creating
and immediately deleting can still produce a small charge depending
on your contract.
**You must pass `confirm_billing=True` to actually create.** This guards
against accidental provisioning when an AI is exploring tools.
Args:
name: Display name for the tracker (e.g. "Google Ads Call Extension").
company_id: 'COM...' id of the company this tracker belongs to.
destination_number: Where calls forward to, e.g. "+14129548337".
confirm_billing: REQUIRED. Set True to acknowledge the per-number
cost. Returns an error envelope if False (default).
type: 'source' (single number tied to one traffic source) or 'session'
(DNI pool that swaps numbers per visitor). Default 'source'.
source_type: For type='source', which traffic source. One of
VALID_SOURCE_TYPES: 'all', 'landing_url', 'landing_params',
'offline', 'web_referrer', 'direct', 'search',
'google_ad_extension' (what Google Ads call extensions use),
'mobile_ad_extension', 'google_my_business', plus the
production-observed 'facebook_all' and 'bing_all'.
Ignored for type='session'.
area_code: 3-digit area code to provision the local number from
(e.g. '412'). Ignored if `toll_free=True`.
toll_free: If True, provision an 8XX toll-free number instead.
pool_size: For type='session' only. How many numbers in the DNI
pool. CallRail requires 4-50; each pool number is billed
separately, so this multiplies your monthly cost.
whisper_message: Spoken to the agent answering the call so they know
which marketing source it came from.
recording_enabled: Record the call audio. Default True.
greeting_text: Optional automated greeting text-to-speech.
sms_enabled: Allow this number to receive/send SMS. Default True.
account_id: Auto-resolves if omitted.
Returns the created tracker including its newly-provisioned tracking_numbers.
update_trackerUpdate a tracker's mutable settings: name, destination, whisper, greeting, SMS.
Args:
tracker_id: 'TRK...' id.
account_id: Auto-resolves if omitted.
name: New display name.
destination_number: Where calls forward (e.g. "+14129548337"). Updates
the call_flow's destination too.
whisper_message: New whisper text.
greeting_text: New automated greeting. **If supplied, you must also
supply destination_number**. CallRail's PUT /trackers replaces the
entire call_flow object, so updating only greeting_text would
silently zero out the destination, breaking the tracker.
sms_enabled: Toggle SMS on/off.
Field-level rules:
- `name`, `destination_number`, `whisper_message`, `greeting_text`
must be non-empty strings if provided. Pass `None` (the default)
to leave a field unchanged.
NOTE: Setting `status` via this PUT is silently ignored by CallRail.
To disable a tracker, use `delete_tracker(tracker_id)` (soft-delete /
disabled, keeps history). To permanently remove, contact CallRail support.
delete_trackerDelete (disable) a tracker. Soft-removes it from active trackers; the
tracker keeps its call history but stops receiving new calls. The
underlying phone number is released.
Args:
tracker_id: 'TRK...' id.
account_id: Auto-resolves if omitted.
Returns: An object with `deleted: True`, `tracker_id`, and `response`
(CallRail's body, which on success contains the disabled tracker record
including `disabled_at` timestamp). Empty object if CallRail returned 204.
list_callsList calls. Paginated. Filterable by company, date window, and
answer status.
Args:
account_id: Auto-resolves if omitted.
company_id: Filter to one company. Omit for all companies.
days: Lookback in days (default 7). Ignored if `start_date` provided.
start_date: 'YYYY-MM-DD'.
end_date: 'YYYY-MM-DD' (defaults to today).
answer_status: Server-side filter. One of 'answered', 'missed',
'voicemail'. This is CallRail's real filter parameter.
answered: DEPRECATED alias kept for backwards compatibility.
'true' maps to answer_status='answered', 'false' to 'missed'.
(CallRail has no `answered` query param; passing it used to be
silently ignored, so results were unfiltered.)
source: CallRail has NO server-side source filter, so this is applied
CLIENT-SIDE to the current page only: the `calls` array is
filtered by exact, case-insensitive match on each call's `source`
field. `total_records`/`total_pages` in the response still
describe the UNFILTERED query. See `source_filter` in the
response for what was actually applied. For source breakdowns
prefer `call_stats(group_by='source')`.
per_page: Max 250.
page: 1-indexed.
fields: Comma-separated additional fields to include, e.g.
'company_name,source_name,keywords,landing_page_url,device_type,
first_call,value,tags,note,gclid,fbclid,utm_source,utm_medium,
utm_campaign,utm_content,utm_term,referrer_domain'.
get_callGet full detail for a specific call.
Args:
call_id: CallRail call id (prefix 'CAL...').
account_id: Auto-resolves if omitted.
fields: Comma-separated extra fields (see list_calls for common names).
call_summarySummarize calls over a date window.
Returns counts: total, answered/missed, first-time/repeat callers, total
duration, and breakdowns by `source` and `source_name`. Useful for
weekly/monthly rollups without pulling every call into context.
Note: requires `days>=1` or an explicit `start_date`. Without a window
this would paginate the entire account history (potentially 50+ pages
of 250 calls each), which is rarely what callers want.
list_form_submissionsList form submissions captured by CallRail's Form Tracking.
Paginated. Filterable by company and date window.
Args:
account_id: CallRail account ID. Auto-resolves if omitted.
company_id: Filter to one company. Omit for all companies.
days: Lookback in days (default 7). Ignored if `start_date` provided.
start_date: 'YYYY-MM-DD'.
end_date: 'YYYY-MM-DD' (defaults to today).
per_page: Page size (max 250).
page: 1-indexed.
fields: Comma-separated additional fields to include, e.g.
'company_name,form_data,referrer,landing_page_url,source,
utm_source,utm_medium,utm_campaign,utm_content,utm_term,
gclid,fbclid,form_url,form_name'.
Returns:
JSON string with `page`, `per_page`, `total_pages`,
`total_records`, and `form_submissions[]`. Each submission has
id ('FOR...'), submitted_at, customer details (if captured),
and a `form_data` dict keyed by form field name.
list_text_messagesList SMS/text message conversations sent to or received via
CallRail trackers. Paginated. Filterable by company and date window.
Receiving SMS works on standard accounts. Outbound SMS sending
requires CallRail's A2P SMS API permission (returns 403 otherwise);
see `create_text_message` notes if available on your plan.
Args:
account_id: CallRail account ID. Auto-resolves if omitted.
company_id: Filter to one company. Omit for all companies.
days: Lookback in days (default 7). Ignored if `start_date` provided.
start_date: 'YYYY-MM-DD'.
end_date: 'YYYY-MM-DD' (defaults to today).
per_page: Page size (max 250).
page: 1-indexed.
Returns:
JSON string with `page`, `per_page`, `total_pages`,
`total_records`, and `conversations[]`. Each conversation has
a list of inbound + outbound messages, customer phone number,
the tracking number used, and timestamps.
pushengage_auth_loginOpens 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.pushengage_auth_statusReturns 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.pushengage_auth_logoutRevokes 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.pushengage_list_sitesLists 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.pushengage_select_siteSets 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.pushengage_get_site_detailsReturns 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.pushengage_update_site_detailsUpdates 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.pushengage_get_campaign_defaultsReturns 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.pushengage_update_campaign_defaultsUpdates 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.pushengage_get_service_worker_settingsReturns 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").pushengage_update_service_worker_settingsUpdates 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.pushengage_list_segmentsLists 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.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": {
"pghdma-callrail-mcp": {
"command": "uvx",
"args": [
"callrail-mcp"
],
"env": {
"CALLRAIL_API_KEY": "YOUR_CALLRAIL_API_KEY_HERE",
"CALLRAIL_API_KEY_FILE": "YOUR_CALLRAIL_API_KEY_FILE_HERE"
}
}
}
}
{
"mcpServers": {
"pushengage": {
"command": "npx",
"args": [
"-y",
"@pushengage/mcp"
],
"env": {
"PE_MCP_CLIENT_NAME": "YOUR_PE_MCP_CLIENT_NAME_HERE",
"PE_MCP_CONFIG_PATH": "YOUR_PE_MCP_CONFIG_PATH_HERE"
}
}
}
}