Skip to main content
Glama
pghdma

CallRail MCP

by pghdma

callrail-mcp

PyPI version Python versions CI License: MIT MCP Available on CodeGuilds

A Model Context Protocol server that exposes the CallRail REST API v3 to any MCP-compatible client (Claude Code, Claude Desktop, Cursor, etc.).

Created by Steve Japalucci — Founder of Pittsburgh Digital Marketing Agency (PGHDMA).

What you can ask Claude 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 from Google Ads 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 (new in v0.4)

  • "Why is my CallRail bill $174? Break it down by client"

  • "Which client is the biggest minute user this cycle?"

Conversion debugging (new in v0.4)

  • "Why didn't this call convert in Google Ads? CAL019..."

  • "Is this 58-second call eligible to count as a Google Ads conversion?"

Tag + 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 ~$3/mo)

Related MCP server: Kommo CRM MCP Server

Installation

# Recommended: pipx for isolated CLI install
pipx install callrail-mcp

# Or with pip
pip install callrail-mcp

To install from source (latest unreleased):

pipx install git+https://github.com/pghdma/callrail-mcp.git

Auth

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:

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.txt

Or 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 / 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

59 tools total — ~95% of CallRail's REST API v3 surface. Read tools, write tools, tracker provisioning, agency aggregation, account management (Companies/Users CRUD), notifications, integrations discovery, outbound calls, offline-lead backfill via create_form_submission, and (new in v1.1) leads, SMS-thread lead management, server-side analytics, and per-call page views.

Read tools

Tool

Purpose

list_accounts

List accessible CallRail accounts

list_companies

List companies (clients) under an account. Optional status="active" filter

list_trackers

List tracking phone numbers + their source mapping. Optional status="active" filter

get_tracker

Full detail for one tracker

list_calls

Paginated call list — filter by company / date / source / answered

get_call

Full detail for a specific call

call_summary

Aggregate stats (total, answered, by source, duration) for a window

list_form_submissions

CallRail Form Tracking submissions

list_text_messages

SMS conversations

list_users

Account users

get_call_recording

Recording URL (if recording enabled)

get_call_transcript

Conversation Intelligence transcript

search_calls_by_number

Find calls by phone number across a window

list_tags

List tags in account or filtered to one company

Write tools (v0.2+)

Tool

Purpose

update_call

Update note, tags, spam flag, customer name, lead status

add_call_tags / remove_call_tags

Additive/subtractive tag changes (preserves existing)

update_form_submission

Same field surface as update_call, plus value (numeric, supported on form submissions but NOT on calls — CallRail returns 500)

create_tag / update_tag / delete_tag

Full CRUD on the per-company tag taxonomy

Tracker provisioning (v0.3+)

Tool

Purpose

create_tracker

Provision a new tracking number. Requires confirm_billing=True as a safety guard against accidental AI provisioning

update_tracker

Update mutable settings: name, destination, whisper, greeting, SMS

delete_tracker

Soft-delete a tracker (releases the phone number, preserves history)

Account management (v0.6+)

Tool

Purpose

get_company / create_company / update_company / delete_company

Full company (client) CRUD. Free — CallRail bills per number, not per company. Soft-delete semantics

get_user / create_user / update_user / delete_user

Full user CRUD. create_user invites by email; common roles: admin / manager / reporting / analyst

get_tag

Single tag detail (completes tag CRUD)

get_form_submission

Single form-submission detail (was list+update only)

get_text_message

Single SMS conversation detail with all messages

create_form_submission (v0.7)

Manually create a form submission (backfill walk-in / paper-form / offline leads)

Notifications + Integrations (v0.7+)

Tool

Purpose

list_notifications / create_notification / update_notification / delete_notification

Full per-user alert-rule CRUD (who gets pinged on which call/text/form event)

list_integrations(company_id) / get_integration

Discover GMB / Google Ads / Facebook / Slack / Webhook integrations attached to a company

list_webhooks / get_webhook

Read webhook subscriptions (write CRUD blocked by CallRail account permissions — see "Out of scope" below)

Outbound calling (v0.7+)

Tool

Purpose

create_outbound_call

Place an outbound call (CallRail dials your tracker first, then bridges to recipient). Requires confirm_dialing=True as a safety guard — actually dials a real phone, costs minutes, has legal implications

Validation is strict: phone-number format, area code (^\d{3}$), pool_size ∈ [1, 50] (safety cap to prevent accidental 5-figure provisioning bills), name/whisper/greeting length caps, source-type enum (12 values: the 10 documented at apidocs.callrail.com plus facebook_all / bing_all which are proven in production but still absent from the docs). Tag colors validate against the full documented 24-color set.

Leads & server-side analytics (v1.1+)

Tool

Purpose

list_leads / get_lead_timeline

CallRail's deduplicated person records + full cross-channel history (calls + forms + texts) per lead, with first/last-touch attribution

list_sms_threads / get_sms_thread / update_sms_thread

SMS-thread lead management — tag / note / qualify texting leads like calls (update_sms_thread closes the texting write gap)

call_stats

Server-side call aggregation (/calls/summary.json) — grouped totals by source / keywords / campaign / referrer / landing_page / company in ONE request instead of paginating every call

call_timeseries

Per-day call-volume trend line (/calls/timeseries.json)

form_stats

Server-side form-submission totals

get_call_page_views

The visitor's page-view journey behind a call — pairs with call_eligibility_check for conversion debugging

Agency aggregation (v0.4+)

Tool

Purpose

usage_summary

Per-company cost-attribution breakdown for the cycle. Returns minutes used, active numbers, estimated $ cost share — sorted by biggest cost driver. Useful for "which client is burning my CallRail budget"

call_eligibility_check

Audit whether a specific call qualifies as a Google Ads conversion. Checks gclid presence, answered-status, duration vs. Google's threshold (default 60s), and source. Useful for "where did my conversion go" debugging

compare_periods (v0.5)

Compare current N-day window vs previous N-day window. Per-company minute/call deltas + biggest mover. Catches traffic trends before they hit the invoice

bulk_update_calls (v0.5)

Apply a single update (tag / note / lead_status / spam) to every call matching a filter. dry_run=True by default; surfaces truncation at 500-cap. Replaces dozens of sequential update_call invocations

spam_detector (v0.5)

Heuristically flag likely-spam calls (short duration, unanswered, repeat-caller patterns). Optional auto_tag=True adds auto_detected_spam tag. Deliberately does NOT set spam=True (that would hide the call from default GETs)

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.

How this compares to CallRail's official MCP server

CallRail now offers an official hosted MCP server (documented at apidocs.callrail.com) — OAuth 2.0, ~30 tools, with the server URL "provided by your CallRail account team." It's a good option if you want a fully managed remote server.

