CallRail MCP
This MCP server exposes the CallRail REST API v3, enabling AI assistants and MCP-compatible clients to manage call tracking, reporting, and agency operations. Key capabilities include:
Reporting & Analytics
List and filter calls by company, date range, source, and answered status
Summarize call activity with aggregate stats (totals, answered/missed, by source, duration)
Search calls by phone number, get recordings (signed audio URL), and transcripts (via CallScribe)
List form submissions and text message conversations
Call & Lead Management
Update calls — notes, tags, spam flags, customer names, and lead status
Add or remove tags additively (without overwriting existing tags)
Bulk update calls matching a filter with a dry-run safety mode
Update or manually create form submissions to backfill offline leads
Tag Management
Full CRUD (list, get, create, update, delete) on company-level tags
Tracker (Phone Number) Management
List, get, create, update, and delete call tracking numbers
Provision new numbers with specific configurations (requires
confirm_billing=True; ~$3/month)Soft-delete trackers (releases number, preserves history)
Account & Company Management
List, get, create, update, and delete companies and users
Invite users by email, assign roles and company access
Agency Aggregation & Analytics
Per-company cost attribution (minutes, numbers, estimated cost share)
Compare performance metrics between time periods with per-company deltas
Spam detection — heuristically flag likely-spam calls with optional auto-tagging
Google Ads conversion eligibility auditing (gclid, duration, answered status)
Notifications & Integrations
Full CRUD on notification rules for call/text/form events across channels (email, desktop, push)
List integrations per company (Google Ads, Facebook, Slack, Webhooks, etc.)
Read webhook subscriptions (write operations blocked by CallRail permissions)
Outbound Calling
Place outbound calls via CallRail bridge dialing (requires
confirm_dialing=True— dials real phones)
Allows querying Facebook integration details attached to a company.
Allows querying Google Ads integration details and checking call conversion eligibility for Google Ads.
Allows querying Slack integration details attached to a company.
callrail-mcp
A Model Context Protocol server that exposes the CallRail REST API v3 to any MCP-compatible client (Claude Code, Claude Desktop, Cursor, and others).
Created by Steve Japalucci, founder of Pittsburgh Digital Marketing Agency (PGHDMA).
Works with both major versions of the MCP Python SDK (1.x and 2.x).
What you can ask your assistant to do
Once installed, any MCP-aware assistant can answer things like:
Reporting
"Pull last week's calls for Alan Construction, grouped by source"
"Show me every missed call this month"
"Find any calls from 412-555-1234 across all clients in the last 90 days"
"Get the transcript for call CAL019abc..."
Agency cost attribution
"Why is my CallRail bill $174? Break it down by client"
"Which client is the biggest minute user this cycle?"
Conversion debugging
"Why didn't this call convert in Google Ads? CAL019..."
"Is this 58-second call eligible to count as a Google Ads conversion?"
Lead management
"Show me everything this person has ever done: calls, forms, texts"
"Tag this SMS thread as a qualified lead and add a note"
Tag and tracker management
"Tag this call as 'lead' and add a note"
"Provision a new Google Ads call-extension tracker for Renaissance in area code 412" (requires
confirm_billing=True, costs about $3/mo)
Related MCP server: Kommo CRM MCP Server
Installation
# Recommended: pipx for an isolated CLI install
pipx install callrail-mcp
# Or with pip
pip install callrail-mcpTo install from source (latest unreleased):
pipx install git+https://github.com/pghdma/callrail-mcp.gitAuth
Get an API key at Settings > API Keys in your CallRail account. You need Account Admin permission to create one.
Provide it one of two ways:
Option 1: environment variable (recommended for most setups)
export CALLRAIL_API_KEY="your_key_here"Option 2: key file
mkdir -p ~/.config/callrail
echo "your_key_here" > ~/.config/callrail/api-key.txt
chmod 600 ~/.config/callrail/api-key.txtOr override with CALLRAIL_API_KEY_FILE=/path/to/key.txt.
Configure your MCP client
Claude Code / Claude Desktop (~/.claude.json or claude_desktop_config.json)
{
"mcpServers": {
"callrail": {
"command": "callrail-mcp",
"env": {
"CALLRAIL_API_KEY": "your_key_here"
}
}
}
}If you installed via pipx, callrail-mcp will be on your PATH automatically. Otherwise, point command at the full path to the executable.
Cursor and other clients
The server speaks standard MCP stdio. Any client that supports stdio MCP servers will work; just run callrail-mcp as the command.
Available tools
57 tools total, covering roughly 95% of CallRail's REST API v3 surface: read tools, write tools, tracker provisioning, agency aggregation, account management, notifications, integrations discovery, outbound calls, offline-lead backfill, leads and cross-channel timelines, SMS-thread lead management, and server-side analytics.
Read tools
Tool | Purpose |
| List accessible CallRail accounts |
| List companies (clients) under an account. Optional |
| List tracking phone numbers and their source mapping. Optional |
| Full detail for one tracker |
| Paginated call list. Filter by company, date, and |
| Full detail for a specific call |
| Aggregate stats (total, answered, by source, duration) for a window |
| CallRail Form Tracking submissions |
| SMS conversations |
| Account users |
| Recording URL (if recording enabled) |
| Conversation Intelligence transcript (requires Premium CI since 2026-05-21) |
| Find calls by phone number across a window |
| List tags in an account or filtered to one company |
Write tools
Tool | Purpose |
| Update note, tags, spam flag, customer name, lead status |
| Additive and subtractive tag changes (preserves existing) |
| Same field surface as |
| Full CRUD on the per-company tag taxonomy |
Tracker provisioning
Tool | Purpose |
| Provision a new tracking number. Requires |
| Update mutable settings: name, destination, whisper, greeting, SMS |
| Soft-delete a tracker (releases the phone number, preserves history) |
Account management
Tool | Purpose |
| Full company (client) CRUD. Free, since CallRail bills per number rather than per company. Soft-delete semantics |
| Full user CRUD. |
| Single tag detail |
| Single form-submission detail |
| Single SMS conversation with all messages |
| Manually create a form submission (backfill walk-in, paper-form, or offline leads) |
Notifications and integrations
Tool | Purpose |
| Full per-user alert-rule CRUD (who gets pinged on which call, text, or form event) |
| Discover GMB, Google Ads, Facebook, Slack, and Webhook integrations attached to a company. CallRail models webhooks as an integration type, so this is also how you inspect webhooks |
Outbound calling
Tool | Purpose |
| Place an outbound call. CallRail dials |
Leads and server-side analytics
Tool | Purpose |
| CallRail's deduplicated person records, plus full cross-channel history (calls, forms, texts) per lead with first and last touch attribution |
| SMS-thread lead management: tag, note, and qualify texting leads the way you would calls |
| Server-side call aggregation via |
| Call-volume trend line. Supports |
| Server-side form-submission totals |
| The visitor's page-view journey behind a call. Pairs with |
Agency aggregation
Tool | Purpose |
| Per-company cost-attribution breakdown for the cycle: minutes used, active numbers, estimated cost share, sorted by biggest cost driver. Answers "which client is burning my CallRail budget" |
| Audit whether a specific call qualifies as a Google Ads conversion. Checks |
| Compare the current N-day window against the previous one. Per-company minute and call deltas plus biggest mover |
| Apply one update (tag, note, lead_status, spam) to every call matching a filter. |
| Heuristically flag likely-spam calls (short duration, unanswered, repeat-caller patterns). Optional |
All tools accept account_id optionally; if omitted, the first accessible account is auto-resolved. Most accept company_id to filter to a single client.
A note on filtering calls
CallRail's GET /calls.json accepts answer_status (answered, missed, voicemail) but has no answered or source parameter. Earlier versions of this server forwarded both and CallRail silently ignored them, so results looked filtered but were not. Since v1.2.0:
answer_statusis the documented filter and is applied server-side.answeredremains as a deprecated alias that translates toanswer_status.sourceis applied client-side, and the response includes asource_filterblock stating exactly what was matched. For source breakdowns, prefercall_stats(group_by="source").
Validation is strict throughout: phone-number format, area code (^\d{3}$), session pool size (CallRail's 4 to 50 range), name, whisper, and greeting length caps, and a 12-value source-type enum.
Rich field selection
The CallRail API returns a lean default payload. Ask for more fields on list_calls, get_call, or list_form_submissions via the fields parameter:
fields=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_domainSee the CallRail API docs for the full field catalog per resource.
How this compares to CallRail's official MCP server
CallRail offers an official hosted MCP server (documented at apidocs.callrail.com) using OAuth 2.0, with roughly 30 tools and a server URL provided by your CallRail account team. It is a good option if you want a fully managed remote server.
This project is different on purpose:
callrail-mcp (this project) | Official CallRail MCP | |
Install |
| URL provisioned by your CallRail account team |
Hosting | Local stdio, so your API key never leaves your machine | Hosted remote (OAuth) |
Tools | 57 | ~30 |
Agency tooling |
| Not offered |
Safety guards |
| Not documented |
Source | MIT, open, auditable | Closed |
Both speak the same underlying REST API v3. If you run an agency across multiple client accounts and want cost attribution and bulk workflows, this project is built for exactly that.
Out of scope (deliberately not implemented)
The following CallRail capabilities are not in this MCP, by design. PRs are welcome if you have an account that supports them, or open an issue and we will prioritize.
Blocked by CallRail account permissions (returns 403)
These endpoints exist but require account upgrades or additional permissions that a standard CallRail account does not have. Re-probed live 2026-09-07:
Send SMS/MMS (
POST /text-messages.json) needs A2P/TCR SMS registration. CallRail enforces TCPA-compliance keywords (STOP, CANCEL, UNSUBSCRIBE) on outbound text messages. MMS support was added by CallRail on 2026-05-05.Webhook integration create, update, delete (
POST /integrations.jsonwithtype=Webhook) needs Integration-Admin permission.Outbound Caller IDs (
/caller_ids.jsonCRUD) is documented by CallRail but returns 403 on a standard account.Message Flows (
/message-flows.jsonCRUD, SMS auto-reply flows) is documented but returns 403.Integration Filters (
/integration_triggers.jsonCRUD) is documented but returns 403.
Not exposed by CallRail's REST API
These have no API equivalent and are managed exclusively via the CallRail web UI:
Numbers: account-level number ownership, porting, and transfers.
Call Flows: the IVR builder and call routing tree configuration.
Custom Fields CRUD: custom data columns are readable as part of call and form responses, but the schema management endpoint is not exposed.
Do Not Call list: DNC number management.
Available but not yet shipped
Readable on a standard account, judged low value so far: summary_emails CRUD, companies/bulk_update.json (external form capture only), and form_submissions/ignored_fields.json.
Examples
> List companies under our CallRail account.
(calls list_companies, returns clients with IDs and primary numbers)
> Pull today's calls for company COM019ab..., include source and keyword.
(calls list_calls with company_id, days=1, fields="source,keywords,landing_page_url")
> Why is my CallRail bill $174 this month? Break it down by client.
(calls usage_summary, returns per-company cost share sorted by biggest user)
> Why didn't this call show up as a conversion in Google Ads? CAL019dbf79...
(calls call_eligibility_check, returns gclid, duration, and answered checks
plus a targeted reason such as "duration 58s under Google Ads minimum (60s)")
> Show me everything this lead has done with us.
(calls list_leads then get_lead_timeline, returns calls, forms, and texts in one timeline)
> Provision a new Google-Ads-call-extension tracker for Alan Construction in 412.
(calls create_tracker, refuses unless you also pass confirm_billing=True
since it incurs a monthly charge)Direct Python usage
The CallRailClient is also usable as a library:
from callrail_mcp.client import CallRailClient
cr = CallRailClient() # picks up CALLRAIL_API_KEY
aid = cr.resolve_account_id()
for call in cr.paginate(f"a/{aid}/calls.json", {"per_page": 250}, items_key="calls"):
print(call["id"], call.get("source"), call.get("customer_name"))paginate() accepts an optional stats dict that reports pages_fetched, items_yielded, total_records, and truncated, so you can tell a capped result from a complete one.
Running the server directly
For debugging, or to verify your key works:
python -m callrail_mcpThe server speaks MCP stdio. It will wait for JSON-RPC messages on stdin. Press Ctrl-C to exit.
To smoke-test the API key without running the MCP loop:
python -c "from callrail_mcp.client import CallRailClient; c=CallRailClient(); print(c.get('a.json'))"Rate limits
CallRail allows 60 requests per minute per API key. The client retries 429 responses using the Retry-After header, and retries 5xx responses with exponential backoff for idempotent methods only (GET, PUT, DELETE, HEAD, OPTIONS). POST is never retried on 5xx, so a lost response cannot create duplicate trackers. For heavy pagination, prefer the built-in paginate() helper.
Development
git clone https://github.com/pghdma/callrail-mcp
cd callrail-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytestSee DEVELOPMENT.md for release flow, API quirks worth knowing, and the conventions this codebase follows.
Contributing
Contributions welcome. See CONTRIBUTING.md for dev setup, test conventions, and release flow. Please file issues via GitHub Issues and follow the Code of Conduct.
Security
If you discover a security vulnerability, please report it privately per SECURITY.md instead of opening a public issue.
Author
Steve Japalucci, founder of Pittsburgh Digital Marketing Agency. Reach out at s@pghdma.com.
License
MIT. See LICENSE. Copyright (c) 2026 Steve Japalucci / Pittsburgh Digital Marketing Agency.
Disclaimer
This project is an independent open-source integration and is not affiliated with, endorsed by, or officially supported by CallRail. "CallRail" is a trademark of CallRail, Inc. All product names, logos, and brands are property of their respective owners.
Available Tools
57 toolsadd_call_tagsA
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 | Required | Description | Default |
|---|---|---|---|
| tags | Yes | ||
| call_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers. It details the read-merge-write flow, auto-creation of company-level tags, silent filtering of empty/whitespace entries, dropping non-strings with a warning, de-duplication, a 100-tag cap, and the error condition when no valid tags remain. This is exceptional transparency for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with an opening purpose sentence, usage guidance, edge-case behavior, then an Args/Returns block. Every sentence contributes unique information—no filler or redundancy. The structure front-loads the key distinction and then logically details parameters and behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, edge cases around cleaning and limits) and absence of annotations/output schema, the description is complete. It explains return format, error behavior, and all parameter constraints. An agent has everything needed to call it correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely. It does: for call_id it specifies the 'CAL...' format; for tags it explains string-only, non-strings dropped, de-duplication, max 100; for account_id it notes auto-resolution when omitted. This adds meaning far beyond the bare schema and covers all parameters thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Append tags to a call WITHOUT replacing existing ones,' which states a specific verb, resource, and critical semantic (append vs. replace). It explicitly differentiates from update_call, making the tool's purpose unmistakable even without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this when you want to add labels... without losing prior tags.' It also names the alternative for replacement: 'To fully replace tags, use update_call(tags=[...]) instead.' This is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_callsA
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'.
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": M, "failed_count": K, "failures": [...]}
Performance note: when set_tags_add is used, the commit phase
issues 1 extra GET per call to fetch fresh tags before merging
(race protection against concurrent tag writes). For a max
bulk of 500 calls, this is ~2× the latency vs other set_*
fields. Other update fields (note, lead_status, spam) skip the
extra GET.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| source | No | ||
| dry_run | No | ||
| answered | No | ||
| set_note | No | ||
| set_spam | No | ||
| account_id | No | ||
| company_id | No | ||
| set_tags_add | No | ||
| answer_status | No | ||
| set_lead_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the safety default (`dry_run=True`), the 500-call hard cap, client-side vs server-side filtering, race protection with extra GETs, and the non-reversible spam marking. It also details the deprecated `answered` parameter's historical failure mode. This is exemplary transparency beyond any annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but each section earns its place: motivation, safety, parameter semantics, return format, performance note. It is front-loaded with the core purpose and safety. Slight redundancy exists (e.g., repeating the 500-cap in the performance note and safety section), but the structure is clear with headings. It could be tightened slightly but is well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, zero schema coverage, no annotations, and an output schema that only partially covers return values, the description provides everything needed: parameter semantics, defaults, side effects, failure modes, performance implications, and return format. It is complete for an agent to invoke correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully explain each parameter. It does: `company_id` and `days` are tied to `list_calls` semantics, `answer_status` is a server-side filter with enumerated values, `answered` is deprecated alias with a historical caveat, `source` is applied client-side, all `set_*` fields are explained with behavior (add vs replace), `dry_run` default, and `account_id` auto-resolution. It also documents the return object structure. This is comprehensive and compensates completely for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Apply the same update to every call matching a filter'), the resource ('calls'), and the scope of operation. It provides concrete examples and distinguishes it from the sequential `update_call` tool, which is its primary sibling. The purpose is unmistakable and well differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool: for bulk operations 'Replaces dozens of sequential `update_call` invocations with one tool call.' It also provides negative guidance: 'At least one filter must be provided to avoid "update everything ever"' and warns about the `answered` deprecation. Alternatives are referenced (`list_calls`, `update_call`). This is thorough and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_eligibility_checkA
Audit whether a specific call is/was eligible to count as a Google Ads conversion. Useful for "where did my conversion go" debugging.
Checks:
Did the call have a
gclid? (Required for CallRail to upload to Google Ads as a UPLOAD_CLICKS Phone Call conversion.)Was the call answered? (Most integrations skip unanswered.)
Did duration meet Google Ads' minimum? (Default 60s; configurable per conversion action in Google Ads UI.)
Is the call from a Google source? Detection uses CallRail's internal
sourceslug (e.g.google_paid,google_my_business)presence of gclid, NOT the user-editable
source_namedisplay 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 | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | ||
| account_id | No | ||
| google_ads_min_duration_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the internal detection logic (using source slug and gclid, not source_name) and the configurable duration threshold, which adds valuable context. It does not explicitly state that the tool is read-only, but 'audit' strongly implies no side effects. It also mentions the return format (verdict + pass/fail + remediation), which is helpful. It doesn't cover error handling or rate limits, but for a read-only diagnostic tool, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear opening purpose, a numbered list of checks, and a separate paragraph for parameter semantics. It front-loads the main purpose and then provides organized detail. Every sentence adds value, and the structure makes it easy for an agent to parse. It is appropriately detailed without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for the tool's complexity. It covers the eligibility criteria, the parameters, and the return format (verdict + pass/fail + remediation). The output schema is not shown, but the description already summarizes what the output contains. There is no missing information that an agent would need to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so thoroughly: it explains call_id ('CAL... id'), google_ads_min_duration_seconds (threshold, default 60, override rationale), and account_id (auto-resolves if omitted). Each parameter's meaning and usage are clearly articulated, going well beyond the bare schema defaults and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear, specific purpose: auditing whether a call is eligible as a Google Ads conversion, explicitly tied to 'where did my conversion go' debugging. It names the exact verb and resource and distinguishes itself from sibling tools like get_call and call_summary by focusing on eligibility criteria rather than general call data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates when to use the tool (for conversion debugging) and outlines the checks performed, which implies its scope. It doesn't explicitly name alternative tools for different use cases, but the debugging context and specific checks make the intended usage clear. A minor gap is not explicitly stating when not to use it (e.g., for general call details), but this is adequately implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_statsA
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, }).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| fields | No | ||
| end_date | No | ||
| group_by | No | source | |
| account_id | No | ||
| company_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It explains the server-side aggregation model, one-request behavior, default lookback, date precedence, field defaults, account auto-resolution, and the exact JSON return shape. This is unusually transparent for a read-style aggregation endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized with clear Args and Returns sections. Every parameter has a purpose, and no filler sentences exist. Given seven parameters and the need to explain alternative selection, the length is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is fully documented for safe, correct invocation: parameter semantics, default behavior, sibling-tool differentiation, and return structure are all present. The only omitted details are operational concerns like auth or rate limits, which are not required for an agent to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully document parameters. It does: group_by enumerates valid values, days and fields have defaults, start_date/end_date get format and precedence rules, company_id is explained, and account_id's auto-resolution is noted. This compensates completely for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool performs server-side call aggregation via CallRail's /calls/summary.json endpoint and returns grouped totals in a single request. It also distinguishes itself from call_summary, making its purpose and scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to prefer this tool over call_summary ('when you only need grouped totals') and when call_summary is still useful. This gives actionable routing guidance beyond a generic tool description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_summaryA
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| end_date | No | ||
| account_id | No | ||
| company_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the output contents (counts, breakdowns), and importantly discloses the risky default behavior (pagination of 50+ pages of 250 calls) when no window is provided. It does not mention permissions or rate limits, but the key behavioral trait is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a clear opening statement, a summary of return values, a usage note, and a behavioral warning. Every sentence earns its place, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the existence of an output schema (which specifies return structure), the description is largely complete. It covers purpose, usage, and a critical behavioral caveat. The only minor gap is the lack of explanation for account_id and company_id, but these are likely standard filters and the description is adequate overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It explicitly explains days and start_date in the note, but does not mention end_date, account_id, or company_id. Those are left to inference. While the critical parameters are covered, the omission of the filter parameters means the description doesn't fully compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Summarize') and resource ('calls') and specifies the date-window scope. It distinguishes itself from sibling tools like list_calls by emphasizing aggregate counts instead of individual call data, and the mention of 'weekly/monthly rollups without pulling every call into context' makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear when-to-use guidance: for rollups and aggregate statistics, contrasted with pulling individual calls. It also gives an explicit usage constraint (requires days>=1 or start_date) and explains the consequence of violating it (pagination of entire history). While it doesn't name a specific alternative tool, the implication is strong enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_timeseriesA
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, }).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| fields | No | ||
| end_date | No | ||
| interval | No | ||
| account_id | No | ||
| company_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full behavioral burden and does so thoroughly: it discloses the 200-point limit, the pre-flight check that avoids raw 400s, date precedence rules, default interval behavior, account auto-resolution, and the return shape. Nothing in the text contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite covering seven params, the description is organized with a short lead, a limit warning, an Args block, and a Returns block. Each line adds useful information, and the most decision-relevant behavior (limit and interval workaround) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a seven-parameter time-series tool, the description covers valid values, date precedence, limits, filtering, and expected output. An agent has enough information to construct a correct call and to reason about failures before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain every parameter, and it does: days default/ignored when start_date given, explicit YYYY-MM-DD dates, company filtering, valid field names, interval choices, and auto-resolved account_id. This is exactly the compensation needed for a bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource ('CallRail's /calls/timeseries.json') and a clear purpose: call volume over time as a trend line. It is easy to tell this is a time-series aggregation tool, though it does not explicitly contrast itself with sibling tools such as call_summary or call_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool is appropriate ('One request for a trend line instead of client-side bucketing') and practical guidance on interval options for longer windows. It does not explicitly list when-not-to-use or name alternative sibling tools, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_periodsA
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 | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly discloses implementation nuances: tracker counts use current-snapshot for both periods (not historical), and only minute deltas are period-over-period. This is exactly the kind of behavioral context an agent needs to avoid misinterpretation of results. It also notes that account_id auto-resolves if omitted, which is a behavioral trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections ('Args', 'Returns', 'Implementation'). It front-loads the core purpose and output, then details parameters and caveats. Every sentence adds value, with no filler. The use of examples ('is Malick growing?') is concise and effective. Ideal length for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return format is covered there. The description provides essential usage context, parameter semantics, and behavioral caveats. The only minor gap is not mentioning potential side effects (or lack thereof), but given it's a read-only comparison, this is acceptable. Overall, it's complete for an agent to correctly select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain both parameters. It does: 'days' is explained with default, cap, and rationale; 'account_id' is explained as auto-resolving if omitted. This is above the baseline of 3 for low coverage, though it could be more explicit about what account_id refers to (e.g., a specific CallRail account). Still, it adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Compare') and resource ('current N-day window vs the previous N-day window'), and states its output (per-company deltas, agency totals). It clearly distinguishes itself from sibling tools like 'call_summary' and 'call_timeseries' by focusing on period-over-period comparison. The examples ('is Malick growing?') add practical context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete use cases ('catching invoice surprises before they hit') and sets expectations about the 'days' parameter (default 30, cap 365, with a hint about typo prevention). It implicitly signals when not to use (don't ask for 5-year delta), which is useful guidance. However, it doesn't explicitly name alternatives, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_companyA
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).
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 account-level default. lead_scoring_enabled: Manual lead-status workflow. None=inherit. swap_exclude_jquery: Skip jQuery-driven phone swaps. None=inherit. callscribe_enabled: Conversation Intelligence transcripts (paid). None=inherit. keyword_spotting_enabled: Real-time keyword detection in calls. None=inherit. form_capture: Enable CallRail Form Tracking. 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 | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| time_zone | No | America/New_York | |
| account_id | No | ||
| form_capture | No | ||
| callscore_enabled | No | ||
| callscribe_enabled | No | ||
| swap_exclude_jquery | No | ||
| lead_scoring_enabled | No | ||
| keyword_spotting_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that creating a company is free, that optional booleans default to None (inherit account defaults), and that sending False can actively disable paid features. This is valuable, non-obvious behavior beyond what the schema states. It does not detail response behavior, but an output schema is present, so that omission is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with a clear purpose statement, a billing context sentence that earns its place, and a parameter list with concise inline explanations. The important warning about False versus None is front-loaded into the note section. There is no filler or redundant restating of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter creation tool with no annotations)Skip? Actually no. Need final. Let's output.The description includes everything an agent needs: purpose, cost implications, parameter semantics, default inheritance behavior, and a dangerous edge case about False disabling paid features. The presence of an output schema covers return-value details. The only slight gap is not explicitly saying 'use update_company to modify an existing company,' but this is a minor omission given the clear onboarding context and the sibling list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does, covering all 9 parameters with meaningful semantics: name is required with an example, time_zone has a default and common values, each boolean explains what it toggles and that None means inherit, and account_id auto-resolves. This goes far beyond the bare schema titles and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a new company (client) under the account.' It then clearly positions the tool for new-client onboarding and distinguishes it from related tools like create_tracker. The purpose is unmistakable even before looking at the parameter schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use this tool ('Useful for new-client onboarding') and connects it to the billing model, pointing to create_tracker for the actual cost-bearing provisioning step. It does not explicitly enumerate exclusions versus update_company or list_companies, but the onboarding framing plus sibling reference is strong enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_form_submissionA
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.
Args:
company_id: 'COM...' id. Required.
referrer / referring_url / landing_page_url: All three required
(CallRail enforces "either session_id or all 3 of these").
Use the original web context if known, or "(direct)" /
"https://offline" placeholders for in-person leads.
form_url: URL of the form page if applicable.
form_data: Dict of form-field values (e.g.
{"name": "Kevin", "email": "k@x.com", "phone": "412-555-1234"}).
customer_phone_number / name / email: Set on the submission directly
(overrides form_data if both are set).
note, tags, value, lead_status: Standard lead-management fields.
account_id: Auto-resolves if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| tags | No | ||
| value | No | ||
| form_url | No | ||
| referrer | Yes | ||
| form_data | No | ||
| account_id | No | ||
| company_id | Yes | ||
| lead_status | No | ||
| customer_name | No | ||
| referring_url | Yes | ||
| customer_email | No | ||
| landing_page_url | Yes | ||
| customer_phone_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description explains parameter behavior (e.g., referrer constraints, field overrides) but does not disclose side effects, authorization needs, or irreversible actions beyond creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a purpose paragraph followed by parameter explanations, but the parameter list is a bit lengthy; could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, and all parameters thoroughly; missing output schema details but output schema exists, so not required. Lacks error handling info.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% but the description provides detailed explanations for all parameters, including required conditions, examples for form_data, and override rules, adding significant value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Manually create a form submission' and provides a concrete use case 'backfill an offline lead', making the purpose specific and easily distinguishable from sibling tools like update_form_submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use when receiving a lead through a non-CallRail-tracked channel, but does not mention when not to use or compare to alternatives like creating a call directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_notificationB
Create a notification rule (who gets pinged on which event).
Args: name: Display name for this rule. user_id: 'USR...' id of the user being notified. alert_type: Trigger event. Common values: 'all_calls', 'first_time_callers', 'missed_calls', 'voicemails', 'all_texts', 'first_time_texters', 'all_form_submissions'. Plan-specific types may exist. company_id, tracker_id: Optional scope filters. send_email / send_desktop / send_push: Channel toggles. call_enabled / sms_enabled: Trigger toggles for mixed-event rules. email: Override email address (defaults to user's email). account_id: Auto-resolves if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| No | |||
| user_id | Yes | ||
| send_push | No | ||
| account_id | No | ||
| alert_type | Yes | ||
| company_id | No | ||
| send_email | No | ||
| tracker_id | No | ||
| sms_enabled | No | ||
| call_enabled | No | ||
| send_desktop | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It lists parameters and hints at defaults (e.g., send_email default true) but does not disclose side effects, rate limits, authorization needs, or what happens on creation (e.g., immediate activation, duplicate prevention). The behavioral impact is inadequately described for a mutation tool with 12 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a one-line summary followed by a detailed Args list. It is clear and front-loaded, but slightly verbose with full parameter names that are already in the schema. Every sentence earns its place, though trimming redundant descriptions could improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 parameters, 0% schema coverage, no annotations) and availability of an output schema, the description covers the creation intent and parameter semantics adequately but lacks details on error handling, constraints (e.g., unique name), or post-creation behavior. It is minimally viable but leaves gaps for an agent to navigate confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides meaningful context for most parameters: explains alert_type common values, optional scope filters, channel toggles, trigger toggles for mixed events, and auto-resolution of account_id. This adds significant value beyond the bare schema, though enums or more precise formats could be mentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Create a notification rule') and its purpose ('who gets pinged on which event'), distinguishing it from sibling tools like delete_notification, update_notification, and list_notifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, when to modify vs create, or contexts where this tool is appropriate, leaving the agent to infer usage from the parameter list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_outbound_callA
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.
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 | Required | Description | Default |
|---|---|---|---|
| caller_id | Yes | ||
| account_id | No | ||
| confirm_dialing | No | ||
| recording_enabled | No | ||
| business_phone_number | Yes | ||
| customer_phone_number | Yes | ||
| outbound_greeting_text | No | ||
| outbound_greeting_recording_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses that calls actually dial real phones, explains the two-leg dialing order and bridging behavior, warns that both legs consume minutes, flags legal risk, and mandates confirm_dialing=True as an explicit safety gate. This far exceeds typical descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most critical warning before diving into details. The parameter list is compact but every entry adds semantic value, and the version note about old parameter names prevents a known failure mode. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-stakes, side-effectful operation with eight parameters and no annotations, the description covers action, safeguards, geography, billing impact, parameter semantics, and return behavior. An output schema already exists, so the return-value note is sufficient. Nothing material is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all eight parameters. It explains every parameter in plain terms, adds E.164 format expectations, identifies which leg each phone number represents, clarifies that confirm_dialing defaults to False and returns an error envelope, and notes that account_id auto-resolves. This fully compensates for the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Place an outbound call.' It adds a high-value qualifier, 'THIS ACTUALLY DIALS REAL PHONES,' which makes the tool's purpose unmistakable and differentiates it from read-oriented siblings like list_calls, get_call, and call_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool and includes explicit exclusions: 'US and Canadian numbers only' and 'CallRail does not support outbound to the UK or Australia via this endpoint.' It also stresses consent verification as a prerequisite. It does not name alternative tools such as call_eligibility_check, but the usage context is otherwise strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tagA
Create a new tag scoped to one company.
Args: name: Tag display name. company_id: Required (tags are per-company in CallRail). 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'.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| color | No | ||
| account_id | No | ||
| company_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description bears the behavioral burden. It does disclose useful behaviors beyond the schema: tag scoping, account_id auto-resolution, and the gray1 color default. However, it does not mention side effects, permissions, error conditions, or duplicate/name constraints for the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and uses an Args block that maps cleanly to all four parameters. The color list is longer but necessary because the schema has no enum values.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter create mutation with no annotations and an output schema, this description is complete: it clarifies required versus auto-resolved fields, the relevant scoping rule, and valid inputs. Nothing the agent needs to invoke the tool correctly is left undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates: name, company_id, account_id, and color all receive meaningful guidance. The color parameter is especially strong, enumerating the 24 supported color ranges and stating the default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names an exact action and object: 'Create a new tag scoped to one company.' This is specific enough to distinguish it from sibling tag tools like list_tags, update_tag, delete_tag, and get_tag without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: tags are per-company, company_id is required, and account_id auto-resolves. It does not explicitly route the agent to update_tag/delete_tag when appropriate, but the 'create' framing and per-company scope make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_trackerA
⚠️ 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| type | No | source | |
| area_code | No | ||
| pool_size | No | ||
| toll_free | No | ||
| account_id | No | ||
| company_id | Yes | ||
| sms_enabled | No | ||
| source_type | No | all | |
| greeting_text | No | ||
| confirm_billing | No | ||
| whisper_message | No | ||
| recording_enabled | No | ||
| destination_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It transparently discloses the financial impact, the need for explicit confirmation, the per-number billing multiplier for pool_size, the conditional ignoring of area_code for toll_free, and the return value. It also notes potential proration. These are critical behavioral traits beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured: it starts with a prominent warning and cost explanation, then a mandatory billing confirmation note, followed by a parameter-by-parameter breakdown. It is front-loaded with the most critical information. While verbose, each sentence carries useful content, and the organization (warning → requirements → parameter details) aids comprehension. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (14 params, output schema present), the description is exhaustive. It covers all parameters, cost implications, conditional behaviors, and the return value. It also notes that account_id auto-resolves if omitted. Nothing an agent needs to call it correctly is missing; even the return statement is explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully, and it does. Every one of the 14 parameters is explained with meaning, defaults, constraints, and cross-relationships (e.g., source_type ignored for session, area_code ignored for toll_free, pool_size multiplied cost). Examples like 'Google Ads Call Extension' for name and valid source types are provided, adding substantial semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific action: 'Create a new tracking phone number (tracker).' It explicitly names the resource and distinguishes it from sibling operations (list, update, delete) by its creation purpose. The verb-resource pairing is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: it warns that creation costs money, mandates confirm_billing=True for actual creation, and explains the source vs. session type choice. It does not explicitly name alternative tools to use instead, but the cost and confirmation guidance strongly implies when this should be invoked. The instruction 'You must pass confirm_billing=True to actually create' is a concrete usage rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_userA
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). Common values: 'admin', 'manager', 'reporting', 'analyst'. Other plan-specific roles may exist; we don't reject unknown values, just warn. company_ids: List of 'COM...' company IDs the user can access. Empty/None = account-wide (admins typically). account_id: Auto-resolves if omitted.
Note: This sends an invitation email. Don't run experimentally.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | reporting | |
| Yes | |||
| last_name | Yes | ||
| account_id | No | ||
| first_name | Yes | ||
| company_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description transparently discloses that the tool sends an invitation email and warns of side effects. It explains role behavior (unknown values accepted with warning) and account_id auto-resolution, though it does not mention rate limits or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an 'Args' section listing parameters. Every sentence adds value: purpose, side effect warning, and parameter details. No repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, 3 required, and the presence of an output schema (which removes the need to describe return values), the description is complete. It covers all input details, side effects, and parameter nuances.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description thoroughly explains each parameter: email, first_name, last_name, role (with defaults and common values), company_ids, and account_id (auto-resolve). It adds meaning beyond the schema by clarifying default role, accepted values, and behavior of unknown roles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Invite a new user' and specifies that CallRail sends an account-creation link. It clearly distinguishes this user creation from sibling tools like delete_user, update_user, and list_users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context on when to use the tool (to invite a user) and warns against experimental runs because it sends an email. It does not explicitly compare to alternatives but implies that this is the primary user creation tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_companyA
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 | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| company_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses soft-delete behavior (status change, record retention) and return shape with no annotation contradiction. Lacks authorization details but sufficient for a soft-delete operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with front-loaded action, efficient use of words. Every sentence adds value: action, behavior, post-deletion guidance, and return format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the soft-delete complexity and presence of output schema (implied by return example), the description covers key outcomes, post-action filter, and expected response, making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fails to explain the optional account_id parameter. Only company_id is implied by context. Parameter meaning is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Soft-delete a company' with specific outcome 'Status flips to disabled, records retained,' differentiating from hard delete. References sibling delete_tracker semantics for consistency.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using list_companies(status='active') to filter after deletion and mirrors delete_tracker semantics, providing clear context for when to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_notificationA
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 | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| notification_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses the destructive outcome ('The rule is gone'), the return format, and the 204 response behavior. It doesn't mention permissions or irreversibility explicitly, but the 'gone' phrasing implies permanence. A small gap but largely transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured: a direct first sentence stating the purpose, a clear alternative, then formatted Args and Returns sections. No redundancy or fluff; every line serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a delete operation, the description covers the essential context: purpose, parameters, return format, and alternative behavior. It also notes the response behavior on 204. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains both parameters: notification_id as the rule ID and account_id with auto-resolution, adding meaning beyond the schema's type/required fields. This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Delete' and the resource 'notification rule', and explicitly contrasts with `update_notification` for muting, making the purpose unambiguous and distinguishing it from the sibling `update_notification`. The phrase 'The rule is gone' reinforces the destructive scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly provides a when-to-use versus alternative guidance: 'To keep but mute it, prefer update_notification...' and notes that account_id auto-resolves if omitted, giving clear context on when to use this tool over its sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tagA
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 | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly states the destructive nature ('HARD delete', 'gone permanently'), the side effect on historical applications ('Removes it from any calls or form submissions that had it applied'), and the return value. This is exactly the kind of behavioral context an agent needs for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core action and consequence come first, the alternative is stated next, and parameter details are organized in a clear Args/Returns structure. Every sentence earns its place; there is no filler or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 2-parameter tool with no annotations, the description covers everything an agent needs: what is deleted, the permanent consequence, the alternative, parameter semantics, and the return format. The output schema exists, so return values are already structured, but the description still adds the concrete JSON example. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains that tag_id is a numeric integer (not the string-prefixed format used elsewhere), provides a regex pattern, and notes that account_id auto-resolves if omitted. This adds substantial meaning beyond the bare schema, which only lists types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Delete'), a specific resource ('tag definition'), and the scope ('from the account'). It also distinguishes itself from sibling tools like update_tag and create_tag by explaining what it does to the tag and its historical applications. This is a clear, non-tautological purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool vs alternatives: 'To preserve history, prefer renaming or disabling via update_tag instead.' This is a direct, actionable usage guideline that names the alternative and the condition for choosing it. It also warns that this is a HARD delete, which is critical for an agent deciding whether to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_trackerA
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 | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| tracker_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully carries burden. Discloses soft-removal, retained call history, stopped new calls, phone number release, auto-resolve for account_id, and return value structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with separate sections for action, args, returns. Some redundancy (e.g., 'An object with' could be trimmed), but each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given output schema exists, description completes the picture with details on soft-removal behavior and edge cases (204 response). Adequate for a delete operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage. Description adds meaning: tracker_id format 'TRK...' and account_id auto-resolves if omitted. Lacks account_id format details, but overall helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'delete (disable) a tracker' with specific verb and resource. Differentiates from sibling tools like create_tracker, update_tracker, and list_trackers by explaining soft-removal semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the effect of soft-removal and when to use (to disable a tracker). Lacks explicit when-not or alternative tools, but the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_userA
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 | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description effectively explains the hard-remove nature, immediate loss of access, and return format. It lacks details on permissions or irreversibility, but still provides significant behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loaded with the core action, then adding behavioral nuance and return format. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no nested objects, output schema example provided), the description covers purpose, behavior, and return format well. Missing parameter explanations, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, and the description does not clarify the purpose or usage of the two parameters (user_id, account_id) beyond implying account context. No additional meaning is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Remove a user from the account' and distinguishes this from sibling delete tools (e.g., delete_company, delete_tracker) by noting the hard-remove behavior versus soft-delete for other entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for permanent user removal but does not explicitly state when to use this tool versus alternatives (e.g., update_user to disable) or provide prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
form_statsA
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}).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| end_date | No | ||
| account_id | No | ||
| company_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It reveals the underlying API endpoint, explains parameter interactions (explicit dates override 'days'), and describes the return format including 'time_zone'. It does not mention authorization or rate limits, but for a read-only aggregation tool this is reasonable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: a single line for the purpose followed by a bullet-like list of parameters and return format. Every sentence adds value, and the key endpoint is front-loaded. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (5 optional parameters, no output schema provided), the description covers essential behavioral and return details. It explains parameter logic, return fields, and filtering. A minor gap is the lack of explanation on how time_zone is determined, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must add meaning to each parameter. It does: 'days' (default 30, ignored if start_date given), 'start_date'/'end_date' (YYYY-MM-DD, explicit overrides), 'company_id' (filter), 'account_id' (auto-resolves). This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Server-side form-submission totals', indicating it returns aggregate counts. The return format with 'total_results' like '{"total_forms": N}' specifies exactly what the tool computes, distinguishing it from sibling tools like list_form_submissions (which return individual submissions) and get_form_submission (one submission).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the parameters but does not explicitly say when to use this tool over alternatives. The return type implies it's for aggregate summaries, but there is no direct comparison to list_form_submissions or other tools for similar purposes. Usage is implied but not clarified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_callA
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 | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| call_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only notes that account_id auto-resolves. It does not disclose potential side effects, permissions, rate limits, or data scope. For a read operation, more transparency about what 'full detail' includes would be helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a brief parameter list. No fluff, front-loaded with the main action, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (not shown), the description need not explain return format. However, with no annotations, more behavioral context (e.g., uniqueness of call_id, any limitations) would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description compensates well: specifies call_id prefix format, account_id auto-resolves, and fields are comma-separated extra fields with a reference to list_calls. This adds significant meaning beyond bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full detail for a specific call,' which is a specific verb-resource combination. It distinguishes from siblings like list_calls (list many) and get_call_recording (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need full detail on one call given a call_id, and mentions auto-resolution of account_id. However, it lacks explicit when-not-to-use or alternative tool guidance (e.g., when to use list_calls instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_call_page_viewsA
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).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| call_id | Yes | ||
| per_page | No | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that results are paginated, that `account_id` auto-resolves if omitted, and that the return is a JSON string with `page_views[]`. It does not disclose rate limits, whether the data is historical-only, or what happens when no page views exist. The pagination and auto-resolution details add value, but the behavioral profile is incomplete for a read tool with no annotation safety net.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose is in the first sentence, the pairing context in the second, and the parameter details are in a tight bullet list. Every sentence earns its place; no filler or repetition of schema types.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so the return structure is already documented. The description adds the pagination semantics, the auto-resolution behavior, and the max page size, which are the non-obvious parts. It is complete enough for an agent to call it correctly, though it could mention whether page views are ordered chronologically or what 'around dialing' means precisely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains `call_id` is a 'CAL...' id, `account_id` auto-resolves if omitted, `per_page` has a max of 250, and `page` is 1-indexed. This adds meaning beyond the raw schema, which only shows types and defaults. The only minor gap is not explaining the default page size behavior beyond the schema default of 100.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specific resource ('visitor's page-view history behind a call'), and the exact content (pages browsed with timestamps before/around dialing). It also names a sibling tool (`call_eligibility_check`) and explains how they pair, which distinguishes it from the many call-related siblings like `get_call`, `get_call_recording`, and `get_call_transcript`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use it: for conversion debugging, to see the actual session journey that led to the call. It names the paired sibling (`call_eligibility_check`) but does not explicitly state when NOT to use it or list alternatives for other call data (e.g., `get_call_transcript` for the conversation). Still, the pairing guidance is strong enough to route an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_call_recordingA
Get the recording URL for a call. Returns a short-lived signed URL. Fetch and use it within a few minutes before it expires.
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 (signed 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 | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and handles it well. It discloses the short-lived URL expiration, the account-level prerequisite, the non-retroactive recording behavior, and the empty-url failure mode including user opt-out. This goes well beyond a generic retrieval statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose is front-loaded in the first sentence, followed by clearly separated Args and Returns sections. Each sentence contributes a distinct useful fact: URL expiration, recording prerequisites, parameter semantics, and return shape. The description is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter read-oriented tool, the description is nearly complete: it covers input meaning, output shape, expiration, prerequisites, and failure semantics. It does not explicitly compare to sibling tools or discuss authentication, but the output schema and self-contained nature mitigate those gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains that call_id uses a 'CAL...' format and that account_id is the CallRail account ID which auto-resolves when omitted. These details add significant meaning beyond the bare schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get the recording URL for a call.' It clearly centers on the audio recording artifact and a signed URL, distinguishing it from siblings like get_call_transcript and get_call without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful contextual conditions: recording must be enabled, calls before that time have no recording, and empty URLs indicate disabled or opted-out recordings. However, it never explicitly compares to alternatives or states when to prefer this tool over related siblings such as get_call_transcript or get_call, so routing guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_call_transcriptA
Get the AI transcript for a call. Requires CallRail Conversation Intelligence (CallScribe) to be enabled on the company at the time the call was placed.
If CallScribe was enabled AFTER the call, no transcript exists; CallRail does not retroactively transcribe.
⚠️ As of CallRail's 2026-05-21 API change, transcript data requires
a Premium Conversation Intelligence subscription; without it,
the endpoint 404s (and the transcription field on calls returns
null) even when a transcript exists. A 404 here therefore means
EITHER "no transcript for this call" OR "plan doesn't include
transcript API access"; the error envelope includes a hint.
Args: call_id: 'CAL...' id. account_id: CallRail account ID. Auto-resolves if omitted.
Returns: JSON string with the transcription including segments (text per speaker turn), per-segment confidence scores, and durations.
| Name | Required | Description | Default |
|---|---|---|---|
| call_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the dependency on CallScribe, the non-retroactive transcription policy, the 404 behavior under two different conditions, the error envelope hint, and the exact return structure (JSON with segments, confidence scores, durations). This is exceptionally transparent and helps the agent handle failures gracefully.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, warning). Every sentence contributes essential information—prerequisites, error semantics, parameter hints, return format—with no filler. The warning is appropriately highlighted with a date and a clear explanation of the 404 meaning. It is long but earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 2-parameter tool with a complex operational context (feature flags, API changes, ambiguous error codes), the description covers all necessary aspects: when to use, what to expect, error interpretation, and return structure. It even notes the output schema details (segments, confidence, durations) despite having an output schema, making it self-contained. Nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides zero description coverage, so the description must explain the parameters. It does: call_id is given a format hint ('CAL...' id) and account_id is described as auto-resolving if omitted. This adds real semantic value beyond the bare type definitions and prevents misuse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Get the AI transcript for a call'), immediately distinguishing it from related sibling tools like get_call_recording or call_summary. The purpose is unambiguous and leaves no question about what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the prerequisites (CallScribe enabled at the time of call, Premium Conversation Intelligence as of a specific date) and explains the critical 404 ambiguity, telling the agent when the tool will not work. This goes beyond vague guidance and gives clear operational constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_companyA
Get full detail for one company.
Args: company_id: 'COM...' id. account_id: Auto-resolves if omitted.
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 | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| company_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It goes beyond a generic read by revealing a non-obvious edge case: soft-deleted companies return a disabled record instead of a 404, and instructs the agent to check the status field. This is precisely the kind of behavioral gotcha that prevents incorrect handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-line purpose, an Args block, and a focused behavioral note. Every sentence contributes and the critical edge-case note is clearly separated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema, the description need not enumerate return fields. It covers what the tool does, both parameter semantics, and the one significant behavioral exception (disabled records), making it sufficient for correct invocation and response interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions are absent, but the description compensates by documenting both parameters: company_id is identified as a 'COM...' id and account_id is explained as auto-resolving when omitted. This adds real semantic value beyond the bare types and titles in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get full detail for one company.' The singular scope clearly distinguishes it from list_companies and other company operations, so an agent can identify it as the per-record detail lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for usage: when you need full detail for a single company. It does not explicitly name alternatives or state when not to use it, such as recommending list_companies for multiple companies, but the singular framing makes the intended use reasonably unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form_submissionA
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 | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| submission_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that the tool returns a JSON string and enumerates key returned fields, including the `form_data` dict, and explains the optional behavior of `account_id` auto-resolving. However, it does not mention not-found or error behavior, which would make it more complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: a one-sentence purpose, a usage context sentence, then compact Args and Returns sections. Every sentence adds value, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter retrieval tool, the description covers what the tool does, when to use it, how the parameters behave, and what the response contains. Although an output schema exists, the description's return-value details make it self-sufficient; no critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no property descriptions (0% coverage), but the description fully compensates: it documents `submission_id` as a 'FOR...' id and explains that `account_id` is a CallRail account ID that auto-resolves if omitted. This adds essential semantic meaning beyond the bare type declarations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get full detail for one form submission') and immediately distinguishes it from list-style operations by emphasizing 'one' submission and 'all submitted field data.' It also references `list_form_submissions`, making the differentiation from its closest sibling explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: fetch a single submission after seeing a submission ID via `list_form_submissions` or in a webhook callback. It does not explicitly state 'use list_form_submissions when you need multiple submissions,' but the single-vs-list distinction is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_integrationA
Get full detail for one integration.
Args: integration_id: Numeric integration id (from list_integrations). account_id: Auto-resolves if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| integration_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only says 'full detail,' implying a safe read. It does not disclose any behavioral traits such as permissions, rate limits, or side effects, which is minimal for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences and a brief args list. Every sentence adds useful information, and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown), the description does not need to explain return values. It provides essential usage details, though a minor inconsistency (numeric id vs string schema) exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description adds meaning by specifying that integration_id is numeric and from list_integrations, and that account_id is optional and auto-resolves. This adds value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full detail for one integration,' which is a specific verb+resource. It distinguishes from sibling tools like list_integrations and other get_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent to use integration_id from list_integrations and notes that account_id auto-resolves, providing context on when to use each parameter. However, it does not explicitly state when not to use the tool or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lead_timelineA
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 | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| lead_id | Yes | ||
| per_page | No | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility and does so thoroughly: it reveals cross-channel aggregation, first-touch/last-touch attribution, pagination behavior (page and per_page with max 250), account_id auto-resolution, and the exact return structure (JSON string with lead and timeline). This goes well beyond what the schema or annotations would tell an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then provides a short motivation, followed by a compact, structured Args list and a Returns section. Every sentence adds useful information; there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers all four parameters, return shape, pagination semantics, and the source of the key identifier. It also explains why the tool exists relative to the manual alternative, which gives an agent enough context to select and invoke it correctly without needing additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description compensates fully. It tells the agent that lead_id is the 'PER...' id from list_leads, that account_id auto-resolves when omitted, that per_page is the timeline page size with a 250 maximum, and that page is 1-indexed. This adds meaning far beyond the bare type declarations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Get a lead's full cross-channel activity timeline') and immediately enumerates the exact data types included: calls, form submissions, and text threads. It also distinguishes itself from sibling tools by explicitly stating it replaces the manual 'search calls by number + search forms by email' workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a clear use case: reconstructing a customer's history across channels, and names the alternative manual approach it replaces. It does not, however, explicitly list when not to use it or compare it to other sibling tools like list_calls or list_form_submissions beyond the one replacement note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sms_threadA
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 | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It specifies the returned fields and auto-resolution for account_id. It implies read-only behavior by saying 'Get', which is adequate. Could mention idempotency or side effects, but not needed for a get tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a brief Args list. It is concise, front-loaded with purpose, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not detail returns. It covers purpose, parameter usage, and sibling distinction. Complete for a straightforward get tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description explains both parameters: thread_id comes from `list_sms_threads` and account_id auto-resolves if omitted. This adds necessary context beyond the minimal schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a lead-management record for an SMS thread (notes, value, tags, lead_qualification, state). It explicitly distinguishes from the sibling tool `get_text_message` by directing users to that tool for message transcripts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains exactly when to use this tool (to get lead-management record) and when not to (for message transcripts, use `get_text_message`). This provides clear context and an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tagB
Get full detail for one tag.
Args: tag_id: Numeric tag id. account_id: Auto-resolves if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, and the description only states 'Get full detail' which implies a read operation but does not explicitly disclose behavioral traits like idempotence, side effects, permissions, or rate limits. The description carries the full burden but adds minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with no superfluous words. It uses a clear structure: a single sentence for purpose followed by a terse bullet list of arguments. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get-by-ID tool with an output schema, the description is minimally sufficient. However, it lacks any mention of preconditions (e.g., tag must exist), error scenarios, or how the returned 'full detail' relates to the output schema. The context is somewhat incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds value beyond the schema by noting that 'tag_id' is numeric (schema says string) and 'account_id' auto-resolves if omitted. However, it does not fully compensate for the 0% schema description coverage, missing details on valid values or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full detail for one tag.', specifying the verb 'get' and the resource 'tag' with scope 'one'. This distinguishes it from sibling tools like list_tags (list all), create_tag, update_tag, and delete_tag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as list_tags for retrieving all tags. The description simply describes the action without usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_text_messageA
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 | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| conversation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses that the tool returns full conversation details including all messages. It explains the conversation_id parameter format. However, it does not mention any potential side effects or limitations, but as a read operation this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with two clear sentences for purpose followed by a structured Args section. Every sentence adds value with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description does not need to detail return values. It is complete for a 'get' operation, but the missing explanation of account_id slightly reduces completeness. Overall, it adequately covers the tool's functionality.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It only describes conversation_id (with example) but omits account_id entirely, leaving its purpose unclear. This is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and the resource ('full detail for one SMS conversation, including all messages'). It distinguishes from sibling tools like list_text_messages by specifying retrieval of a single conversation with full detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when full detail of a single conversation is needed. It does not explicitly state when not to use or mention alternatives, but the context of 'Get' vs 'List' is clear from the name and sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trackerB
Get full detail for a specific tracker.
Args: tracker_id: 'TRK...' id. account_id: Auto-resolves if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | ||
| tracker_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavior. It mentions 'full detail' and auto-resolution of account_id, but fails to explain what data is returned, any permissions needed, or whether it's read-only. The phrase 'full detail' is vague.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, with a clear purpose followed by parameter notes. It front-loads the main action, though the argument format could be more structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema, the description is mostly adequate for a simple read tool. However, it lacks usage guidance and does not fully explain what 'full detail' covers, leaving some ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds value beyond the schema by noting tracker_id format ('TRK...' id) and account_id auto-resolution. However, schema coverage is 0%, so more detail would be beneficial; no mention of account_id's default null behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full detail for a specific tracker,' specifying the action and resource. It distinguishes from sibling tools like list_trackers, create_tracker, update_tracker, and delete_tracker.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like list_trackers or update_tracker. It does not specify prerequisites or context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userA
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 | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key behavior: it returns a 'JSON string' and enumerates the fields, including the 'accepted_at' null-if-pending and role enum semantics. It also notes account_id auto-resolves if omitted, which goes beyond the schema. However, it does not explicitly state whether the operation has side effects or requires particular permissions; this would have been useful but the read-only nature of 'get' reduces the gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized into a short opening sentence, Args, and Returns sections. Every sentence adds essential information: the main purpose, both parameter meanings, and the return shape. There is no fluff or repeated information, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the output schema exists (so return structure is already declared) and the tool only takes two simple parameters, the description is actually richer than needed by also listing exact response fields. It leaves no obvious gaps for correctly invoking the tool: it explains what the tool does, the parameters, and the response format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema description coverage is 0%, the description fully compensates. user_id is explained with its 'USR...' format, and account_id is described with its default behavior, 'Auto-resolves if omitted'. Both parameters get meaningful semantic information beyond the raw type definitions, which is especially important given the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Get' and resource 'one user', explicitly scoping to 'full detail' for a single user on the account. This clearly separates it from list_users and other user-related siblings, giving the agent an unambiguous understanding of what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the tool returns 'full detail for one user on the account', which implies it should be used when a single user's complete record is needed. It does not explicitly mention list_users as an alternative, but the 'one user' scope provides clear context, which is a well-defined 'when to use' signal even without an explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsA
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility. It accurately portrays the read-only nature of listing accounts and explains the output's significance. While it doesn't cover edge cases or rate limits, it is transparent about the core behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (two sentences) yet fully informative. The first sentence states the primary purpose immediately, and the second adds essential context. Every word contributes without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and an output schema exists (as indicated by context signals), the description is complete. It explains what the tool does and why the output matters, leaving no critical gaps for an agent to select or invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters, and schema description coverage is 100%. Per guidelines, a tool with no parameters receives a baseline of 4. The description does not need to add parameter-level detail because there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is specific: 'List CallRail accounts accessible to this API key.' It clearly identifies the action (list), the resource (accounts), and the scope (accessible to this API key). It also explains the critical role of the returned `id` field, distinguishing this tool from other list tools such as list_companies or list_calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context about typical usage ('Most users have one account per agency') and hints that it is a prerequisite for other tools via the auto-resolved account_id. However, it does not explicitly state when to use or avoid this tool, nor does it compare it directly to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_callsA
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| page | No | ||
| fields | No | ||
| source | No | ||
| answered | No | ||
| end_date | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No | ||
| start_date | No | ||
| answer_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description fully discloses important behaviors: pagination, default values (days=7, end_date=today), the client-side filtering of `source` and its impact on `total_records`/`total_pages`, the deprecated `answered` parameter and its mapping, and the fact that `source` is not a server-side filter, so results may be unfiltered if used incorrectly. This is transparent about edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear overview and a detailed args list, but it is lengthy due to the extensive parameter documentation. The key points are front-loaded, and the detail is necessary given the lack of schema descriptions, but it could be tightened by removing some redundancy in the `fields` example list. Still, it is well-organized and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is highly complete for a complex tool with 11 parameters and an output schema. It covers parameter behavior, defaults, edge cases, and even directs to alternative tools for better functionality (e.g., `call_stats` for source breakdowns). The output schema presumably covers the response format, so nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% coverage (no descriptions within the schema), so the tool description must fully document each parameter. It does so comprehensively: explains `account_id` auto-resolution, `days` lookback, `start_date`/`end_date` formats, `answer_status` server-side filter, `answered` deprecation, `source` client-side behavior, `per_page` max, `page` 1-indexed, and `fields` comma-separated list with examples. This goes well beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly indicates the tool lists calls, with explicit mention of pagination and filterable parameters (company, date window, answer status). It stands out from siblings like get_call (which retrieves a single call) and search_calls_by_number, providing a distinct purpose of listing many calls with filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: explains that `days` is ignored if `start_date` is provided, that `source` is applied client-side and explains its limitations, and that `answered` is deprecated in favor of `answer_status`. It also clarifies when to use `call_stats(group_by='source')` for source breakdowns, offering alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_companiesA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| status | No | ||
| per_page | No | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and handles it well. It discloses default filtering behavior, pagination semantics, the 250-item limit, the meaning of 'active' (excludes disabled/soft-deleted), and the previously missing ability to fetch page 2. This is strong transparency for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core operation, and followed by a clear Args block. Every sentence adds value, including the brief historical note about page 2, which clarifies an important capability without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All optional parameters are documented with defaults and edge cases, and the output schema exists to cover return values. For a simple listing tool, the description leaves no significant operational detail missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, leaving the parameters otherwise opaque. The Args block compensates by explaining all four parameters: account_id auto-resolution, per_page maximum, status values/defaults, and page indexing/pagination usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'List companies (client businesses) under a CallRail account.' This clearly distinguishes the tool from list_accounts, list_trackers, and other listing siblings by identifying the exact entity type and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear invocation context: account_id auto-resolves, per_page has a documented max, status has defined defaults, and page is explicitly needed when an agency has more companies than per_page. It does not name alternative tools or explicit when-not-to-use cases, but provides solid situational guidance for the parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_form_submissionsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| page | No | ||
| fields | No | ||
| end_date | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses pagination, filtering, default values, and return format. It also notes that account_id auto-resolves. This is transparent for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an Args section and Returns section. It is slightly long but each sentence serves a purpose. Could be trimmed slightly but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters (0 required) and an output schema, the description thoroughly covers pagination, filtering defaults, and return structure. It is complete for an agent to use without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description explains each parameter's meaning, defaults, and behavior (e.g., days ignored if start_date provided, account_id auto-resolves, fields list). This adds substantial value beyond the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List form submissions captured by CallRail's Form Tracking,' which is a specific verb and resource. It distinguishes from siblings like get_form_submission (singular) and create_form_submission.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions pagination and filtering but does not explicitly tell when to use this tool versus alternatives like get_form_submission or create_form_submission. Usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_integrationsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full transparency burden. It discloses the 400 error without company_id, the account-level limitation, auto-resolution of account_id, and pagination semantics, all of which go beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sections: one scoping sentence and a terse Args list. No filler, and the most decision-critical information (required company_id) is front and prominent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward list operation with an output schema and no nested objects, the description supplies everything needed to call it correctly: required argument, failure mode, pagination behavior, and account resolution. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document parameters, and it covers all four. company_id gets a format ('COM...'), requiredness rationale, and failure mode; per_page and page get limits/indexing; account_id gets fallback behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List integrations attached to one company,' with concrete examples (GMB, Google Ads, Facebook, Slack, Webhooks). The one-company scope and explicit exclusion of account-level listing clearly distinguish it from broader sibling list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context: the endpoint is company-scoped, account-level listing is not supported, and company_id is mandatory. It doesn't name a specific alternative tool for account-level needs, but the scope guidance is strong enough to prevent misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leadsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does well by disclosing that leads are deduplicated across channels, that account_id auto-resolves when omitted, that per_page is capped at 250, and by describing the exact response shape and lead fields. It does not mention auth requirements or ordering, but for a read/list operation the disclosed behavior is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with an intro, a clarifying concept sentence, an Args block, and a Returns block. Each section earns its place, and the key defining trait (deduplicated person record) is front-loaded. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with four optional parameters and no annotations, the description is remarkably complete: it defines the resource, explains the deduplication behavior, documents every parameter, specifies pagination constraints, and lists the return fields. There is no obvious missing information an agent would need to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the bare schema. It does: account_id 'auto-resolves if omitted,' company_id 'filter to one company,' per_page 'page size (max 250),' and page '1-indexed.' This adds real semantic value beyond the parameter names and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List leads (unique people) across calls, forms, and texts.' It then defines a lead as CallRail's deduplicated person record, which clearly distinguishes this tool from raw call, form, and text listers among the siblings. The mention of get_lead_timeline for cross-channel history further sharpens the tool's identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what list_leads returns and explicitly points to get_lead_timeline when a lead's full history is needed, providing a clear alternative. It does not exhaustively enumerate when not to use the tool versus list_calls, list_form_submissions, or list_text_messages, but the deduplication framing makes the intended use case evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notificationsA
List notification rules on the account.
Args: company_id, user_id: Optional filters. per_page: Page size (max 250). page: 1-indexed. account_id: Auto-resolves if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| user_id | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Discloses pagination details (page size, index) and auto-resolution behavior but does not mention read-only nature, auth requirements, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Structured with bullet-like listing of parameters. While not overly long, the 'Args:' prefix adds minimal value. Could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description adequately covers parameters and pagination. Lacks context about what a notification rule is or authentication prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully explains each parameter's purpose and behavior (e.g., optional filters, page size max, page index, auto-resolution).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists notification rules on the account, and mentions optional filters. It is specific but does not explicitly differentiate from sibling list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context for optional filters and auto-resolution of account_id, but no guidance on when to use this tool versus alternatives like other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sms_threadsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It signals a read-like operation by listing, and it documents pagination (`per_page` max 250, page 1-indexed) and auto-resolution of `account_id`. It also indicates the return type is per JSON string, which is useful. It stops short of explicitly stating the operation is read-only, but the verb and mention of an update separate centrally-con noted the distinction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into a main purpose sentence, a short argument list, and a return section. The opening contrast with a sibling tool is front-loaded and efficient. The block format is easy to parse, though it is a bit long because of the every-parameter details. Overall, each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully specifies how to call the tool, what each parameter means, and what will be returned (the full shape of each `sms_thread`). It covers pagination, auto-resolution, and the distinction from a sibling, leaving no critical gap for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description provides meaningful semantics for every parameter: `account_id` auto-resolver, `company_id` filters to a company, `per_page` page size and max 250, `page` 1-indexed. This goes far beyond the bare property titles and fully compensates for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'List SMS threads' — a clear verb-product pair — and immediately distinguishes from `list_text_messages` by noting the latter returns conversation transcripts while threads carry the lead-management surface (notes, value, tags, lead_qualification, state). This lets an agent pick the correct listing tool without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts with `list_text_messages` and mentions that threads are updatable via `update_sms_thread`, giving context for when to use this list and when not. It does not mention `get_sms_thread` for fetching a single thread, so the guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsC
List all tags in the account, or filtered to one company.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavior. It only states the basic operation without mentioning pagination, rate limits, or what happens with empty results. The read-only nature is implied but not confirmed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise at one sentence, but it sacrifices critical information for brevity. It lacks structure (e.g., front-loading the most important usage context) and omits necessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 4 parameters, 0% schema coverage, and no annotations, the description should fully describe behavior and parameters. It only covers the company filter, leaving pagination and account scope undocumented. Output schema exists but is not referenced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain all parameters. It only mentions company_id (filter), ignoring page, per_page, and account_id. This leaves 3 of 4 parameters completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all tags, optionally filtered to one company. It distinguishes from sibling tools like get_tag (single tag) and create/delete/update tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use it (list all tags or filter by company) but lacks explicit when-not or alternative tools. The sibling context helps, but the description alone is insufficient for clear decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_text_messagesA
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 | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| page | No | ||
| end_date | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers pagination, auto-resolution of account_id, date window behavior, and return format. It notes potential 403 errors for missing A2P permission, but lacks explicit read-only declaration or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear one-liner, organized Args and Returns sections. Every sentence adds value; no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and output schema, the description covers pagination, filtering, and permission notes. Could include more edge cases (e.g., empty results) or detailed conversation structure, but adequate overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully documents all 7 parameters, including defaults, format, and behavior (e.g., days ignored if start_date provided). Adds significant semantic value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists SMS/text message conversations via CallRail trackers, with pagination and filtering. It distinguishes from siblings like get_text_message (single message) and list_calls (calls).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use (listing messages) and mentions prerequisites (A2P permission for outbound) and references create_text_message for more info. It does not explicitly name alternatives but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_trackersA
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| status | No | ||
| per_page | No | ||
| account_id | No | ||
| company_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses key behaviors: status default returns all including soft-deleted/disabled, account_id auto-resolves. However, it does not mention pagination behavior beyond page size, permission requirements, or whether it's a read-only operation (though implied).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a brief introduction followed by a parameter list. It avoids fluff, but the parameter list could be more structured (e.g., using bullet points). Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema (not shown but indicated), the description covers essential aspects: what the tool does, parameter semantics, and key defaults. It does not explain return format, but the output schema handles that. Minor gaps include lack of usage guidelines and more detailed behavioral context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It adds significant meaning: account_id auto-resolves if omitted, company_id filters to one company, per_page max size 250, page 1-indexed, status defaults to None with common values 'active' and 'disabled'. This greatly aids parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists tracking phone numbers (trackers) and explains what a tracker is. It uses specific verb 'list' and resource 'trackers', distinguishing it from siblings like get_tracker (single) and create_tracker (create).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool vs alternatives. It implies usage when you need a list of trackers, but lacks guidance on when to use list_trackers versus get_tracker or create_tracker. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersA
List all users on the account. Returns a single page of up to
MAX_PER_PAGE users (no pagination support; adequate for small and
medium agency accounts).
Args: account_id: CallRail account ID. Auto-resolves if omitted.
Returns:
JSON string with users[]. Each user has id ('USR...'),
email, first_name, last_name, role
('admin' | 'manager' | 'reporting'), accepted_at, time_zone,
and company_ids[] the user has access to.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses that the tool returns a single page of up to MAX_PER_PAGE users with no pagination support, which is a key behavioral trait. It also details the return format (JSON string with users[] and each user's fields). It does not mention side effects, but as a read-only listing operation that is largely self-evident from the verb 'list'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with an initial purpose sentence, then an Args section and a Returns section. The first sentence front-loads the purpose and the pagination limitation. While it is a bit detailed, each piece of information (parameter semantics, return structure, field types) earns its place. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one optional parameter. The description covers the parameter, the return format (including all fields and their types), and the pagination limitation. It also explains the auto-resolution behavior. For its complexity, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides only account_id with no description (0% schema coverage). The description compensates fully: it explains what account_id is ('CallRail account ID') and that it auto-resolves if omitted, which is crucial for the agent to know the parameter is optional and how it behaves. This is a clear value-add beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all users on the account.' This clearly distinguishes it from siblings like get_user (single user) and other list_* tools by resource. It also adds scope detail (single page, no pagination) which further clarifies its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a usage context by stating 'adequate for small and medium agency accounts' and notes the lack of pagination, implying it is not suitable for large accounts. However, it does not explicitly name alternatives (e.g., get_user for a single user) or state when to use this tool versus others. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_call_tagsA
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 | Required | Description | Default |
|---|---|---|---|
| tags | Yes | ||
| call_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are missing, so the description carries the full burden. It discloses idempotent behavior, case-sensitivity, and silent success for missing tags, which are exactly the kind of edge-case behaviors an agent needs. It does not mention potential side effects or permission requirements, but the disclosed behavior is meaningfully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the primary purpose in the first sentence and critical edge-case behavior in a short second paragraph. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tag-removal operation with an output schema present, the description covers purpose, required behavior, and key edge cases. The only notable gap is the undocumented account_id parameter, but the tool still remains largely understandable and callable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds useful semantics for 'tags' (case-sensitive, empty/whitespace entries ignored) and partially clarifies call_id via 'from a call', but it never explains the account_id parameter, leaving one of three parameters entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('remove specific tags') and the resource ('a call'). It also clarifies case-sensitivity on tag name, which distinguishes it from more generic tag-related tools like delete_tag or update_tag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for removing already-attached tags from a call, and it provides behavioral details like idempotency. It does not explicitly name alternatives or exclusion conditions, but the context is sufficient for selecting this tool over siblings like add_call_tags.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_calls_by_numberA
Find calls from/to a specific phone number. Matches on the last 10 digits
of the stored customer_phone_number so any format works.
Args: phone_number: Any format, normalized to digits-only. Must contain at least 7 digits to avoid false positives. account_id: Auto-resolves. company_id: Optional company filter. days: Lookback window (default 90).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| account_id | No | ||
| company_id | No | ||
| phone_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It discloses key behavior: last-10-digit matching, normalization to digits-only, a 7-digit minimum to avoid false positives, account_id auto-resolution, and default lookback window. It doesn't mention pagination/rate limits, but this is a read/search operation and output schema covers returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-sentence purpose, followed by a tight Args block. No filler; each line conveys a distinct constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter search tool with no annotations and an output schema, this is nearly complete: purpose, all parameters, matching behavior, and lookback are covered. It would be slightly stronger with an explicit alternative/when-not-to-use, but nothing essential to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description documents every parameter with operational detail: phone_number format and minimum length, account_id auto-resolution, company_id as optional filter, and days as lookback with default. This is exactly the compensation needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact operation ('Find calls from/to a specific phone number') and resource ('calls'), plus matching semantics (last 10 digits). This distinguishes it from list_calls/get_call at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage when an agent has a phone number and needs related calls, and describes input constraints (at least 7 digits). However, it does not explicitly name sibling alternatives like list_calls/get_call or state when not to use them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spam_detectorA
Heuristically identify likely-spam calls and (optionally) tag them.
Spam scoring (additive): +2 if duration < 10 seconds +1 if not answered +1 if first_call AND duration < 30 seconds +1 if same caller appears >=3 times in window (likely auto-dialer) A call scoring >= 3 is flagged as likely spam.
Args:
company_id: Restrict to one company (recommended).
days: Lookback window (1-90; 90 is hard-capped to avoid memory
blowup on high-volume clients: full call list is materialized
for scoring before truncating the response).
auto_tag: If True, ADD tag_name to each likely-spam call after
the scan. Default False (preview only). Note: we deliberately
do NOT mark calls as spam=True automatically: CallRail
HIDES spam-flagged calls from default GET endpoints, so
self-reviewing them later becomes painful. Tag first, manually
spam-flag if confirmed.
tag_name: The tag to add when auto_tag=True. Default
'auto_detected_spam'. Auto-creates the tag at company level
if it doesn't exist (CallRail's behavior).
account_id: Auto-resolves if omitted.
Returns: - score breakdown by call - histogram of caller phone numbers (so you can spot a single dialer hammering you) - if auto_tag: count tagged + failures
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| auto_tag | No | ||
| tag_name | No | auto_detected_spam | |
| account_id | No | ||
| company_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries full burden and it delivers exceptionally. It discloses the memory blowup risk and hard cap on days, the deliberate decision NOT to auto-set spam=True (because CallRail hides spam-flagged calls from GET endpoints), and the side effect that auto_tag auto-creates the tag at company level. This is model behavioral transparency — it explains design rationale and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: the scoring heuristic is essential, the Args block maps to all 5 params, and the behavioral caveats (memory cap, hidden spam-flag side effect) are necessary for correct use. It is front-loaded with the purpose line, then structured by scoring, args, and returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with high complexity (heuristic scoring, side effects, memory constraints), 0% schema coverage, and no annotations, the description covers everything an agent needs: purpose, scoring rules, all parameter semantics, side effects, design rationale, and a Returns section that explains score breakdown, histogram, and tag counts. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate — and it does. Every parameter gets meaning beyond the schema: company_id is 'recommended', days has a 1-90 range with hard cap rationale, auto_tag explains the preview-vs-mutation distinction, tag_name explains auto-creation behavior, and account_id auto-resolves if omitted. The scoring rule section also connects days and duration semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Heuristically identify likely-spam calls and optionally tag them') and then gives the exact additive scoring heuristic. It clearly distinguishes itself from siblings like get_call (single-call retrieval), search_calls_by_number (number lookup), and call_summary — an agent can tell this is a bulk heuristic classifier, not a lookup or summary tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context: recommends company_id for scoping, explains days lookback window bounds, and distinguishes preview mode (auto_tag=False) from mutation mode (auto_tag=True). However, it never explicitly names alternatives or says when NOT to use it versus siblings like list_calls or search_calls_by_number. The distinctiveness is implied by the heuristic description rather than stated as exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_callA
Update an existing call: notes, tags, spam flag, customer name, lead status.
Args:
call_id: 'CAL...' id of the call to update.
account_id: Auto-resolves if omitted.
note: Replace the call's note text.
tags: REPLACE the call's tag list with this set of tag names.
(Use add_call_tags/remove_call_tags for additive changes.)
spam: True to mark as spam, False to unmark. Note: spam-flagged calls
are HIDDEN from default GET endpoints; re-reads will 404. Tag
the call BEFORE flagging spam if you need both.
customer_name: Override the auto-detected caller name.
lead_status: e.g. 'good_lead', 'not_a_lead', 'unknown'.
Note: value is intentionally NOT exposed here. CallRail's API returns
a 500 server error when value is included in the PUT body to /calls
(verified via live testing 2026-04-24). It IS supported on form
submissions. See update_form_submission.
Empty-string fields (e.g. note="") are rejected because CallRail
interprets them as "clear this field", which is almost always a mistake.
To intentionally clear a field, set it to None and use a separate UI
operation, or contact CallRail support.
Length caps (rejected pre-network):
- note: 4000 chars
- customer_name: 200 chars
- tags: 100 entries max
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| spam | No | ||
| tags | No | ||
| call_id | Yes | ||
| account_id | No | ||
| lead_status | No | ||
| customer_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description extensively discloses hidden behaviors: spam-flagged calls are hidden from GET endpoints (causing 404s), `value` causes a 500 error, and empty-string fields are rejected. This is rich behavioral context that the agent needs to avoid failures, though it doesn't cover all potential edge cases (e.g., response specifics).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but well-organized with clear sections (Args, Note, Length caps). It front-loads the core purpose and then provides necessary caveats. Some redundancy exists (e.g., empty-string rule is stated twice), but overall it's efficient given the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 7 parameters, 0% schema coverage, and no annotations, the description covers all critical aspects: field semantics, behavioral traps, length caps, and alternatives. An output schema exists, so return-value details are not needed here. The agent has everything to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description carries all parameter meaning. It explains each parameter's purpose (e.g., `tags` replace the full tag list, `spam` toggles flagging) and adds crucial caveats like the `note` field's 4000-char limit and the `customer_name` 200-char cap. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Update') and resource ('existing call'), and enumerates the exact fields it can modify: notes, tags, spam flag, customer name, lead status. This differentiates it from siblings like `bulk_update_calls` (batch) or `add_call_tags`/`remove_call_tags` (additive tag changes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use `add_call_tags`/`remove_call_tags` for additive tag changes, and warns against using `value` (pointing to `update_form_submission`). It also provides behavior guidelines like tagging before flagging spam and avoiding empty-string clears, giving clear when/to/not-to context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_companyA
Update mutable settings on a company. Pass None to leave a field unchanged; only fields with explicit values are sent in the PUT body.
CRITICAL: Any boolean toggle you set will OVERRIDE current state.
If a company has CallScribe enabled and you call
update_company(name='New Name') without passing
callscribe_enabled, CallScribe stays on. But passing
callscribe_enabled=False will DISABLE CallScribe (a paid
feature). Be deliberate with bool args.
Empty-string name / time_zone are rejected (almost always a
mistake; pass None to leave them alone).
Args:
company_id: 'COM...' id.
name: New display name. Empty string rejected. Max 255 chars.
time_zone: IANA tz string (e.g. 'America/New_York').
callscore_enabled: Lead-scoring AI feature. PAID add-on.
lead_scoring_enabled: Older lead-scoring system.
swap_exclude_jquery: Skip jQuery initialization in DNI script.
callscribe_enabled: Conversation Intelligence (transcripts +
keyword spotting). PAID feature.
keyword_spotting_enabled: DEPRECATED by CallRail. Accepted for
compatibility but has no effect.
swap_exclude_jquery: DEPRECATED by CallRail (the DNI script no
longer needs jQuery). Accepted but has no effect.
form_capture: Enable CallRail Form Tracking on this company.
Sent as CallRail's external_form_capture PUT field.
account_id: CallRail account ID. Auto-resolves if omitted.
Returns: JSON string with the updated company object.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| time_zone | No | ||
| account_id | No | ||
| company_id | Yes | ||
| form_capture | No | ||
| callscore_enabled | No | ||
| callscribe_enabled | No | ||
| swap_exclude_jquery | No | ||
| lead_scoring_enabled | No | ||
| keyword_spotting_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses PUT merge behavior, boolean override risk, empty-string rejection, deprecations, field mapping, and account auto-resolution. This is unusually transparent for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well organized with a critical warning, an Args block, and a Returns line; most content earns its place. The duplicate swap_exclude_jquery entry is redundant and could be merged, and the warning section could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation with no annotations and no schema descriptions, the description is nearly complete: all parameters, edge cases, deprecations, and return type are addressed. The contradictory swap_exclude_jquery duplicate leaves one parameter ambiguous, and permission requirements are not stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description compensates richly for every parameter with constraints, examples, paid status, deprecation notes, and field mapping. One blemish is the duplicated and internally contradictory swap_exclude_jquery entry: it is described both as 'Skip jQuery initialization' and as having no effect, which blurs that parameter's true behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: 'Update mutable settings on a company.' It clearly differentiates from read-only get_company, create_company, and delete_company siblings by focusing on mutable settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage semantics: pass None to leave fields unchanged, only explicit values are sent, and booleans override current state, with a concrete CallScribe example. It does not explicitly name alternatives or state when not to use this tool, but the context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_form_submissionA
Update an existing form submission: notes, tags, value, spam, lead status.
Args:
submission_id: CallRail form-submission id (prefix 'FOR...').
account_id: Auto-resolves if omitted.
note, tags, value, spam, lead_status: same semantics as update_call.
Empty-string fields (e.g. note="") are rejected to prevent accidental
field-clearing. See update_call docstring.
Length caps (rejected pre-network):
- note: 4000 chars
- tags: 100 entries max
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| spam | No | ||
| tags | No | ||
| value | No | ||
| account_id | No | ||
| lead_status | No | ||
| submission_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses important pre-network behaviors: empty-string fields are rejected to prevent accidental clearing, length caps exist for note and tags, and account_id auto-resolves if omitted. It doesn't specify merge/replace semantics for partially updated fields, though the update_call reference partially compensates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized with a summary sentence, an args section, and clearly separated validation notes. Every sentence adds operational value, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param mutation with no annotations, the description covers purpose, parameter basics, and critical validation behaviors, while the output schema covers return values. The main gap is reliance on update_call for the exact semantics of shared fields, so it isn't fully standalone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds non-schema facts: submission_id uses 'FOR...' prefix, account_id auto-resolves, and note/tags have length caps. The remaining five parameters are delegated to update_call, which is helpful but not fully self-contained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Update an existing form submission', and enumerates the mutable fields (notes, tags, value, spam, lead status). This clearly differentiates it from siblings like create_form_submission and update_call by object type and action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The first sentence establishes clear context for use: modifying an already-existing form submission. It doesn't explicitly name when-not-to-use or alternatives, but cross-referencing update_call and identifying submission_id/account_id provides adequate contextual steering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_notificationA
Update a notification rule. Pass None to leave a field unchanged; only fields with explicit values are sent in the PUT body.
Notification rules trigger emails / desktop pushes / SMS when calls
or form submissions match conditions. Use this to rewire targets,
change triggering events, or silence a noisy rule without deleting
it (set all send_* to False).
Args:
notification_id: Notification rule ID.
name: Display name for the rule.
alert_type: Common values: 'all_calls', 'first_time_callers',
'missed_calls', 'voicemails', 'all_texts',
'first_time_texters', 'all_form_submissions' (same set as
create_notification). Plan-specific: unknown values warn
but do not reject.
send_email: Send email notification.
send_desktop: Send desktop browser push.
send_push: Send mobile push notification.
call_enabled: Trigger on call events.
sms_enabled: Trigger on SMS events.
email: Override target email (defaults to user's primary).
Validated as RFC-822-ish.
account_id: CallRail account ID. Auto-resolves if omitted.
Returns: JSON string with the updated notification rule.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| No | |||
| send_push | No | ||
| account_id | No | ||
| alert_type | No | ||
| send_email | No | ||
| sms_enabled | No | ||
| call_enabled | No | ||
| send_desktop | No | ||
| notification_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers strongly: it discloses the None-skip semantics, partial PUT body behavior, plan-specific warning behavior, email override defaults, account_id auto-resolution, and the return type. This is rich behavioral context beyond what the schema or annotations could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a front-loaded core behavior (None semantics) followed by context and an Args block. It is slightly verbose in places—e.g., some parameter descriptions like 'send_email: Send email notification' merely restate the name—but overall the organization and length are reasonable for a 10-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, single-required-parameter tool with no annotations, the description covers every param, gives usage examples, explains edge cases (None, plan-specific unknowns, account auto-resolution), and even notes the return format. The output schema exists, so return details need not be fully described, but the description still provides sufficient information for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all 10 parameters. It does so extensively: alert_type lists common values, email explains the override and validation, account_id notes auto-resolution, and send_* fields are tied to the silencing workflow. This adds significant meaning beyond the bare schema types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update a notification rule,' a specific verb+resource statement that immediately establishes the tool's purpose. It further differentiates itself from siblings by contrasting with deletion ('without deleting it') and referencing the shared alert_type set with create_notification, so an agent can distinguish it from create/delete/list variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 're wire targets, change triggering events, or silence a noisy rule without deleting it.' It mentions the alternative of deletion, but does not explicitly call out create_notification as the alternative for new rules. Still, the context strongly implies the update-vs-create boundary, making the usage guidance clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sms_threadA
Update an SMS thread's lead-management fields. This is the texting
equivalent of update_call. Closes the gap where texting leads
couldn't be tagged / noted / qualified via API.
Args:
thread_id: Thread id (from list_sms_threads).
notes: Note text (max 4000 chars). Empty string rejected.
value: Numeric lead value.
tags: Tag names to apply (max 100).
append_tags: If True (default), tags are ADDED to existing
ones (CallRail's append_tags flag). If False, tags
REPLACES the thread's tag list.
lead_qualification: e.g. 'good_lead', 'not_a_lead'. Values are
plan-configurable so unknown strings are passed through.
account_id: Auto-resolves if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| notes | No | ||
| value | No | ||
| thread_id | Yes | ||
| account_id | No | ||
| append_tags | No | ||
| lead_qualification | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It supplies meaningful behavioral detail: append_tags toggles between adding tags and replacing the thread's entire tag list, empty notes are rejected, tags are capped at 100, account_id auto-resolves, and unknown lead_qualification values are passed through. It could further disclose mutation/reversibility implications or response behavior, but it is well above a minimal description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and sibling relation, then uses a clean Args block to enumerate parameters without redundancy or filler. Each sentence adds either purpose context or needed constraints; nothing needs to be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and an output schema present, the description is complete: it explains every parameter, key constraints, the append/replace semantic, and the relationship to update_call. Return values are covered by the existing output schema, so no extra return-format prose is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates. Every parameter is explained beyond the raw schema: thread_id's source, notes length and empty-string rejection, value as numeric, tags count limit, append_tags flag behavior, lead_qualification's configurable values, and account_id auto-resolution. This is exactly the kind of parameter semantics an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Update an SMS thread's lead-management fields.' It distinguishes itself from the closest sibling by explicitly framing itself as 'the texting equivalent of update_call' and by naming the exact gap it fills ('texting leads couldn't be tagged / noted / qualified via API'). An agent can identify what this tool does and how it differs from update_call without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly identifies the intended context: updating an SMS thread's lead-management fields rather than a call's, and points to update_call as the call-side equivalent. It does not, however, give explicit exclusions or a 'when not to use' statement, nor does it mention alternatives for read-only thread operations like get_sms_thread/list_sms_threads, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tagA
Rename or recolor a tag.
Args: tag_id: Numeric tag id. account_id: Auto-resolves if omitted. name: New display name. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| color | No | ||
| tag_id | Yes | ||
| account_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions that account_id auto-resolves if omitted, which is a useful behavioral detail. However, it does not disclose error behavior (e.g., if tag_id not found), idempotency, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences with a bulleted parameter list. Every word serves a purpose, with no redundancy or fluff. It is front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the availability of an output schema, the description need not cover return values. However, it omits prerequisites (e.g., tag must exist) and potential side effects. For a simple update tool, it is adequate but not fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description adds significant value by explaining each parameter: tag_id is numeric, account_id auto-resolves, name is a display name, color lists valid options. This compensates well for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Rename or recolor a tag.' which is a specific verb and resource. It clearly indicates the tool updates an existing tag, distinguishing it from create, delete, get, and list operations among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives (e.g., add_call_tags for assigning tags to calls). It only implies usage for updating tag properties but lacks when-not or exclusion context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_trackerA
Update 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| account_id | No | ||
| tracker_id | Yes | ||
| sms_enabled | No | ||
| greeting_text | No | ||
| whisper_message | No | ||
| destination_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the dangerous side effect of updating only greeting_text (replaces entire call_flow object, zeroes destination), notes that setting status is silently ignored, and clarifies that updating destination_number also updates the call_flow's destination. These are important behavioral traits that an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary line, an Args list, field-level rules, and a NOTE. It is front-loaded with the primary purpose, and every sentence adds value without redundancy. Though long, the length is justified by the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and a known dangerous side effect, the description covers all essential context: parameter rules, side effects, alternatives for disabling, and a note about ignored fields. Since an output schema exists, return values are not needed. The description is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain every parameter. It does: tracker_id, account_id (auto-resolves), name, destination_number (with example), whisper_message, greeting_text (with critical dependency), and sms_enabled. It also states field-level rules (non-empty strings, pass None to leave unchanged). This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates a tracker's mutable settings and lists the specific fields (name, destination, whisper, greeting, SMS). It differentiates from siblings by naming delete_tracker as the alternative for disabling, and mentions the underlying API behavior. The purpose is unambiguous and distinguishes this tool from other update_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it notes that setting status is silently ignored, so to disable a tracker you should use delete_tracker, and for permanent removal contact support. It also provides a critical usage rule: if greeting_text is supplied, destination_number must also be supplied to avoid zeroing out the destination. This is clear, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_userA
Update mutable user fields. Pass None to leave unchanged.
Args: user_id: 'USR...' id. company_ids: REPLACES the user's company access list (additive modification not exposed; for additive use the CallRail UI).
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | ||
| No | |||
| user_id | Yes | ||
| last_name | No | ||
| account_id | No | ||
| first_name | No | ||
| company_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It reveals key behavior: company_ids REPLACES the list (destructive). It also implies other fields are individually updated. However, it could mention idempotency or other side effects. Still, it provides significant transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: two sentences plus parameter explanations. Every part adds value with no fluff. It front-loads the core purpose, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 7 parameters and an output schema. The description covers key behavioral aspects (null handling, replacement behavior) but does not detail all parameters' semantics. The output schema reduces the need for return value explanation, so this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema by explaining the user_id format ('USR... id') and the replacement behavior for company_ids. For other parameters (role, email, etc.), no additional info is given beyond schema defaults. Given 0% schema coverage, this partial compensation earns a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (update) and the resource (user fields) with the instruction 'Pass None to leave unchanged,' making the purpose immediately apparent. It effectively distinguishes from sibling tools like create_user, delete_user, and get_user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Update mutable user fields' defines when to use, and the note about company_ids replacing the list with an alternative for additive modifications ('for additive use the CallRail UI') tells when not to use this tool. This aligns with the dimension's criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
usage_summaryA
Per-company cost-attribution summary for the current cycle.
Aggregates active trackers + per-company call minutes and projects what each client is contributing to the agency's CallRail bill. Useful for:
Deciding which client to renegotiate / upsell / drop
Sanity-checking the upcoming invoice
Quarterly reviews
Pricing assumes Call Tracking Starter ($50 base + 5 numbers + 250 mins bundled; $3/local number, $5/toll-free number, $0.05/local minute, $0.08/toll-free minute over bundle). Edit PRICING_* constants in server.py if you're on a different plan.
Args:
account_id: Auto-resolves if omitted.
days: Lookback window in days (default 30 = roughly one cycle).
Ignored if start_date provided.
start_date: 'YYYY-MM-DD'.
end_date: 'YYYY-MM-DD' (defaults to today).
Returns:
- agency: plan + totals + bundle utilization + cycle estimate
- by_company[]: each company's minutes, active numbers, cost share
(sorted by cost-share descending)
- biggest_cost_driver: name of top company
- partial_failures[]: per-company API errors. Each entry carries
partial_calls_before_failure, partial_minutes_before_failure,
partial_local_numbers, partial_tollfree_numbers so an under-
reporting agency_total is observable, not silent.
- notes: caveats about the cost model (toll-free minute pricing
not yet differentiated; SMS not included).
Cost shares sum exactly to agency.estimated_cycle_total via largest-
remainder rounding.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| end_date | No | ||
| account_id | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description thoroughly covers pricing assumptions, auto-resolution of account_id, parameter interactions, return structure with partial_failures, and limitations (SMS not included, pricing not fully differentiated).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: purpose sentence, bullet list of uses, pricing note, parameter details, output breakdown. Every sentence is informative without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, and description fully explains return fields, including partial_failures, cost-share rounding, and notes. Covers all aspects needed for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description adds valuable meaning: auto-resolve for account_id, lookback behavior for days, format for dates, and precedence rules (days ignored if start_date provided).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it's a 'per-company cost-attribution summary' and lists specific use cases (renegotiation, invoice sanity check, quarterly reviews), distinguishing it from siblings like call_summary or compare_periods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit scenarios when to use the tool (client decisions, invoice checks, reviews). Lacks explicit 'when not to use' or direct alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.2.2- Changed
bulk_update_calls1 field changed- added
Input schema / properties / answer_statusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Answer Status" +}
- Changed
call_timeseries1 field changed- added
Input schema / properties / intervalAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Interval" +}
- Changed
create_outbound_call10 fields changed- added
Input schema / properties / business_phone_numberAdded value: +{ + "title": "Business Phone Number", + "type": "string" +} - added
Input schema / properties / caller_idAdded value: +{ + "title": "Caller Id", + "type": "string" +} - removed
Input schema / properties / company_idRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Company Id" -} - added
Input schema / properties / customer_phone_numberAdded value: +{ + "title": "Customer Phone Number", + "type": "string" +} - removed
Input schema / properties / from_numberRemoved value: -{ - "title": "From Number", - "type": "string" -} - added
Input schema / properties / outbound_greeting_recording_urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Outbound Greeting Recording Url" +} - added
Input schema / properties / outbound_greeting_textAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Outbound Greeting Text" +} - added
Input schema / properties / recording_enabledAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Recording Enabled" +} - removed
Input schema / properties / to_numberRemoved value: -{ - "title": "To Number", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "from_number", - "to_number" -]New value: +[ + "caller_id", + "business_phone_number", + "customer_phone_number" +]
- Removed
get_webhook - Changed
list_calls1 field changed- added
Input schema / properties / answer_statusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Answer Status" +}
- Removed
list_webhooks
10 tool updates
v1.0.4- Added
call_stats - Added
call_timeseries - Added
form_stats - Added
get_call_page_views - Added
get_lead_timeline - Added
get_sms_thread - Changed
list_companies1 field changed- added
Input schema / properties / pageAdded value: +{ + "default": 1, + "title": "Page", + "type": "integer" +}
- Added
list_leads - Added
list_sms_threads - Added
update_sms_thread
50 tool updates
v1.0.0- First observed
add_call_tags - First observed
bulk_update_calls - First observed
call_eligibility_check - First observed
call_summary - First observed
compare_periods - First observed
create_company - First observed
create_form_submission - First observed
create_notification - First observed
create_outbound_call - First observed
create_tag - First observed
create_tracker - First observed
create_user - First observed
delete_company - First observed
delete_notification - First observed
delete_tag - First observed
delete_tracker - First observed
delete_user - First observed
get_call - First observed
get_call_recording - First observed
get_call_transcript - First observed
get_company - First observed
get_form_submission - First observed
get_integration - First observed
get_tag - First observed
get_text_message - First observed
get_tracker - First observed
get_user - First observed
get_webhook - First observed
list_accounts - First observed
list_calls - First observed
list_companies - First observed
list_form_submissions - First observed
list_integrations - First observed
list_notifications - First observed
list_tags - First observed
list_text_messages - First observed
list_trackers - First observed
list_users - First observed
list_webhooks - First observed
remove_call_tags - First observed
search_calls_by_number - First observed
spam_detector - First observed
update_call - First observed
update_company - First observed
update_form_submission - First observed
update_notification - First observed
update_tag - First observed
update_tracker - First observed
update_user - First observed
usage_summary
TDQS
Scored across 57 tools
Most tools target distinct resources with clear CRUD separation, but several pairs overlap in purpose: list_text_messages vs list_sms_threads, call_summary vs call_stats, and get_sms_thread vs get_text_message. The descriptions carefully explain the differences, so a careful agent can disambiguate, but the boundaries are not self-evident from tool names alone.
The CRUD tools follow a consistent list_/get_/create_/update_/delete_ pattern, but analytics and utility tools break it with noun-style names (call_summary, call_stats, usage_summary, form_stats, spam_detector) and non-standard verb forms (search_calls_by_number, bulk_update_calls, add_call_tags, remove_call_tags). The mixed conventions remain readable but lack a single predictable pattern.
With 57 tools, this server is well beyond the 'too many' threshold and into the extreme range. Even for a broad API, the surface is overwhelming and includes many granular variants (four summary/stats tools, three SMS-listing tools, and seven tag-related tools) that could be consolidated.
Coverage is broad across companies, trackers, calls, forms, SMS threads, tags, users, notifications, leads, and analytics. However, there are notable gaps: create_text_message is referenced in list_text_messages but does not exist as a tool, form submissions have no delete operation, and account-level get/update is missing. Agents can work around most gaps but may hit dead ends.
Maintenance
Related MCP Connectors
40+ Lightning-paid AI tools for agents: calls, SMS, fax, voice, translation. No signup, no keys.
Read calls, contacts, users, teams and numbers; tag calls and create or update contacts.
34-tool GTM gateway: CRMs, ad platforms, analytics, Google Workspace, AWS, and LLM orchestration.
Automate GoHighLevel across CRM, messaging, calendars, marketing, e-commerce, and billing. Manage…
Related MCP Servers
- AlicenseCqualityCmaintenanceA Model Context Protocol implementation for the HubSpot API that provides a standardized interface for accessing and managing CRM data, including companies, contacts, deals, and other objects with comprehensive CRUD operations and association management.61 npm35MIT
- AlicenseBqualityAmaintenanceEnables comprehensive integration with Kommo CRM through 25 tools for managing leads, contacts, companies, tasks, events, and generating detailed analytics reports. Supports advanced workflow management, pipeline operations, and real-time performance tracking.2214MIT
- AlicenseNot gradedqualityDmaintenanceEnables integration with JustCall APIs through function calling for managing telephony and communication services. Allows users to interact with JustCall's phone system capabilities through natural language using secure API authentication.25MIT
- AlicenseAqualityDmaintenanceEnables Claude to retrieve and analyze Google Analytics 4 data through 20+ analysis tools, providing insights on traffic, user behavior, conversions, and engagement metrics in Japanese-formatted output.202MIT