CallRail MCP
PYPI · CALLRAIL-MCP
CallRail REST API v3: 57 tools for calls, leads, trackers, tags, users, and agency reporting.
Available components
Last scanned (12 hours ago)
Scores higher than 69% of PyPI servers
Category CRM and Sales
Recent critical change
GHSA-6q48-6c7w-9gw2 affects this package (21 Oct 2026). See the changelog before you install this server.
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. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 32 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to pghdma/callrail-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 26 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability58
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 14990 tokens (~262/item across 57 items; 57 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management77
- Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 57 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Checks we ran (15)
- Known CVEs
- Install scripts
- Dependency health
- Source repository
- Provenance
- License
- Maintenance
- Security disclosure
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Checks we could not complete (1)
These are gaps on our side, not findings about this package. We only credit what we can confirm, so a category made up entirely of them scores 0.
- Malware scan in Supply Chain SecurityMalware scan not yet available for this package.
Does not apply to this package (2)
- Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
- Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 −14
- Malware scan: pass → unverified ▼ security
- 3 Nov 26 −4
- Stability: fail → 0.70 functional
- 25 Oct 26 +1
- Security disclosure: unverified → pass ▲ functional
- 24 Oct 26 −1
- Security disclosure: pass → unverified ▼ functional
- 22 Oct 26 +90
- GHSA-6q48-6c7w-9gw2 no longer affects this package ▲ security
- Known CVEs: fail → pass ▲ security
- Score status: failed → scored ▲ functional
- 21 Oct 26 −90
- GHSA-6q48-6c7w-9gw2 affects this package: none ▼ critical
- Known CVEs: pass → fail ▼ critical
- Score status: scored → failed ▼ critical
- 17 Oct 26 +2
No change was recorded against any check on this day. Stability & Change Management went from 82 to 99.
- 16 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 79 to 82.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed pypi/callrail-mcp@1.3.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | pghdma/callrail-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/pghdma/callrail-mcp/.github/workflows/publish.yml@refs/tags/v1.3.1 |
| Rekor log index | 3169782742 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:ffd788688cfc2fa1d5d25b7204c7680c9c2344bb16efd48996db209c2e0198d2 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | Known build tool | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 32 packages
| Packages resolved | 32 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_call_tags ~252
Append tags to a call WITHOUT replacing existing ones. Reads the call's current tags first, merges the new ones in, then PUTs the combined list. Use this when you want to add labels (e.g. 'lead', 'spam', 'follow-up') without losing prior tags. To fully replace tags, use `update_call(tags=[...])` instead. Auto-creates company-level tags for any name not already in the system (CallRail's default behavior). Empty/whitespace-only entries are silently filtered, so `add_call_tags(['', 'lead'])` won't 400 (only `'lead'` is sent). Args: call_id: 'CAL...' id. tags: Tag names to add. Strings only; non-strings are dropped with a warning. De-duplicated. Max 100 tags per request. account_id: CallRail account ID. Auto-resolves if omitted. Returns: JSON string with the updated call object (showing the merged tag list). Errors if no valid tags remain after cleaning.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| call_id | string | yes | – |
| tags | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
bulk_update_calls ~659
Apply the same update to every call matching a filter. Useful for: "tag every Bing call this month as low-priority", "mark all <30s unanswered calls from this number as spam", "add a note to every call from a specific landing page". Replaces dozens of sequential `update_call` invocations with one tool call. **Safety:** `dry_run=True` by default, so this tool returns a preview of which calls WOULD be updated without actually writing. Pass `dry_run=False` to commit. Hard cap of 500 calls per invocation to prevent runaway bulk operations. Args: company_id, days: filter (same semantics as `list_calls`). At least one filter must be provided to avoid "update everything ever". answer_status: server-side filter. One of 'answered', 'missed', or 'voicemail'. 'missed' includes calls that reached voicemail. answered: DEPRECATED alias ('true' -> answered, 'false' -> missed). Before v1.2.0 this was forwarded as an `answered` query param that CallRail does not implement: the filter was silently dropped, so a commit run updated EVERY call in the window. source: applied CLIENT-SIDE (exact, case-insensitive match on each call's `source` field) because CallRail has no server-side source filter. Matching happens before the 500-cap is applied. set_tags_add: tag names to ADD to each matched call (preserves existing tags). Mutually compatible with other set_* fields. set_note: note text to set on each matched call (replaces existing). set_lead_status: e.g. 'good_lead', 'not_a_lead'. set_spam: True to mark spam. NOTE: CallRail does not support un-marking spam via the API, so set_spam=False is rejected. dry_run: If True (default), return preview only. False = commit. account_id: Auto-resolves if omitted. Returns: - If dry_run: `{"dry_run": true, "matched": N, "would_update_calls": [...], "set_fields": {...}}` - Else: `{"dry_run": false, "matched": N, "updated":…
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| answer_status | – | – | – |
| answered | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| dry_run | boolean | – | – |
| set_lead_status | – | – | – |
| set_note | – | – | – |
| set_spam | – | – | – |
| set_tags_add | – | – | – |
| source | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
call_eligibility_check ~310
Audit whether a specific call is/was eligible to count as a Google Ads conversion. Useful for "where did my conversion go" debugging. Checks: 1. Did the call have a `gclid`? (Required for CallRail to upload to Google Ads as a UPLOAD_CLICKS Phone Call conversion.) 2. Was the call answered? (Most integrations skip unanswered.) 3. Did duration meet Google Ads' minimum? (Default 60s; configurable per conversion action in Google Ads UI.) 4. Is the call from a Google source? Detection uses CallRail's internal `source` slug (e.g. `google_paid`, `google_my_business`) + presence of gclid, NOT the user-editable `source_name` display string (which can mislead, e.g. "Bing Ads (Google legacy import)" would substring-match as Google but is clearly Bing). Args: call_id: 'CAL...' id. google_ads_min_duration_seconds: Threshold to check duration against. Defaults to 60 (Google's UI default). Override if you've lowered it on a specific conversion action. account_id: Auto-resolves if omitted. Returns: Verdict + each criterion's pass/fail + suggested remediation when eligibility fails.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| call_id | string | yes | – |
| google_ads_min_duration_seconds | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
call_stats ~502
Server-side call aggregation via CallRail's /calls/summary.json. One request instead of paginating every call. Prefer this over `call_summary` (which fetches and counts calls client-side) when you only need grouped totals. `call_summary` remains useful for metrics this endpoint doesn't expose (first-time vs repeat split, per-source-name breakdown, exact duration sums). Args: group_by: Dimension to group by. One of: 'source', 'keywords', 'campaign', 'referrer', 'landing_page', 'company'. days: Lookback (default 30). Ignored if `start_date` given. start_date / end_date: 'YYYY-MM-DD'. Explicit dates win. company_id: Filter to one company. fields: Comma-separated metrics, e.g. 'total_calls,missed_calls,answered_calls,first_time_callers, average_duration,leads'. Default: total_calls only. account_id: Auto-resolves if omitted. Returns: JSON string with `start_date`, `end_date`, `time_zone`, `total_results` and `grouped_results[]` ({key, <metrics>}). Server-side filters (documented, live-verified 2026-10-05): `answer_status` ('answered' | 'missed' | 'voicemail'; missed includes voicemail), `direction`, `device`, `lead_status` ('good_lead' | 'not_a_lead' | 'not_scored'), `first_time_callers`, `min_duration` / `max_duration` (seconds), `tags` (any of), `tracker_ids`, `search` (phone fragment, name, note, source) and `time_zone` (IANA; also sets "today" for `days`). `fields` is validated against VALID_CALL_STATS_FIELDS.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| answer_status | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| device | – | – | – |
| direction | – | – | – |
| end_date | – | – | – |
| fields | – | – | – |
| first_time_callers | – | – | – |
| group_by | string | – | – |
| lead_status | – | – | – |
| max_duration | – | – | – |
| min_duration | – | – | – |
| search | – | – | – |
| start_date | – | – | – |
| tags | – | – | – |
| time_zone | – | – | – |
| tracker_ids | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
call_summary ~231
Summarize 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. Counting rule: `missed` includes calls that reached voicemail, exactly as CallRail's own `answer_status=missed` filter and dashboard do, even though CallRail marks those calls `answered=true`. `voicemail` reports that subset separately. 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. `time_zone` (IANA) aligns CallRail's day boundaries with the window and is used to compute "today" for `days`.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| end_date | – | – | – |
| start_date | – | – | – |
| time_zone | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
call_timeseries ~513
Call volume over time via CallRail's /calls/timeseries.json. One request for a trend line instead of client-side bucketing. CallRail refuses any request whose result set would exceed 200 data points. With the default daily interval that caps the window at ~200 days; use `interval='week'` or `'month'` for longer ranges. This tool checks the limit before sending so you get a clear message instead of a raw 400. Args: days: Lookback (default 30). Ignored if `start_date` given. start_date / end_date: 'YYYY-MM-DD'. Explicit dates win. company_id: Filter to one company. fields: Comma-separated metrics. Valid: total_calls, missed_calls, answered_calls, abandoned_calls, first_time_callers, average_duration, formatted_average_duration, leads. interval: Bucket size. One of 'hour', 'day', 'week', 'month', 'year'. Defaults to CallRail's own choice (daily) when omitted. account_id: Auto-resolves if omitted. Returns: JSON string with `total_results` and `data[]`, one entry per bucket ({key/date, <metrics>}). Server-side filters (documented, live-verified 2026-10-05): `answer_status` ('answered' | 'missed' | 'voicemail'; missed includes voicemail), `direction`, `device`, `lead_status` ('good_lead' | 'not_a_lead' | 'not_scored'), `first_time_callers`, `min_duration` / `max_duration` (seconds), `tags` (any of), `tracker_ids`, `search` (phone fragment, name, note, source) and `time_zone` (IANA; also sets "today" for `days`). `fields` is validated against VALID_CALL_STATS_FIELDS.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| answer_status | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| device | – | – | – |
| direction | – | – | – |
| end_date | – | – | – |
| fields | – | – | – |
| first_time_callers | – | – | – |
| interval | – | – | – |
| lead_status | – | – | – |
| max_duration | – | – | – |
| min_duration | – | – | – |
| search | – | – | – |
| start_date | – | – | – |
| tags | – | – | – |
| time_zone | – | – | – |
| tracker_ids | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
compare_periods ~192
Compare current N-day window vs the previous N-day window. Returns per-company minute / call deltas + agency-wide totals. Useful for "is Malick growing?", "did we lose Stewart traffic this month?", catching invoice surprises before they hit. Args: days: Window length on each side (default 30 = roughly one cycle). Cap: 365 (don't ask for "5-year delta", likely a typo). account_id: Auto-resolves if omitted. Returns: A breakdown showing current vs previous totals, % deltas, and per-company growth/shrink. Sorted by absolute minute change. Implementation: pulls call data for both windows in one tool call. Tracker counts use current-snapshot for both periods (CallRail doesn't expose historical tracker counts); only minute deltas reflect actual period-over-period change.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| days | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_company ~483
Create a new company (client) under the account. Useful for new-client onboarding. CallRail bills per number, not per company: creating a company is free; provisioning trackers under it is what costs money (see `create_tracker`). CallRail's POST /companies accepts only `name` and `time_zone`. Every feature toggle is a PUT field, so when any toggle is given this tool creates the company and then applies the toggles with a second call; the response carries `settings_applied` (or `settings_not_applied` plus `api_warnings` if that second call failed). Args: name: Display name (e.g. "Smith & Co Roofing"). Required. time_zone: IANA TZ. Default 'America/New_York' (matches your existing companies). Common: 'America/Los_Angeles', 'America/Chicago', 'America/Denver'. callscore_enabled: CallRail CallScore AI scoring (paid feature). Pass None (default) to inherit the account default. lead_scoring_enabled: NOT settable via the API (read-only field); passing it returns an error. Toggle it in the CallRail UI. swap_exclude_jquery: Deprecated by CallRail, has no effect. Not sent; reported under `api_warnings`. callscribe_enabled: Conversation Intelligence transcripts (paid). None=inherit. keyword_spotting_enabled: Deprecated by CallRail, has no effect. Not sent; reported under `api_warnings`. form_capture: Enable CallRail Form Tracking (sent as the PUT field `external_form_capture`). None=inherit. account_id: Auto-resolves if omitted. Note: Optional booleans default to None (inherit account-level defaults) rather than False. Sending `False` for a paid feature on an account that has it enabled would actively DISABLE it, almost never the caller's intent on a fresh-create.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| callscore_enabled | – | – | – |
| callscribe_enabled | – | – | – |
| form_capture | – | – | – |
| keyword_spotting_enabled | – | – | – |
| lead_scoring_enabled | – | – | – |
| name | string | yes | – |
| swap_exclude_jquery | – | – | – |
| time_zone | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_form_submission ~481
Manually create a form submission (e.g. backfill an offline lead). Useful when you receive a lead through a non-CallRail-tracked channel (paper form, in-person, etc.) and want it visible in CallRail with proper attribution + lead-status workflow. CallRail's POST /form_submissions accepts exactly: company_id, form_url, form_data, and EITHER session_id OR all three of referrer / referring_url / landing_page_url. It parses phone numbers out of form_data to find or create the person, so put the customer's phone, name and email inside form_data (there are no customer_* body fields). Args: company_id: 'COM...' id. Required. form_url: URL of the page the form was submitted to. Required. form_data: Dict of form-field values, e.g. `{"name": "Kevin", "email": "k@x.com", "phone": "412-555-1234"}`. Required and non-empty. referrer / referring_url / landing_page_url: Attribution. All three are required unless `session_id` is given. Use the original web context if known, or "(direct)" / "https://offline" placeholders for in-person leads. session_id: 'SES...' id of an existing web session; replaces the three attribution fields. note, tags, value, lead_status: Lead-management fields. The POST endpoint does not accept them, so they are applied with a follow-up PUT; the response reports `lead_fields_applied` or `lead_fields_not_applied` (plus `api_warnings`). `value` is sent as a currency string ("12.50"); `lead_status` is 'good_lead' or 'not_a_lead'. account_id: Auto-resolves if omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | string | yes | – |
| form_data | object | yes | – |
| form_url | string | yes | – |
| landing_page_url | – | – | – |
| lead_status | – | – | – |
| note | – | – | – |
| referrer | – | – | – |
| referring_url | – | – | – |
| session_id | – | – | – |
| tags | – | – | – |
| value | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_notification ~327
Create a notification rule (who gets pinged on which event). Args: alert_type: Which calls trigger the rule. One of 'all', 'first_call', 'missed_and_vm', 'vm_only'. Required when call_enabled is true; omit for SMS-only rules. user_id: 'USR...' id of the user being notified. If neither user_id nor email is given, CallRail assigns the rule to the user who owns the API key. company_id, tracker_id: Optional scope filters. send_email / send_desktop / send_push: Channel toggles. call_enabled / sms_enabled: Trigger toggles; set call_enabled for call alerts and sms_enabled for text alerts. email: Creates an email-only recipient instead of a user. CallRail requires a company_id or tracker_id with it and allows only send_email. agent_id: 'USR...' id of the agent whose calls trigger the rule. name: Accepted for backward compatibility and NOT sent: CallRail generates the name from the configuration. account_id: Auto-resolves if omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| agent_id | – | – | – |
| alert_type | – | – | – |
| call_enabled | – | – | – |
| company_id | – | – | – |
| – | – | – | |
| name | – | – | – |
| send_desktop | boolean | – | – |
| send_email | boolean | – | – |
| send_push | boolean | – | – |
| sms_enabled | – | – | – |
| tracker_id | – | – | – |
| user_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_outbound_call ~440
Place an outbound call. THIS ACTUALLY DIALS REAL PHONES. CallRail dials `business_phone_number` FIRST; once that leg is answered it dials `customer_phone_number` and bridges the two. Both legs cost minutes against your bundle. Misuse can constitute unlawful telemarketing, so verify consent. US and Canadian numbers only (CallRail does not support outbound to the UK or Australia via this endpoint). **You must pass `confirm_dialing=True` to actually place the call.** Args: caller_id: The number shown to the recipient. Must be one of your CallRail tracking numbers or a verified Outbound Caller ID. E.164 format. business_phone_number: The FIRST leg CallRail dials (your agent's phone). E.164 format. customer_phone_number: The SECOND leg, bridged in once the business leg answers. E.164 format. confirm_dialing: REQUIRED. Set True to actually dial. Returns an error envelope if False (default). recording_enabled: Record this call. outbound_greeting_text: Text-to-speech greeting played to the customer. outbound_greeting_recording_url: Public URL of an audio greeting, used instead of `outbound_greeting_text`. agent_id: 'USR...' id of the user to assign to the call. account_id: Auto-resolves if omitted. Returns: The call object CallRail creates (id, etc.). NOTE (v1.2.0): earlier versions sent `{"from", "to"}`, which are not fields CallRail accepts, so every call failed. The parameter names above match the documented request body.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| agent_id | – | – | – |
| business_phone_number | string | yes | – |
| caller_id | string | yes | – |
| confirm_dialing | boolean | – | – |
| customer_phone_number | string | yes | – |
| outbound_greeting_recording_url | – | – | – |
| outbound_greeting_text | – | – | – |
| recording_enabled | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_tag ~215
Create a new tag, scoped to one company or to the whole account. Args: name: Tag display name. company_id: 'COM...' id. Required for company-level tags (the default). Omit it when `tag_level='account'`. account_id: Auto-resolves if omitted. color: One of the 24 CallRail-supported colors (see VALID_TAG_COLORS): gray1-2, blue1-2, cyan1-2, purple1-2, pink1-4, red1-2, orange1-4, yellow1-2, green1-4. If omitted, CallRail defaults to 'gray1'. tag_level: 'company' (default) or 'account'. Account-level tags apply to every company and can only be created by administrators.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| color | – | – | – |
| company_id | – | – | – |
| name | string | yes | – |
| tag_level | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_tracker ~895
⚠️ 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. whispe…
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| area_code | – | – | – |
| campaign_name | – | – | – |
| company_id | string | yes | – |
| confirm_billing | boolean | – | – |
| destination_number | string | yes | – |
| greeting_text | – | – | – |
| landing | – | – | – |
| name | string | yes | – |
| pool_size | – | – | – |
| recording_enabled | boolean | – | – |
| referrer | – | – | – |
| search_engine | – | – | – |
| search_type | – | – | – |
| sms_enabled | boolean | – | – |
| source_type | string | – | – |
| swap_targets | – | – | – |
| toll_free | boolean | – | – |
| type | string | – | – |
| whisper_message | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
create_user ~211
Invite a new user. CallRail emails them an account-creation link. Args: email: Recipient email. CallRail sends an invite. first_name, last_name: Display name. role: Default 'reporting' (read-only). Documented values: 'admin', 'manager', 'reporting'. CallRail's docs also mention legacy "notification" users, so unknown values are passed through with a warning instead of rejected. company_ids: List of 'COM...' company IDs the user can access. REQUIRED by CallRail for manager and reporting roles (sent as the documented `companies` field). Admins see every company. account_id: Auto-resolves if omitted. Note: This sends an invitation email. Don't run experimentally.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_ids | – | – | – |
| string | yes | – | |
| first_name | string | yes | – |
| last_name | string | yes | – |
| role | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_company ~94
Soft-delete a company. Status flips to 'disabled', records retained. Mirrors `delete_tracker` semantics: CallRail's DELETE on companies is a soft-delete. Use `list_companies(status="active")` to filter out disabled companies after deletion. Returns: `{"deleted": True, "company_id": ..., "response": ...}`.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_notification ~124
Delete a notification rule. The rule is gone. To keep but mute it, prefer `update_notification(send_email=False, send_desktop=False, send_push=False)`. Args: notification_id: Notification rule ID. account_id: CallRail account ID. Auto-resolves if omitted. Returns: JSON string `{"deleted": True, "notification_id": ..., "response": ...}`. The `response` mirrors CallRail's body (often empty on 204).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| notification_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_tag ~163
Delete a tag definition from the account. Removes it from any calls or form submissions that had it applied. This is a HARD delete; the tag is gone permanently along with its historical applications. To preserve history, prefer renaming or disabling via `update_tag` instead. Args: tag_id: Numeric tag ID. CallRail tag IDs are integers (NOT the string-prefixed format other entities use). Must match ^[0-9]+$ (string or numeric forms accepted). account_id: CallRail account ID. Auto-resolves if omitted. Returns: JSON string `{"deleted": True, "tag_id": ...}` on success.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| tag_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_tracker ~129
Delete (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.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
delete_user ~79
Remove a user from the account. CallRail's DELETE on users is typically a hard-remove (unlike companies/trackers which soft-delete). The user loses access immediately. Returns: `{"deleted": True, "user_id": ..., "response": ...}`.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| user_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
form_stats ~243
Server-side form-submission totals via /forms/summary.json. Args: days: Lookback (default 30). Ignored if `start_date` given. start_date / end_date: 'YYYY-MM-DD'. Explicit dates win. company_id: Filter to one company. account_id: Auto-resolves if omitted. Returns: JSON string with `start_date`, `end_date`, `time_zone`, and `total_results` (e.g. {"total_forms": N}). `group_by` ('source' | 'keywords' | 'campaign' | 'referrer' | 'landing_page' | 'form_name' | 'company') returns `grouped_results`; `fields` (comma-separated) selects additional summary fields; `lead_status`, `tags` and `time_zone` filter as on `call_stats`.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| end_date | – | – | – |
| fields | – | – | – |
| group_by | – | – | – |
| lead_status | – | – | – |
| start_date | – | – | – |
| tags | – | – | – |
| time_zone | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_call ~77
Get 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).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| call_id | string | yes | – |
| fields | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_call_page_views ~181
Get the visitor's page-view history behind a call: which pages they browsed (with timestamps) before and around dialing. Pairs with `call_eligibility_check` for conversion debugging: shows the actual session journey that led to the call. Args: call_id: 'CAL...' id. account_id: Auto-resolves if omitted. per_page: Page size (max 250). page: 1-indexed. Returns: JSON string with `page_views[]` (paginated). Only available for calls placed to session trackers (a CallRail restriction). `time_zone` (IANA) localizes the timestamps.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| call_id | string | yes | – |
| page | integer | – | – |
| per_page | integer | – | – |
| time_zone | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_call_recording ~199
Get the recording URL for a call. CallRail documents the link as good for at least 24 hours but not guaranteed forever; HIPAA accounts receive a temporary URL that expires in about 24 hours. Play or download it promptly rather than storing the link. Recording must be enabled on the company (CallRail UI > Settings > Account). Calls placed BEFORE recording was enabled have no recording even if it's enabled now; CallRail does not retroactively record. Args: call_id: 'CAL...' id. account_id: CallRail account ID. Auto-resolves if omitted. Returns: JSON string with `url` (audio URL, typically MP3) plus recording metadata. Empty `url` typically means recording was disabled at call time, or the user opted out via the call-flow recording disclaimer.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| call_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_call_transcript ~261
Get the transcript and conversation-intelligence fields for a call. Requests the documented field selection on GET /calls/{id}.json (`transcription`, `conversational_transcript`, `call_summary`, `call_highlights`, `keywords_spotted`, `sentiment`, `speaker_percent`) and falls back to the older /calls/{id}/transcription.json endpoint when those fields come back empty. Requires CallRail Conversation Intelligence (CallScribe) to have been enabled on the company at the time of the call; CallRail does not retroactively transcribe. Since CallRail's 2026-05-21 API change the transcript fields return null without a Premium Conversation Intelligence subscription even when a transcript exists in the UI, so an empty result is reported with a hint that names both causes. Args: call_id: 'CAL...' id. account_id: CallRail account ID. Auto-resolves if omitted. Returns: JSON string with `id` plus whichever of the fields above CallRail returned (`conversational_transcript` is a list of {speaker, phrase, start} turns).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| call_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_company ~117
Get full detail for one company. Args: company_id: 'COM...' id. account_id: Auto-resolves if omitted. fields: Optional attributes (comma-separated), for example 'verified_caller_ids'. Note: Returns the disabled record (with `status: "disabled"`, `disabled_at` timestamp) for soft-deleted companies, NOT 404. Check the `status` field if you need to distinguish.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | string | yes | – |
| fields | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_form_submission ~134
Get full detail for one form submission, including all submitted field data. Useful for retrieving the original form payload after seeing a submission ID via `list_form_submissions` or in a webhook callback. Args: submission_id: 'FOR...' id. account_id: CallRail account ID. Auto-resolves if omitted. Returns: JSON string with the form submission: submitted_at, customer details, source/UTM attribution, landing page URL, referrer, and `form_data` dict keyed by form field name.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| submission_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_integration ~69
Get full detail for one integration. Args: integration_id: Numeric integration id (from list_integrations). account_id: Auto-resolves if omitted. fields: Optional attributes (comma-separated).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| fields | – | – | – |
| integration_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_lead_timeline ~176
Get a lead's full cross-channel activity timeline: every call, form submission, and text thread from that person in one response, with first-touch/last-touch attribution. This replaces the manual "search calls by number + search forms by email" dance when reconstructing a customer's history. Args: lead_id: 'PER...' lead id (from `list_leads`). account_id: Auto-resolves if omitted. per_page: Timeline page size (max 250). page: 1-indexed. Returns: JSON string with `lead` (the person record) and `timeline[]` (chronological interaction entries, paginated).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| lead_id | string | yes | – |
| page | integer | – | – |
| per_page | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_sms_thread ~87
Get one SMS thread's lead-management record (notes, value, tags, lead_qualification, state). For the message transcript itself use `get_text_message` with the conversation id. Args: thread_id: Thread id (from `list_sms_threads`). account_id: Auto-resolves if omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| thread_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_tag ~49
Get full detail for one tag. Args: tag_id: Numeric tag id. account_id: Auto-resolves if omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| tag_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_text_message ~72
Get full detail for one SMS conversation, including all messages. Args: conversation_id: Short alphanumeric conversation id (e.g. '8hw3p'). Returned by `list_text_messages` as `id` on each conversation.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| conversation_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_tracker ~52
Get full detail for a specific tracker. Args: tracker_id: 'TRK...' id. account_id: Auto-resolves if omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_user ~117
Get full detail for one user on the account. Args: user_id: 'USR...' id. account_id: CallRail account ID. Auto-resolves if omitted. Returns: JSON string with the user object: id, email, first_name, last_name, role ('admin' | 'manager' | 'reporting'), accepted_at (null if invitation pending), time_zone, and `company_ids[]` the user can access.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| user_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_accounts ~94
List 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, or pinned with the CALLRAIL_ACCOUNT_ID environment variable). `fields` (comma-separated) adds optional attributes such as 'numeric_id', the number shown in CallRail app URLs.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_calls ~747
List 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. Note that 'missed' includes calls that reached voicemail (CallRail's own definition) and 'voicemail' selects only that subset. 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'. Server-side filters (documented, live-verified 2026-10-05): `search` matches business_phone_number, customer_name, customer_number, note, source and tracking_phone_number (any fragment of a phone number works); `direction` ('inbound' | 'outbound'); `device` ('desktop' | 'mobile'); `call_type` ('first_call' | 'missed' | 'voicemails' | 'inbound…
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| answer_status | – | – | – |
| answered | – | – | – |
| call_type | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| device | – | – | – |
| direction | – | – | – |
| end_date | – | – | – |
| fields | – | – | – |
| lead_status | – | – | – |
| order | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| search | – | – | – |
| sort | – | – | – |
| source | – | – | – |
| start_date | – | – | – |
| tags | – | – | – |
| time_zone | – | – | – |
| tracker_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_companies ~210
List 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. `search` matches the company name; `fields` (comma-separated) adds optional attributes, for example 'verified_caller_ids' (the readable list of outbound caller IDs, which the caller_ids endpoint itself gates behind a permission).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| fields | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| search | – | – | – |
| status | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_form_submissions ~451
List 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. Filters: `lead_status` ('good_lead' | 'not_a_lead' | 'not_scored'), `tags` (any of), `person_lead` (only submissions linked to a lead), `sort` ('submitted_at' | 'form_url'; 'created_at' is being deprecated by CallRail) with `order` ('asc' | 'desc'), and `time_zone` (IANA). Requires form tracking to be enabled on at least one company; otherwise CallRail returns 403 (the error carries a hint).
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| end_date | – | – | – |
| fields | – | – | – |
| lead_status | – | – | – |
| order | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| person_lead | – | – | – |
| sort | – | – | – |
| start_date | – | – | – |
| tags | – | – | – |
| time_zone | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_integrations ~141
List integrations attached to one company (GMB, Google Ads, Facebook, Slack, Webhooks, etc.). Args: company_id: 'COM...' id. **Required**: the integrations endpoint returns 400 without it (account-level listing isn't supported). per_page: Page size (max 250). page: 1-indexed. account_id: Auto-resolves if omitted. `fields` (comma-separated) adds optional attributes to each integration.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | string | yes | – |
| fields | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_leads ~227
List leads (unique people) across calls, forms, and texts. A lead is CallRail's deduplicated person record: one entry per customer regardless of how many times they called / submitted / texted. Use `get_lead_timeline` for a lead's full cross-channel history. Args: account_id: Auto-resolves if omitted. company_id: Filter to one company. per_page: Page size (max 250). page: 1-indexed. Returns: JSON string with `page`, `per_page`, `total_pages`, `total_records`, and `leads[]`. Each lead has id ('PER...'), name, phone, email, company_id, company_name, created_at. `sort` ('created_at' | 'name' | 'email') with `order` ('asc' | 'desc').
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| order | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| sort | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_notifications ~203
List notification rules on the account. Args: company_id: Applied CLIENT-SIDE (CallRail ignores it as a query param). Keeps rules scoped to that company plus account-wide rules (company_id null), which also fire for it. The page's `total_records` describes the unfiltered query; see `company_filter` in the response. user_id: Server-side filter on the notified user. notification_type: Server-side filter: 'push', 'email', or 'desktop'. email: Server-side filter on an email-only recipient. per_page: Page size (max 250). page: 1-indexed. account_id: Auto-resolves if omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| – | – | – | |
| notification_type | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| user_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_sms_threads ~245
List SMS threads. Unlike `list_text_messages` (conversation transcripts), threads carry the lead-management surface: `notes`, `value`, `tags`, `lead_qualification`, `state`. Threads are UPDATABLE via `update_sms_thread`. Args: account_id: Auto-resolves if omitted. company_id: Filter to one company. per_page: Page size (max 250). page: 1-indexed. Returns: JSON string with `sms_threads[]`. Each thread has id, customer_name / customer_phone_number, current + initial tracker/tracking-number, notes, value, tags, lead_qualification, state. `days` / `start_date` / `end_date` window the threads (CallRail wants start and end together, so a lone start_date is paired with today); `search` matches phone number, name and tag name.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| days | – | – | – |
| end_date | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| search | – | – | – |
| start_date | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_tags ~85
List all tags in the account, or filtered to one company. `status` ('enabled' | 'disabled') and `tag_level` ('account' | 'company') filter server-side.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| status | – | – | – |
| tag_level | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_text_messages ~271
List 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.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| days | integer | – | – |
| end_date | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| start_date | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_trackers ~194
List 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'. `type` ('source' | 'session') filters by tracker kind; `search` matches the tracker name; `fields` (comma-separated) adds optional attributes.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| fields | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| search | – | – | – |
| status | – | – | – |
| type | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
list_users ~209
List users on the account. Paginated. Args: account_id: CallRail account ID. Auto-resolves if omitted. company_id: Only users with access to this company. search: Matches first_name, last_name and email. sort: User field to sort by, with `order` ('asc' | 'desc'). per_page: Page size (max 250). page: 1-indexed. Returns: JSON string with `users[]`. Each user has id ('USR...'), email, first_name, last_name, name, role ('admin' | 'manager' | 'reporting'), `accepted` (whether the invitation was accepted) and `companies[]` ({id, name}) the user can access.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| company_id | – | – | – |
| order | – | – | – |
| page | integer | – | – |
| per_page | integer | – | – |
| search | – | – | – |
| sort | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
remove_call_tags ~69
Remove specific tags from a call (case-sensitive on tag name). Idempotent: removing a tag that isn't attached succeeds silently. Empty/whitespace-only entries in the input list are ignored.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | – | – | – |
| call_id | string | yes | – |
| tags | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
How do I install the CallRail MCP server?
CallRail MCP runs locally as a PyPI package, launched with uvx callrail-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · callrail-mcp
claude mcp add pghdma-callrail-mcp -- uvx callrail-mcp
What is the CallRail MCP server?
CallRail MCP is listed in the public MCP registry as io.github.pghdma/callrail-mcp. CallRail REST API v3: 57 tools for calls, leads, trackers, tags, users, and agency reporting. This page covers its PyPI package (callrail-mcp).
Is the CallRail MCP server safe to use?
CallRail MCP scores 72 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the CallRail MCP server expose?
CallRail MCP exposes 57 tools: list_accounts, list_companies, list_trackers, get_tracker, create_tracker, and 52 more. Their descriptions and schemas cost roughly 14,990 tokens of context every time the server is loaded.
Is the CallRail MCP server still maintained?
CallRail MCP is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the CallRail MCP server under?
CallRail MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.
What did VerifyMCP test on the CallRail MCP server?
VerifyMCP ran 15 checks on CallRail MCP, covering Known CVEs, Install scripts, Dependency health, Source repository and 11 more. One item could not be completed, a gap on our side rather than a finding about CallRail MCP: Malware scan. Endpoint Security and Transport & Reachability do not apply to a PyPI package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.