This project remains different on purpose:

callrail-mcp (this project)

Official CallRail MCP

Install

pip install callrail-mcp — running in 2 minutes

URL provisioned by your CallRail account team

Hosting

Local stdio (your API key never leaves your machine)

Hosted remote (OAuth)

Tools

59

~30

Agency tooling

usage_summary cost attribution, compare_periods, spam_detector, bulk_update_calls, call_eligibility_check

Not offered

Safety guards

confirm_billing / confirm_dialing / dry_run defaults, strict input validation

Source

MIT, open, auditable

Closed

Both speak the same underlying REST API v3. If you're an agency running Claude against 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 welcome if you have an account that supports them — or open an issue and we'll prioritize.

Blocked by CallRail account permissions (returns 403)

These endpoints exist but require account upgrades / additional permissions our standard CallRail account doesn't have. Verified live 2026-04-24:

  • Send SMS (POST /text-messages.json) — needs A2P SMS registration / dedicated SMS API permission. CallRail enforces TCPA-compliance keywords (STOP / CANCEL / UNSUBSCRIBE) on outbound text messages.

  • Webhook integration create / update / delete (POST /integrations.json with type=Webhook) — needs Integration-Admin permission. CallRail manages webhooks via the Integrations framework, not a standalone endpoint.

Not exposed by CallRail's REST API (UI-only on standard plans)

These have no API equivalent at all — managed exclusively via the CallRail web UI:

  • Outbound Caller IDs — verification flow for outbound caller identification.

  • Numbers — account-level number ownership, porting, transfers.

  • Call Flows — IVR builder / call routing tree configuration.

  • Custom Fields CRUD — custom data columns are readable as part of call/form responses but the schema management endpoint isn't exposed.

  • Do Not Call list — DNC number management.

Will work on if/when

Either CallRail upgrades the API or the user upgrades their account permissions, the above can be added without breaking changes — we'd just expose them as new MCP tools.

Rich field selection

The CallRail API returns a lean default payload. Ask for more fields on list_calls / get_call / list_form_submissions via the fields parameter:

fields=company_name,source_name,keywords,landing_page_url,device,first_call,value,tags,note,gclid,fbclid,utm_source,utm_medium,utm_campaign,utm_content,utm_term,referrer_domain

See the CallRail API docs for the full field catalog per resource.

Examples

Claude Code

> List companies under our CallRail account.

(Claude calls list_companies → returns clients with IDs and primary numbers)

> Pull today's calls for company COM019ab... — include source and keyword.

