A side-by-side look at the AdLoop and Callrail 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 Callrail 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.CALLRAIL_API_KEY, CALLRAIL_API_KEY_FILE.list_accounts, list_companies, list_trackers.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Marketing | Marketing |
| Quality signal | 64/100 · Good | 60/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | API key required |
| Pricing | Not declared | BYOK (pay the provider) |
| Required env vars | None listed | CALLRAIL_API_KEYCALLRAIL_API_KEY_FILE |
| Verified owner | Community listing | Community listing |
| GitHub stars | 279 | 2 |
| Directory activity | 1 views 0 installs 0 upvotes | 3 views 0 installs 0 upvotes |
| Tools | 134 | 57 |
| Full listing | View AdLoop | View Callrail 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_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.
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": {
"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"
}
}
}
}