(Claude 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.

(Claude 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...

(Claude calls call_eligibility_check → returns gclid/duration/answered checks
 + targeted reason like "duration 58s under Google Ads minimum (60s)")

> Provision a new Google-Ads-call-extension tracker for Alan Construction in 412.

(Claude calls create_tracker — refuses unless you also pass confirm_billing=True
 since it incurs a ~$3/mo 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"))

Running the server directly

For debugging or to verify your key works:

python -m callrail_mcp

The server speaks MCP stdio. It will wait for JSON-RPC messages on stdin. 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/minute per API key. The client retries 429 responses using the Retry-After header, and 5xx responses with exponential backoff (max 3 retries by default). For heavy pagination, prefer the built-in paginate() helper which uses per_page=100 by default.

Development

git clone https://github.com/pghdma/callrail-mcp
cd callrail-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest

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 © 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

59 tools
add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsYes
call_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description fully discloses behavior: reads current tags, merges, PUTs; auto-creates tags; silently filters whitespace entries; drops non-strings with warning; de-duplicates; max 100 tags; errors if no valid tags remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections, front-loaded with main purpose. Could be slightly more concise but all sentences add value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: behavior, usage, parameters, return value (JSON string with updated call), error conditions (no valid tags). Complete for a tool with 3 params and no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description compensates fully: explains call_id format, tags must be strings (non-strings dropped), de-duplication, max 100, and account_id auto-resolves. Provides meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it appends tags without replacing, using 'Append tags to a call WITHOUT replacing existing ones.' It distinguishes from sibling tools like update_call and remove_call_tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use (add labels without losing prior tags) and when not to (use update_call to replace tags). Also explains auto-creation of company-level tags and filtering behavior.

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 — 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, source, answered: filter — same semantics as list_calls. At least one must be provided to avoid "update everything ever". 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, False to unmark. dry_run: If True (default), return preview only. False = commit. account_id: Auto-resolves if omitted.

Returns: - If dry_run: {"matched": N, "would_update": [...]} - Else: {"matched": N, "updated": M, "failed": [...]} per call

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
sourceNo
dry_runNo
answeredNo
set_noteNo
set_spamNo
account_idNo
company_idNo
set_tags_addNo
set_lead_statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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 thoroughly discloses safety features (dry_run default, 500-cap limit, filter requirement), performance characteristics (extra GET when `set_tags_add` is used), and return values for both dry_run and commit modes. This is comprehensive behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections for purpose, safety, arguments, returns, and performance notes. It is front-loaded with the key purpose and examples. While comprehensive, it could be slightly more concise; the performance note is valuable but adds length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 10 parameters, no annotations, and presence of an output schema, the description is remarkably complete. It covers input requirements, behavioral details (safety, performance, default behaviors), and output formats for both dry_run and commit scenarios. The output schema existence is noted but the description still explains return values, which is helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 0%, so the description fully compensates. It explains every parameter: filter fields (company_id, days, source, answered) with same semantics as `list_calls`, requirement of at least one, set_* fields with their effects (add vs replace), `dry_run` default, and `account_id` auto-resolution. 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: applying the same update to every call matching a filter. It provides concrete examples like 'tag every Bing call this month as low-priority' and explicitly distinguishes it from sequential `update_call` invocations, making the purpose unambiguous and differentiating it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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 (bulk updates matching a filter) and contrasts it with alternatives (replaces dozens of sequential `update_call` invocations). It also provides guidance such as requiring at least one filter to avoid 'update everything ever' and the default `dry_run=True` for safety.

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:

  1. Did the call have a gclid? (Required for CallRail to upload to Google Ads as a UPLOAD_CLICKS Phone Call conversion.)

  2. Was the call answered? (Most integrations skip unanswered.)

  3. Did duration meet Google Ads' minimum? (Default 60s; configurable per conversion action in Google Ads UI.)

  4. Is the call from a Google source? Detection uses CallRail's internal source slug (e.g. google_paid, google_my_business)

    • presence of gclid — NOT the user-editable source_name display string (which can mislead, e.g. "Bing Ads (Google legacy import)" would substring-match as Google but is clearly Bing).

Args: call_id: 'CAL...' id. google_ads_min_duration_seconds: Threshold to check duration against. Defaults to 60 (Google's UI default). Override if you've lowered it on a specific conversion action. account_id: Auto-resolves if omitted.

Returns: Verdict + each criterion's pass/fail + suggested remediation when eligibility fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
call_idYes
account_idNo
google_ads_min_duration_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It comprehensively explains the four checks, auto-resolution of account_id, configurable duration threshold, and the nuanced source detection logic. This fully informs the agent of the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but well-structured with a summary, bulleted checks, and arg explanations. It is efficient and front-loaded. Could potentially be slightly more concise, but it earns its length with valuable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple checks, configurable parameters, and a verdict output), the description covers all essential aspects: purpose, criteria, parameter details, auto-resolution, and a summary of the return value. It is complete for effective agent usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: explains call_id as the required identifier, account_id auto-resolves if omitted, and google_ads_min_duration_seconds defaults to 60 with guidance on when to override. This adds substantial meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: auditing whether a call is eligible to count as a Google Ads conversion. It specifies the action ('audit'), resource ('call'), and context ('Google Ads conversion eligibility'). This effectively distinguishes it from sibling tools, which are mostly CRUD operations or other utilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the use case: 'where did my conversion go' debugging. It details the checks performed but does not explicitly mention when not to use or provide alternatives. However, the purpose is specific enough that usage context is clear.

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, }).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
fieldsNo
end_dateNo
group_byNosource
account_idNo
company_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description effectively explains the tool's server-side nature and contrasts with call_summary. It details return format and parameter behavior. However, it could be more explicit about potential limitations (e.g., max days, result size) and 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a first-line summary, usage context, parameter list, and return format. It is concise but could be slightly tightened in parameter explanations. Overall, effective and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 in the description, detailed parameter semantics, and differentiation from siblings, the description is contextually complete. Minor gaps like error handling or edge cases are acceptable, as the tool is well covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining each parameter: group_by options, days default, start_date/end_date precedence, company_id filtering, fields as comma-separated metrics with default, and account_id auto-resolution. 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs server-side call aggregation via a specific API endpoint, and explicitly distinguishes it from the sibling tool 'call_summary' (client-side pagination). This meets the highest standard of specificity and differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: 'prefer this over `call_summary` when you only need grouped totals', and notes when `call_summary` remains useful. This provides clear context and alternatives.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
end_dateNo
account_idNo
company_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations exist, the description carries full burden. It discloses the risk of paginating the entire account history without a window and implies the tool is read-only via 'summarize' and 'returns counts'. Missing explicit mention of auth requirements or side effects, but these are negligible for a summary tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences plus a note, each sentence earning its place. The purpose is front-loaded, followed by return values, use case, and a critical behavioral note. No superfluous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, zero schema description coverage, and presence of an output schema, the description adequately covers the date window constraint and the tool's role as a summary. However, it omits explanation of account_id and company_id parameters, which could cause confusion in multi-account contexts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 'days' and 'start_date' and their constraint, but does not mention 'account_id', 'company_id', or 'end_date'. This leaves 3 out of 5 parameters undocumented; baseline 3 is appropriate as the description adds partial guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Summarize calls over a date window' and enumerates the returned aggregates (total, answered/missed, etc.), distinguishing it from sibling tools like list_calls that return individual call records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly positions the tool for 'weekly/monthly rollups without pulling every call into context' and warns about the requirement for a time window (days>=1 or start_date). Could be improved by explicitly contrasting with alternatives (e.g., 'for individual call details, use list_calls').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

call_timeseriesA

Per-day call volume via CallRail's /calls/timeseries.json — one request for a daily trend line instead of client-side bucketing.

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 (same set as call_stats). account_id: Auto-resolves if omitted.

Returns: JSON string with total_results and data[] — one entry per day ({key/date, }).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
fieldsNo
end_dateNo
account_idNo
company_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full transparency burden. It explains the data source and return format but does not disclose constraints like rate limits, authentication requirements, or whether the tool is strictly read-only. The behavioral disclosure is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly concise: a single sentence for purpose followed by a structured list of arguments. Every sentence adds value, and the format is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, all parameters, and the return structure (JSON with total_results and data[]). Given the output schema exists, further detail on return values is not needed. Minor gaps exist regarding error handling and edge cases, but overall it is sufficiently complete for a query tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given 0% schema description coverage, the description compensates well by explaining each parameter in the Args section, including defaults and interaction rules. It could be improved by detailing accepted values for fields and the format for company_id/account_id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves per-day call volume using a specific API endpoint, with a daily trend line instead of client-side bucketing. It uniquely distinguishes itself from siblings like call_stats and list_calls by specifying the output is an aggregated time series.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit parameter guidance, such as the default for days and the precedence rules between days and start_date. However, it lacks direct comparison to sibling tools like call_stats or compare_periods to help the agent decide when to use this specific tool.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so description carries full burden. It discloses implementation detail (one tool call, historical tracker limits) and clarifies which deltas are accurate, which is excellent transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise yet comprehensive, with clear sections (purpose, use cases, args, returns, implementation). No superfluous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given output schema existence, description still covers return breakdown clearly. Fully informs agent of what to expect and caveats, making it highly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description richly documents both parameters: days (default, cap, typo warning) and account_id (auto-resolve), adding critical context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Purpose is extremely clear: compare current vs previous N-day window with per-company and agency-wide metrics. Specific verbs and resource, distinct from all sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use cases like detecting growth or invoice surprises, but does not state when to avoid using it or mention alternatives, though none exist among siblings.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
time_zoneNoAmerica/New_York
account_idNo
form_captureNo
callscore_enabledNo
callscribe_enabledNo
swap_exclude_jqueryNo
lead_scoring_enabledNo
keyword_spotting_enabledNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: creation is free, boolean parameters inherit account defaults unless explicitly set, and warns that sending 'False' on paid features would disable them. This prevents accidental misconfiguration.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a header, usage paragraph, and bulletized parameter list. Slightly verbose on redundant notes (e.g., billing statement could be in general context), but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all 9 parameters, required vs optional, default behavior, and usage nuances. No additional information needed for correct invocation; output schema is available, so return values are not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage, the description explains each parameter in detail: acceptable values (e.g., time zone examples), defaults, and the critical None vs False distinction. This 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'Create a new company (client) under the account' – a specific verb+resource pairing. It distinguishes from siblings like 'delete_company' and 'update_company' and contrasts billing with 'create_tracker'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'Useful for new-client onboarding' and compares with 'create_tracker' for cost context. Provides default reasoning but lacks explicit when-not-to-use guidance.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
tagsNo
valueNo
form_urlNo
referrerYes
form_dataNo
account_idNo
company_idYes
lead_statusNo
customer_nameNo
referring_urlYes
customer_emailNo
landing_page_urlYes
customer_phone_numberNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
emailNo
user_idYes
send_pushNo
account_idNo
alert_typeYes
company_idNo
send_emailNo
tracker_idNo
sms_enabledNo
call_enabledNo
send_desktopNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 A REAL PHONE.

CallRail will dial from_number first; once that's answered, it bridges to to_number. Both legs cost minutes against your bundle. Misuse can constitute unlawful telemarketing — verify consent.

You must pass confirm_dialing=True to actually place the call. This is a safety guard against accidental AI-driven cold-calls.

Args: from_number: Your end of the call (typically your tracking number, e.g. +14129548337). E.164 format. to_number: Recipient's number. E.164 format. confirm_dialing: REQUIRED — set True to actually dial. Returns error envelope if False (default). company_id: Optional company scope. account_id: Auto-resolves if omitted.

Returns: The call object CallRail creates (id, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
to_numberYes
account_idNo
company_idNo
from_numberYes
confirm_dialingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: dialing sequence, costs, legal implications, and the safety mechanism. It leaves no ambiguity about the tool's effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with warnings, arg docs, and return value. While slightly lengthy, every sentence is informative and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (real-world dialing, legal risks, 5 parameters) and an output schema present, the description covers all essential usage and behavioral aspects comprehensively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 (from_number, to_number, confirm_dialing, company_id, account_id) with format, defaults, and required behavior, compensating fully for the schema deficiency.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it places an outbound call that actually dials a real phone. It is distinct from sibling tools like get_call 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides strong guidance on when to use (place outbound calls) and includes a safety guard (confirm_dialing=True). It warns about legal compliance and misuse, though it doesn't explicitly contrast with alternative tools.

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
colorNo
account_idNo
company_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose behavioral traits beyond basic creation. It does not mention reversibility, idempotency, rate limits, or what happens if a duplicate name is used.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an Args block and front-loaded purpose. It is slightly verbose but every sentence adds value, making it effective while not overly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to explain return values. It covers the purpose and all parameters adequately, making it complete for a creation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description adds significant meaning: it explains the name, company_id requirement, auto-resolution of account_id, and details the color parameter with a list of valid options and default value. This 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create a new tag scoped to one company.' This is a specific verb+resource combination that distinguishes itself from sibling tools like update_tag, delete_tag, and list_tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. It mentions that tags are per-company and company_id is required, but does not explain when to use create_tag vs update_tag or add_call_tags.

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. Must be one of: 'all', 'direct', 'offline', 'google_my_business', 'google_ad_extension' (this is what Google Ads call-extension uses). Ignored for type='session' (use 'all'). 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's "pool_size" required field). Typical 4-10. Each pool number is billed separately. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeNosource
area_codeNo
pool_sizeNo
toll_freeNo
account_idNo
company_idYes
sms_enabledNo
source_typeNoall
greeting_textNo
confirm_billingNo
whisper_messageNo
recording_enabledNo
destination_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses cost implications and pricing in detail, which is critical for a billing-related tool. No annotations provided, so description carries full burden; covers major behavioral aspects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with warning, pricing, and parameter list, though slightly long due to necessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all aspects: costs, required parameters, logic for different types, and return value hinted. Output schema exists, so returning details are handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, description compensates fully, explaining all 14 parameters, including defaults, valid values, and auto-resolution for account_id.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Create a new tracking phone number (tracker)' and distinguishes from sibling tools like delete_tracker and update_tracker.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on required confirm_billing=True and when to use type='source' vs 'session', but does not compare to other creation tools.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoreporting
emailYes
last_nameYes
account_idNo
first_nameYes
company_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
company_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
notification_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes the destructive action ('rule is gone') and return value. While no annotations are provided, the description adds context about permanence, but could more explicitly mention irreversibility or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then alternative, then parameter docs, then return. Every sentence earns its place with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all essentials: purpose, alternative, parameters, return value. With no annotations, the description fully compensates, and the presence of output schema is covered by the return description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description adds meaning for both parameters: explains account_id auto-resolves and notification_id is the rule ID. Could include more constraints (e.g., format) but sufficient for use.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Delete a notification rule' with a specific verb and resource. It distinguishes from siblings like update_notification by providing an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool vs. the alternative: 'to keep but mute it, prefer update_notification(send_email=False, send_desktop=False, send_push=False)'.

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]+$ — accepts string or numeric forms. account_id: CallRail account ID. Auto-resolves if omitted.

Returns: JSON string {"deleted": True, "tag_id": ...} on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries full behavioral transparency burden. It explicitly states 'HARD delete' and that the tag is gone permanently along with historical applications, disclosing the destructive nature. It also mentions the return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two paragraphs plus Args/Returns. Front-loaded key action and warning. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters, no nested objects, output schema exists), the description covers all necessary aspects: purpose, usage guidance, behavioral warnings, parameter details, and return value. It is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds detailed meaning for both parameters: explains tag_id format (numeric, integer, regex constraint) and that account_id auto-resolves if omitted. This goes beyond the schema type definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 'tag definition', and explains the effect of removing it from calls and form submissions. It distinguishes from siblings by explicitly mentioning 'update_tag' as an alternative for preserving history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: it notes that deletion is permanent and advises using 'update_tag' instead to preserve history. This gives clear when-to-use and when-not-to-use context.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
tracker_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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}).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
end_dateNo
account_idNo
company_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNo
call_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
call_idYes
per_pageNo
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It discloses that the tool returns page views with timestamps, is paginated, and that account_id auto-resolves. It does not mention auth or rate limits, but for a read-only tool the disclosure 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: two short paragraphs with front-loaded purpose and clear parameter list. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, paired usage, all parameters with semantics, return format (JSON string with page_views[]), and pagination. Given the output schema exists and the tool is straightforward, this is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the tool's description includes a dedicated 'Args' section that explains each parameter: call_id format, account_id auto-resolution, per_page max, and page indexing. 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves 'visitor's page-view history behind a call' with timestamps, distinguishing it from siblings like call_eligibility_check. The verb 'Get' is specific and the resource is well-defined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly pairs this tool with call_eligibility_check for conversion debugging, providing a clear usage context. It does not mention explicit alternatives or when-not-to-use, but the context strongly implies it is the go-to tool for pre-call browsing analysis.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
call_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: URL expiration, prerequisite of recording being enabled, no retroactive recording, and meaning of empty URL. This exceeds expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is succinct with a clear intro, prerequisites, args, and returns. Every sentence adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary aspects: purpose, prerequisites, parameter details, return format, and edge cases. Given the tool's complexity, the description is fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description adds meaning by specifying call_id format ('CAL...') and explaining account_id auto-resolves. The Returns section also clarifies output structure, compensating for the schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get the recording URL for a call' and elaborates on the short-lived URL, distinguishing it from sibling tools like get_call or 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on when to use the tool (need recording URL), including prerequisites (recording enabled) and edge cases (calls before enablement have no recording). Does not explicitly list alternatives or when not to use, but the context is sufficiently clear.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
call_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses that transcripts are not retroactive, that a 404 has multiple causes, and that account_id auto-resolves. Does not mention rate limits or other potential issues, but for a read operation the key behaviors are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with purpose, then prerequisites, then parameter details, then return value. Every sentence adds value, though the warning about a specific date (2026-05-21) may become outdated. Still well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 2 parameters fully described, an output schema present (though not shown), and a clear description of the return format (JSON with segments, confidence scores, durations), the description provides sufficient context for the agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description fully explains both parameters: call_id (format 'CAL...') and account_id (auto-resolves if omitted). Adds significant meaning beyond the bare schema, making invocation easier.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Get the AI transcript for a call' – a specific verb and resource. Distinguishes from sibling tools like get_call_recording (recording vs transcript) and get_call (call details). No ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions prerequisites (CallScribe enabled at call time, Premium subscription) and explains failure modes (404 may mean no transcript or plan limitation). While it does not list alternatives, the context of transcript retrieval is well-defined.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
company_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so description carries full burden. Discloses that soft-deleted companies return a record with disabled status instead of 404, and account_id auto-resolves. This is key behavioral information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: one-line purpose, bullet-pointed args, and a note. No redundant sentences. Front-loaded and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists (not shown), description doesn't need to detail return values. It covers the essential behavior including soft-delete handling. Could mention error cases, but overall sufficient for a simple get tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage. The description adds 'COM...' id format for company_id and 'Auto-resolves if omitted' for account_id, both beyond schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Get full detail for one company', which is specific and distinct from sibling tools like list_companies. The note about disabled records adds further specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context like auto-resolution of account_id and behavior for soft-deleted companies, but does not offer explicit guidance on when to use vs. alternatives like list_companies.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
submission_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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 implies a read-only retrieval operation but does not explicitly state that it has no side effects or require specific authentication. The return description provides some behavioral context but lacks full transparency on constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a clear purpose statement and structured Args/Returns sections. It avoids unnecessary detail but includes essential guidance. It is well-organized and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple input schema (2 parameters, 1 required) and presence of an output schema, the description adequately covers the return value contents (submitted_at, customer details, etc.). It does not explain every nested field but is sufficient for an agent to understand what data will be returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds crucial meaning: it explains the format of submission_id ('FOR...' id) and that account_id is optional and auto-resolves. This goes beyond the bare schema and helps the agent understand parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves full details for one form submission, including all submitted field data. It distinguishes from sibling tools like list_form_submissions (for listing IDs) and update_form_submission (for modification), providing a specific verb and resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly suggests use after seeing a submission ID via list_form_submissions or a webhook callback, giving clear context. While it does not explicitly state when not to use, the guidance is sufficient for an agent to decide between this and similar tools.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
integration_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
lead_idYes
per_pageNo
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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 explains that the tool returns a JSON string with lead record and timeline array, pagination info, and that account_id auto-resolves. It does not explicitly state read-only behavior, but the description implies no side effects. A score of 4 is appropriate given good coverage without annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: main purpose, benefit, args block, and returns. It is informative but slightly verbose; the args block could be more formal. Still, it is front-loaded with key information and every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 4 parameters, 1 required, no schema descriptions, and an output schema present (though not shown), the description covers all parameters, explains output structure, and mentions pagination. It is complete for the tool's complexity and does not need to detail return values due to output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds significant meaning beyond the input schema: it explains lead_id format ('PER...' lead id from `list_leads`), account_id auto-resolves if omitted, per_page max 250, and page is 1-indexed. Since schema description coverage is 0%, the description fully compensates, providing format constraints and behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '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.' It distinguishes from siblings by explicitly mentioning it replaces the manual multi-step search process.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use the tool: 'This replaces the manual "search calls by number + search forms by email" dance when reconstructing a customer's history.' It provides clear context for use but does not include explicit when-not-to-use or alternative tools beyond the implied replacement.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
conversation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
tracker_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It describes the return JSON fields and behavior of account_id auto-resolve, but does not disclose error conditions, rate limits, or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise with Args/Returns structure. However, it redundantly lists return fields that are already in the output schema, adding slight verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get tool with two parameters and no annotations, the description covers purpose, parameter details, and return structure. Missing error handling info, but overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description adds necessary meaning. It explains user_id format ('USR...' id) and account_id auto-resolve behavior, which goes beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 user on the account,' which uses a specific verb and resource. It distinguishes from sibling tools like list_users and update_user.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives. It implies use for a single user by ID, but does not mention when not to use it or suggest list_users for multiple users.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_webhookC

Get full detail for one webhook subscription.

Args: webhook_id: Webhook id (CallRail-assigned).

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo
webhook_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden of behavioral disclosure. It only states the basic action without mentioning read-only nature, authentication requirements, rate limits, or any 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and has a clear structure with an Args list. It is concise but at the expense of completeness, earning a high score for lack of waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters and an output schema, the description lacks explanation for account_id and does not provide any context about the return value or pagination, making it incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add meaning. It describes webhook_id as 'Webhook id (CallRail-assigned)' but does not mention account_id at all, leaving that parameter undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'full detail for one webhook subscription,' which distinguishes it from sibling tool 'list_webhooks.' However, the phrase 'full detail' is somewhat vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 like list_webhooks. There are no prerequisites, exclusions, or contextual hints.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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, source, answered 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). source: Filter (e.g. 'google_paid', 'google_organic', 'direct', 'bing_paid'). answered: 'true' or 'false'. 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, first_call,value,tags,note,gclid,fbclid,utm_source,utm_medium, utm_campaign,utm_content,utm_term,referrer_domain'.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
pageNo
fieldsNo
sourceNo
answeredNo
end_dateNo
per_pageNo
account_idNo
company_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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 pagination and parameter behaviors (e.g., auto-resolution of account_id, ignoring days if start_date provided). However, it does not mention rate limits, result ordering, or what happens on empty results, leaving some ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose and then provides a clear bullet-like list for each parameter. It is slightly verbose but well-organized, earning its length with useful details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 10 parameters and no schema coverage, the description covers all parameters adequately. An output schema exists (not shown), so return value details are less needed. However, it lacks mention of result ordering or limits beyond per_page, and no context on typical use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It does so thoroughly: explains each parameter (e.g., days default 7, ignored if start_date; date format YYYY-MM-DD; source examples; answered 'true'/'false'; per_page max 250; page 1-indexed; fields comma-separated with examples; account_id auto-resolves; company_id filter). 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List calls' with pagination and filtering options, distinguishing it from sibling tools like get_call or search_calls_by_number. It provides specific filterable attributes (company, date window, source, answered status).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing and filtering calls but does not explicitly state when to use this tool vs alternatives like get_call for a single call or compare_periods for period comparisons. No when-not guidance is given.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
statusNo
per_pageNo
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full burden of disclosure. It explains important behavioral traits: account_id auto-resolution, pagination behavior (1-indexed pages, page size limit), and status filtering. This exceeds minimal requirements for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear first sentence and an Args block. It is concise but includes necessary details. The historical note about pagination adds context without excessive verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (4 optional parameters, no required params) and the presence of an output schema, the description is complete. It covers all parameters, pagination, and filtering. The only minor gap is the lack of mention of the number of results returned, but the output schema likely covers that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, leaving the description to explain all 4 parameters. The description does so effectively: account_id auto-resolves, per_page max 250, status values explained, page is 1-indexed and necessary for pagination. This adds significant value beyond the schema's type/default information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'List companies (client businesses) under a CallRail account.' It uses a specific verb (List) and resource (companies), and distinguishes itself from sibling list tools (e.g., list_accounts, list_calls) by specifying the resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use the tool (listing companies under an account) and gives pragmatic guidance on pagination for agencies with many companies (page parameter). It does not explicitly state when not to use it or list alternatives, but the sibling tools are distinct enough that confusion is unlikely.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
pageNo
fieldsNo
end_dateNo
per_pageNo
account_idNo
company_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
per_pageNo
account_idNo
company_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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 that company_id is required and account_id auto-resolves, but lacks details on error handling, rate limits, or the exact behavior when parameters are invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description uses a clear docstring format with Args section, is front-loaded with purpose, and contains minimal redundancy (only the '**Required**' is slightly redundant). It is concise given the number of parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description need not detail return values. It covers the required parameter and pagination, but lacks explanation of the account_id resolution logic and potential error conditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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: it explains company_id format, per_page max (250), page indexing (1-indexed), and account_id auto-resolution, going beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists integrations for a company, listing specific examples (GMB, Google Ads, etc.), and distinguishes it from siblings like get_integration (singular) and list_companies (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description emphasizes that company_id is required and account_id auto-resolves, but does not provide explicit guidance on when to use this tool versus alternatives or when not to use it.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
per_pageNo
account_idNo
company_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that account_id auto-resolves, per_page max 250, page is 1-indexed, and returns details. No annotations exist, so description carries burden; lacks rate limits or auth notes, but acceptable for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with clear first sentence, explanation, alternative, bullet-point args, and return format. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all parameters and output structure; lacks pagination iteration details but sufficient given output schema description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds meaning beyond schema: account_id auto-resolves, company_id filters, per_page max, page indexing. Schema coverage 0%, so description compensates well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'List leads (unique people)', explains what a lead is (deduplicated person record), and distinguishes from sibling tools like get_lead_timeline and list_calls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly suggests using get_lead_timeline for full history, but could provide more guidance on when to filter by account_id vs company_id or pagination usage.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
user_idNo
per_pageNo
account_idNo
company_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 — and 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
per_pageNo
account_idNo
company_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It explains the output format and notes that `account_id` auto-resolves, but does not mention other behaviors like rate limits, authentication, or safety profile. It is adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loads the core purpose, contrasts with a sibling, and lists parameters in a structured args block. Every sentence adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 and four simple parameters, the description covers purpose, differences, all parameters, and return format. Minor omissions like sorting order or total count do not hinder usability.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, but the description compensates by providing clear, human-readable explanations for all four parameters, including defaults and constraints like 'max 250' for per_page.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List SMS threads' and distinguishes from sibling tool `list_text_messages` by noting that threads carry lead-management fields and are updatable, making the purpose specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly contrasts with `list_text_messages` and explains what threads contain, providing clear context for when to use this tool. It does not include explicit when-not-to-use statements but the contrast suffices for decision-making.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
per_pageNo
account_idNo
company_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
pageNo
end_dateNo
per_pageNo
account_idNo
company_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
statusNo
per_pageNo
account_idNo
company_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 — fits small/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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses that it returns a single page with no pagination, auto-resolves account_id, and details the return structure. No mention of authentication or rate limits, but those are common and implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with args and returns sections. It is slightly verbose due to the full return specification, but every sentence adds value and it is front-loaded with the main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional param, read-only), the description covers all necessary context: purpose, limitation, parameter behavior, and return format. There is no output schema provided, but the description details the return.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter is explained in the description, including its purpose (CallRail account ID) and that it auto-resolves if omitted. This adds significant meaning beyond the schema, which has no descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists all users on an account, specifying the action and resource. It distinguishes from sibling tools like get_user and create_user by implying scope and listing behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Mentions the single-page limitation and that it fits small/medium accounts, providing context for when it's appropriate. Lacks explicit when-not-to-use or alternatives, but the limitation itself guides usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhooksA

List webhook subscriptions on the account or one company.

Args: company_id: Filter to webhooks attached to one company. per_page: Page size (max 250). page: 1-indexed. account_id: Auto-resolves if omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
per_pageNo
account_idNo
company_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description lacks behavioral traits such as read-only nature, pagination behavior, auth requirements, or rate limits. It only clarifies parameter semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct, with a front-loaded purpose statement followed by concise parameter details. No extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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, return value documentation is unnecessary. The description covers parameter semantics well but omits behavioral context like read-only nature and explicit pagination details, which are implied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds significant meaning: 'Filter to webhooks attached to one company' for company_id, 'Page size (max 250)', '1-indexed', and 'Auto-resolves if omitted' for account_id, fully compensating for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and resource 'webhook subscriptions' with scope 'on the account or one company', effectively distinguishing from sibling 'get_webhook' which retrieves a single webhook.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing webhooks but does not provide explicit guidance on when to use versus alternatives like get_webhook or any conditions for using this tool.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsYes
call_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden; it honestly discloses idempotent behavior, case-sensitivity, and handling of empty entries, which are not evident from 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-load the core purpose and critical behavior (idempotency, case-sensitivity, empty handling) without any extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key behavioral aspects for a simple removal tool and output schema exists, but lacks parameter descriptions for 2 of 3 parameters, which is a notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description only adds meaning for 'tags' (case-sensitive) but provides no explanation for 'call_id' or 'account_id', leaving their semantics unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'remove' and resource 'tags from a call', with specific details about case-sensitivity and idempotency, effectively distinguishing it from sibling tools like add_call_tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes what the tool does but does not explicitly state when to use it over alternatives (e.g., update_call) or provide exclusions, leaving usage context 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.

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 — will be 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
account_idNo
company_idNo
phone_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears full burden. It discloses normalization of phone number, last-10-digit matching, minimum 7-digit requirement, and auto-resolution of account_id. This provides good behavioral insight, though it does not explicitly state if the operation is read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear heading and Args section. It is concise (6-7 lines) with no redundant information. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, return values are not required. The description covers all input parameters and key behaviors (matching logic, normalization, defaults). The tool's role among 45 siblings is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description fully compensates: explains phone_number normalization and min digits, account_id auto-resolves, company_id optional, and days default. Nearly all parameter semantics are covered beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Find calls from/to a specific phone number' and explains the matching logic on the last 10 digits. This clearly distinguishes it from sibling tools like 'get_call' (single call) and 'list_calls' (unfiltered listing).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use (searching by phone number) and explains input flexibility (any format, last 10 digits). However, it does not explicitly state when not to use this tool or mention alternatives for scenarios like broader searches.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
auto_tagNo
tag_nameNoauto_detected_spam
account_idNo
company_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: the additive scoring logic, the memory blowup risk (hard-capped at 90 days), that the full call list is materialized, and the side effects of auto_tag (adding a tag, auto-creating if missing). It also reveals that spam-flagged calls are hidden from default GET endpoints, which is critical for the agent 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (scoring, args, returns) and front-loads the purpose. However, it is somewhat lengthy due to detailed scoring logic and parameter explanations. While this is justified given the tool's complexity, a slightly more compact description could improve conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (5 optional params, return object with breakdown and histogram) and absence of annotations, the description is remarkably complete. It covers usage guidelines, behavioral side effects, parameter semantics, and return values. The output schema is not provided, but the description adequately describes what is returned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does so comprehensively. Each parameter is explained with purpose, constraints (e.g., days hard-capped at 90, company_id recommended), default values, and behavior (e.g., tag auto-creation, auto-resolving account_id). This adds significant meaning beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Heuristically identify likely-spam calls and (optionally) tag them.' It uses specific verbs ('identify', 'tag') and references to 'likely-spam calls', distinguishing it from sibling tools like add_call_tags (which tags arbitrary calls) and get_calls (which lists calls).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: it recommends using company_id, explains the lookback window (1-90 days), and details when auto_tag is appropriate. It also clearly states a when-not: 'we deliberately do NOT mark calls as spam=True automatically' and explains the rationale. Sibling tools are listed, and the description implicitly distinguishes spam detection from other call-related tools.

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" — 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

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
spamNo
tagsNo
call_idYes
account_idNo
lead_statusNo
customer_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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 critical behaviors: spam-flagged calls become hidden from GET endpoints (404 on re-read), empty-string fields are rejected, length caps for note (4000), customer_name (200), tags (100). It also explains why `value` is not exposed (server error), providing exceptional transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points for Args and separate notes. It front-loads the main purpose. While lengthy, every sentence provides unique value. Minor improvement could be merging some points, but overall excellent organization for an AI agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, no annotations, and an output schema (likely covering return values), the description covers all nuances: error conditions (empty strings, spam 404), alternative tools, length caps, and auto-resolution. It is comprehensive and leaves no obvious gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates. It explains each parameter's purpose (e.g., account_id auto-resolves, tags replaces, note replaces) and adds constraints (length caps, empty-string behavior, tag count limit). This adds significant meaning beyond the schema's raw types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Update an existing call: notes, tags, spam flag, customer name, lead status.' It provides a specific verb+resource and distinguishes from siblings by explicitly referencing `add_call_tags` and `remove_call_tags` for additive tag changes, and `update_form_submission` for the `value` field.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use this tool vs alternatives: it mentions using `add_call_tags`/`remove_call_tags` for additive changes, and warns about spam flagging hiding calls. It also advises against empty strings. However, it does not explicitly list when not to use it, relying on implied 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: Flag calls containing watch-list keywords. form_capture: Enable CallRail Form Tracking on this company. account_id: CallRail account ID. Auto-resolves if omitted.

Returns: JSON string with the updated company object.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
time_zoneNo
account_idNo
company_idYes
form_captureNo
callscore_enabledNo
callscribe_enabledNo
swap_exclude_jqueryNo
lead_scoring_enabledNo
keyword_spotting_enabledNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers behavioral traits: PUT method implied, boolean override critical warning, empty string rejection, and account_id auto-resolution. It does not mention authentication or rate limits, but adequately covers key mutation caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a summary sentence, critical warnings in block, then parameter list. Slightly long but front-loaded. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 10 parameters, no annotations, and presence of output schema, the description is complete: explains parameter behavior, critical risks, and return value. No gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage, the description adds rich meaning for each parameter: explains purpose (e.g., 'callscribe_enabled: Conversation Intelligence'), notes PAID add-ons, specifies constraints (empty string rejection, max 255 chars), and clarifies the None semantics for optional fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Update mutable settings on a company', specifying verb and resource. The description distinguishes this from sibling tools like create_company or get_company by focusing on mutations and listing settable fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidelines: pass None to leave unchanged, be deliberate with booleans, avoid empty strings. It does not explicitly contrast with alternatives but the context makes it clear when to use this tool.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
spamNo
tagsNo
valueNo
account_idNo
lead_statusNo
submission_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses important behaviors: empty-string fields are rejected to prevent accidental clearing, length caps for note (4000 chars) and tags (100 entries), and account_id auto-resolution. It does not cover reversibility or permissions but provides substantial context 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with no wasted words. It front-loads the main purpose and then uses paragraphs for details. Every sentence adds value: constraints, warnings, and cross-reference to update_call. Well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with output schema, the description covers key constraints and behavioral notes. However, it lacks specifics like whether tags replace or append, allowed values for lead_status, and error handling. It is adequate but has notable gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 submission_id format (prefix 'FOR...'), account_id auto-resolution, length caps, and empty-string rejection. It refers to update_call for field semantics. While not all parameters are fully detailed (e.g., lead_status values), it adds significant meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an existing form submission and lists specific fields (notes, tags, value, spam, lead status). It distinguishes from sibling tools like create_form_submission (create vs update) and update_call (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool (to update a form submission) and mentions auto-resolution of account_id. However, it does not explicitly state when not to use it or provide direct alternatives, though the sibling list makes the distinction implicit.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
emailNo
send_pushNo
account_idNo
alert_typeNo
send_emailNo
sms_enabledNo
call_enabledNo
send_desktopNo
notification_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes key behavior: passing None leaves fields unchanged, only explicit values sent in PUT body. Warns about plan-specific alert_type. No annotations provided, so description carries burden and does it well, though could mention authorization needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with general description and Args section. Front-loads critical 'pass None' behavior. A bit lengthy but each sentence adds value; could be slightly more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers parameters, return value (JSON string), and usage guidance. No mention of error handling or validation beyond alert_type warning. Output schema exists, so return details are sufficient. Comprehensive for a mutation tool with 10 parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description provides thorough parameter documentation, including default behaviors (email defaults to user's primary), common values for alert_type (with plan-specific warning), and clarifies that unknown alert_type values warn but do not reject.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Update a notification rule' and describes the purpose of notification rules. Distinguishes from sibling tools like create_notification and delete_notification by specifying its use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use this tool: 'rewire targets, change triggering events, or silence a noisy rule without deleting it'. Also contrasts with creating/deleting.

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 — 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
notesNo
valueNo
thread_idYes
account_idNo
append_tagsNo
lead_qualificationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It details key behaviors: tags can be appended or replaced via `append_tags`, notes have a max length and reject empty strings, and account_id auto-resolves. It does not mention error cases or authorization requirements, but provides substantial transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: a single-sentence purpose followed by a note about the gap, then a clear list of arguments. Every sentence adds value with no redundancy. It is front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all 7 parameters with detailed semantics and provides usage context. An output schema exists, so return values are covered elsewhere. It does not mention error scenarios or prerequisites, but for an update operation this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate entirely. It does so excellently by explaining each parameter: thread_id source, notes constraints, value numeric, tags behavior with append_tags, lead_qualification configurability, and account_id auto-resolution. 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it updates an SMS thread's lead-management fields, identifies specific fields (notes, value, tags, lead_qualification), and distinguishes itself as the texting equivalent of `update_call`. This provides a specific verb+resource and differentiates from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to tag, note, or qualify texting leads via API) and references `update_call` as an analogue. It lacks explicit when-not to use or alternatives, but the context is clear enough to guide selection.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
colorNo
tag_idYes
account_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
account_idNo
tracker_idYes
sms_enabledNo
greeting_textNo
whisper_messageNo
destination_numberNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description discloses critical side effects: updating destination_number updates the call_flow's destination, and greeting_text requires destination_number to avoid breaking the tracker. Field-level rules (non-empty strings, pass None to leave unchanged) are detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with sections (Args, Field-level rules) and front-loaded with purpose. It is slightly verbose but each sentence adds necessary context. Could be tightened slightly, but still highly effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (7 parameters, one required) and presence of an output schema, the description covers all essential behavior, side effects, dependencies, error avoidance, and field constraints. It is complete enough for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description fully compensates by explaining each parameter's meaning, default behavior (auto-resolve account_id), format (e.g., destination_number), and interdependence (greeting_text requires destination_number). This adds immense value beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it updates mutable settings of a tracker (name, destination, whisper, greeting, SMS). It distinguishes from siblings like delete_tracker (which disables) and other update tools by specifying tracker-specific fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (update mutable settings) and when not to use (disable via delete_tracker, permanent removal via support). Also warns that setting 'status' is silently ignored. Provides clear alternative actions.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNo
emailNo
user_idYes
last_nameNo
account_idNo
first_nameNo
company_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
end_dateNo
account_idNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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. Dates show when Glama detected each change.

  1. 10 tool updatesv1.0.4
    • Addedcall_stats
    • Addedcall_timeseries
    • Addedform_stats
    • Addedget_call_page_views
    • Addedget_lead_timeline
    • Addedget_sms_thread
    • Changedlist_companies1 field changed
      • addedInput schema / properties / page
        Added value: +{
        +  "default": 1,
        +  "title": "Page",
        +  "type": "integer"
        +}
    • Addedlist_leads
    • Addedlist_sms_threads
    • Addedupdate_sms_thread
  2. 50 tool updatesv1.0.0
    • First observedadd_call_tags
    • First observedbulk_update_calls
    • First observedcall_eligibility_check
    • First observedcall_summary
    • First observedcompare_periods
    • First observedcreate_company
    • First observedcreate_form_submission
    • First observedcreate_notification
    • First observedcreate_outbound_call
    • First observedcreate_tag
    • First observedcreate_tracker
    • First observedcreate_user
    • First observeddelete_company
    • First observeddelete_notification
    • First observeddelete_tag
    • First observeddelete_tracker
    • First observeddelete_user
    • First observedget_call
    • First observedget_call_recording
    • First observedget_call_transcript
    • First observedget_company
    • First observedget_form_submission
    • First observedget_integration
    • First observedget_tag
    • First observedget_text_message
    • First observedget_tracker
    • First observedget_user
    • First observedget_webhook
    • First observedlist_accounts
    • First observedlist_calls
    • First observedlist_companies
    • First observedlist_form_submissions
    • First observedlist_integrations
    • First observedlist_notifications
    • First observedlist_tags
    • First observedlist_text_messages
    • First observedlist_trackers
    • First observedlist_users
    • First observedlist_webhooks
    • First observedremove_call_tags
    • First observedsearch_calls_by_number
    • First observedspam_detector
    • First observedupdate_call
    • First observedupdate_company
    • First observedupdate_form_submission
    • First observedupdate_notification
    • First observedupdate_tag
    • First observedupdate_tracker
    • First observedupdate_user
    • First observedusage_summary

TDQS

A3.7/5.0
Disambiguation5/5

Each tool targets a distinct operation or entity, with descriptions that clearly differentiate even the many call-related tools. For example, call_stats, call_summary, and call_timeseries all aggregate calls but are explicitly distinguished by grouping dimension, detail level, and use case, reducing confusion.

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern (e.g., list_calls, create_company, update_tracker). However, several tools break the pattern (e.g., call_stats, call_timeseries, compare_periods, spam_detector, usage_summary), which introduces minor inconsistency.

Tool Count2/5

With 59 tools, the set is far above the 3–15 range considered well-scoped. While the CallRail API is broad, many tools (e.g., separate aggregation endpoints) could be consolidated into fewer, more generic tools to reduce cognitive overhead for the agent.

Completeness4/5

The tool set covers CRUD for all major entities (calls, companies, trackers, users, notifications, form submissions, SMS threads, tags) plus specialized analysis (spam detection, caller eligibility, cost attribution). Minor gaps exist, such as missing get_notification by ID, but core workflows are fully supported.

Maintenance

ActivityStale
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    C
    maintenance
    A 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.
    72
    35
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables 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.
    22
    13
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    25
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    20
    2
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pghdma/callrail-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server