ctm-multi-mcp
OfficialThis server is a read-only MCP integration that enables resellers and agencies to extract, analyze, and report on CallTrackingMetrics (CTM) data across multiple sub-accounts simultaneously using a single parent API key. It automatically discovers sub-accounts and performs concurrent operations with configurable filtering and pagination.
Key capabilities:
Account Management: List accessible sub-accounts (filter by status) and get high-level summaries of each account's configuration (tracking numbers, sources, routing objects).
Call Analysis: Search and retrieve individual call details (with optional field selection), export filtered calls as CSV, generate aggregated summaries, disposition breakdowns, and cross-tabulation matrices (e.g., source × status). Includes ad attribution data (campaigns, keywords, ad groups).
Inventory & Configuration: List and inspect tracking numbers, contacts, tracking sources, call queues, voice bots, IVR voice menus, schedules, geo-routes, users, and tags across accounts.
SMS Auditing: List and filter SMS/text messages across accounts.
Time-Series Reporting: Use the Reports Series API to generate time-series data sliced by 40+ dimensions (hour, day, month, year).
Billing & Financials: Retrieve account billing and ledger data for given date ranges.
Cross-Account Operations: All tools operate concurrently across multiple (or all) sub-accounts, with automatic pagination and account attribution. Failures in one account don't block others.
Safety & Limits: Read-only access with no write operations. Apply client-side filters and field selection to optimize performance; caps on pagination prevent excessive data transfer.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ctm-multi-mcpShow me call volume by source for all accounts this week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ctm-multi-mcp — Multi-account CTM data extraction
A read-only Model Context Protocol (MCP) server for extracting data across multiple CallTrackingMetrics sub-accounts using a single parent/reseller API key.
Built for resellers and agencies managing multiple CTM accounts who need to pull call data, reports, number inventory, contacts, sources, and configuration into custom Claude bots.
How It Works
Auto-discovery — On startup, the server uses the parent API key to list all sub-accounts automatically. No manual configuration needed.
Filtering — Optionally limit which accounts are queried via env var or a JSON config file with optional labels.
Cross-account tools — Every tool runs across all (or selected) accounts and returns results with account attribution. One failing account doesn't block the rest.
Read-only — No write tools. Safe for analysis, reporting, and data extraction without risk of modifying production config.
Related MCP server: meta-mcp
Install
Not yet published to PyPI — install from source for now:
git clone https://github.com/CTMJSON/ctm-multi-mcp
cd ctm-multi-mcp
python3 -m venv .venv
./.venv/bin/pip install -e .This installs a ctm-multi-mcp executable at .venv/bin/ctm-multi-mcp inside
the cloned folder — use that full path when connecting a Claude client below.
Once published, install will be:
pip install ctm-multi-mcp
# or, with no install, via uv:
uvx ctm-multi-mcpConfiguration
Variable | Required | Description |
| yes | Base64-encoded |
| no | Override API base URL (default: |
| no | Comma-separated account IDs to limit scope |
| no | Path to JSON config file (default: |
Filtering sub-accounts
To limit which accounts the server queries, set CTM_ACCOUNT_IDS:
export CTM_ACCOUNT_IDS=12345,67890,11111Or create ~/.ctm-accounts.json:
{
"account_ids": ["12345", "67890", "11111"],
"labels": {
"12345": "Client A (Enterprise)",
"67890": "Client B (SMB)"
}
}Labels appear in tool output for easy identification. If neither filter is set, all sub-accounts discoverable by the parent key are included.
Connecting to Claude Desktop
Edit your Claude Desktop config file
(macOS: ~/Library/Application Support/Claude/claude_desktop_config.json;
Windows: %APPDATA%\Claude\claude_desktop_config.json).
If the file doesn't exist yet, create it with a mcpServers block and add
an entry for ctm-multi-mcp. Use the full path to the ctm-multi-mcp executable
from the Install step:
{
"mcpServers": {
"ctm-multi-mcp": {
"command": "/absolute/path/to/ctm-multi-mcp/.venv/bin/ctm-multi-mcp",
"env": {
"CTM_BASIC_AUTH": "<base64 access_key:secret_key>"
}
}
}
}Restart Claude Desktop for the change to take effect. To limit which accounts
are queried, add "CTM_ACCOUNT_IDS": "12345,67890,11111" to env.
Connecting to Claude Code
claude mcp add ctm-multi-mcp \
--env CTM_BASIC_AUTH="<base64 access_key:secret_key>" \
-- /absolute/path/to/ctm-multi-mcp/.venv/bin/ctm-multi-mcpWith account filtering:
claude mcp add ctm-multi-mcp \
--env CTM_BASIC_AUTH="<base64 access_key:secret_key>" \
--env CTM_ACCOUNT_IDS=12345,67890,11111 \
-- /absolute/path/to/ctm-multi-mcp/.venv/bin/ctm-multi-mcpOnce published to PyPI, -- uvx ctm-multi-mcp can replace the explicit path
in both of the examples above.
Connecting to Codex
Edit ~/.codex/config.toml:
[mcp_servers.ctm-multi-mcp]
command = "/absolute/path/to/ctm-multi-mcp/.venv/bin/ctm-multi-mcp"
[mcp_servers.ctm-multi-mcp.env]
CTM_BASIC_AUTH = "<base64 access_key:secret_key>"
CTM_ACCOUNT_IDS = "12345,67890"Claude.ai (web)
Not currently supported — claude.ai's connectors require a hosted/remote MCP server (reachable over HTTP), while ctm-multi-mcp runs as a local stdio process. Use Claude Desktop or Claude Code instead until a hosted version exists.
Example Prompts
Once connected, you can drive the server in plain English:
"Give me a call summary for all accounts for the last 7 days."
"Show me call dispositions across all accounts — what percentage hang up vs answer?"
"Break down call volume by source across all accounts for August."
"Which Google/Bing campaigns drove calls for account 12345 this week, and how many were answered?"
"Export every answered call over 60 seconds for account 12345 yesterday, with name, city, and state."
"Which accounts have voice bots configured and what are their names?"
"List all tracking numbers across all accounts with their routing destination."
"Show me the call logs for account 12345 and 67890 from yesterday."
"Which accounts have the most sources configured?"
"Pull all contacts from every account that have 'test' in the name."
Tool Surface
All tools are read-only and operate across sub-accounts:
Category | Tools |
Accounts |
|
Calls |
|
Numbers |
|
Contacts |
|
Sources |
|
Queues |
|
Voice Bots |
|
Voice Menus |
|
Schedules |
|
Geo Routes |
|
Users |
|
Tags |
|
Reports |
|
Texts |
|
Every tool accepts an optional account_ids parameter (comma-separated string)
to limit which accounts are queried. Omit to query all discovered accounts.
Working with large result sets
CTM's API caps per_page at roughly 100 records, so a naive integration
either misses data past the first page or has to loop pages by hand. This
server handles that for you in two ways:
List tools (
list_contacts,list_numbers,list_sources,list_queues,list_users,list_voice_bots,list_voice_menus,list_schedules,list_geo_routes,list_tags,list_texts, and the calls-specificcall_disposition_report/call_crosstab/call_export) page through the CTM API automatically up to amax_items(ormax_calls) cap — default 500 for most, higher for calls — and flag aWARNINGin the output if any account had more records than the cap, so truncation is never silent. Raise the cap rather than paging manually.Detail tools (
get_call,get_contact,get_number,get_source,get_queue,get_voice_bot,get_voice_menu,get_schedule,get_geo_route,get_user) return the full record by default — which for calls in particular can be 100+ fields including transcripts and touchpoint history — but accept an optionalfieldsparameter (a comma-separated list of top-level keys) to return just what's needed. Cheaper for anything that checks the same few fields across many records.
For call-level analysis specifically, reach for call_disposition_report
(aggregate stats), call_crosstab (two-dimension breakdown, e.g. source ×
status or campaign × status), or call_export (row-level CSV) rather than
paging through search_calls — see each tool's docstring for details on
why (in short: search_calls filters and totals only reflect a single
page, and CTM's calls-list payload already includes fields like name,
city, and state, so there's no need to loop get_call afterward to fill
those in).
call_crosstab/call_export can also group or filter by real ad-platform
attribution — campaign, campaign_id, keyword, ad_group, medium,
paid_source — pulled from CTM's per-call "paid" object, not just CTM's
own tracking-source label.
Architecture
ctm-multi-mcp
├── server.py FastMCP server, credential bootstrap
├── config.py Account filtering config from env/file
├── ctm_client.py Standalone CTM HTTP client (auth, paginate, paginate_capped, rate-limiting)
├── accounts.py Sub-account discovery, resolution, status filtering
├── client.py MultiAccountClient — concurrent operations across accounts
└── tools/
├── accounts.py list_sub_accounts
├── calls.py search_calls, get_call
├── contacts.py list_contacts, get_contact
├── geo_routes.py list_geo_routes, get_geo_route
├── numbers.py list_numbers, get_number
├── queues.py list_queues, get_queue
├── reports.py call_summary_report, call_disposition_report,
│ call_crosstab, call_export, reports_series,
│ reports_series_dimensions, account_ledger,
│ account_summary
├── schedules.py list_schedules, get_schedule
├── sources.py list_sources, get_source
├── tags.py list_tags
├── texts.py list_texts
├── users.py list_users, get_user
├── voice_bots.py list_voice_bots, get_voice_bot
└── voice_menus.py list_voice_menus, get_voice_menuSupport
email: jason.smith@ctm.com
License
MIT
Available Tools
32 toolsaccount_ledgerA
Get billing/ledger data across sub-accounts.
Shows usage charges for the given date range.
Only queries active sub-accounts by default. Pass account_status="archived", "canceled", "paused", or "all" to query other sub-accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | ||
| start_date | No | ||
| account_ids | No | ||
| account_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the default active-sub-account filtering and enumerates valid account_status values, which is valuable behavioral context. It also implies a read-only nature. It does not mention pagination or output format, but the output schema likely covers return structure. This exceeds a baseline given the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose and efficiently organized. Every sentence adds value: the first states the main function, the second clarifies output (usage charges by date range), and the third explains default and alternate behaviors. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, return values are covered elsewhere. The description provides essential operational context: default filtering, date-range usage, and account_status options. For a read-only query tool with no required parameters, this is largely complete. Minor gaps include lack of mention of account_ids and any permissions, but these are acceptable given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies account_status values and implies that start_date and end_date form a date range. However, the account_ids parameter is not mentioned at all. With four parameters, the coverage is partial and leaves one parameter entirely ambiguous, so the description adds some value but is not fully compensatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' and resource 'billing/ledger data across sub-accounts', clearly indicating the tool's function. It explicitly states it shows usage charges for a date range, which adds clarity. While it doesn't explicitly contrast with siblings like account_summary, the resource focus is distinct enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on default behavior (queries active sub-accounts) and how to adjust via account_status. However, it does not mention when to use this tool over alternatives like account_summary or reports_series, nor does it provide any exclusion criteria. Usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
account_summaryA
Get a high-level summary of each sub-account's configuration.
Shows account status, number counts, source counts, and active routing objects (queues, voice menus, schedules).
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses the default filtering and valid status values, which is useful. However, it does not explain the account_ids parameter, any permission requirements, or whether this is a read-only operation. The output schema covers return format, but other behavioral aspects remain unclear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, then details. Every sentence earns its place with no filler. Well-structured and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 optional parameters and an output schema, the description is quite complete. It explains what the summary contains, the default filter, and how to change it. The only notable gap is the lack of explanation for account_ids, but this is a minor omission given the simplicity of the tool and the presence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning for the 'status' parameter by listing allowed values ('archived', 'canceled', 'paused', 'all'). However, 'account_ids' is not explained, though its title ('Account Ids') and optional nature are somewhat self-evident. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'a high-level summary of each sub-account's configuration'. It goes on to specify the content (status, number counts, source counts, active routing objects), which distinguishes it from sibling tools that retrieve individual resources or plain lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context about the default behavior (active sub-accounts only) and explicitly lists the status values to include other states. It does not explicitly name alternatives or state when not to use this tool, but the summary nature is self-evident relative to siblings like list_sub_accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_crosstabA
Build a source × status crosstab matrix across sub-accounts.
Fetches calls for the given account_ids + date range and returns a matrix where rows are one dimension (default: source) and columns are another (default: status), with cell values = call counts.
Designed to answer "break down call volume by source and status for accounts X, Y, Z this week" in a single call instead of fanning out multiple filtered disposition reports.
Rows/cols dimensions: source, status, agent, tracking_number, receiving_number, tag, queue, day_of_week, campaign, campaign_id, keyword, ad_group, ad_group_id, ad_network, ad_match_type, medium, paid_source.
The campaign/keyword/ad_group dimensions read CTM's per-call "paid" attribution object (populated for Google/Bing/Meta click-through calls) — this is real ad-platform data, not CTM's own tracking-source label ("source"/"paid_source" above is that CTM label; "paid_source" pulls the ad platform itself, e.g. "google"). For Search traffic, Google sometimes withholds keyword-level text for privacy reasons even when the call is clearly attributable — campaign_id and ad_group_id are numeric IDs and much more reliably populated than the human-readable "campaign"/"keyword" names, so prefer those two when the readable names come back mostly "(not provided)".
Use start_date/end_date (ISO format) or time_duration (e.g. 'today', 'yesterday', 'wtd', 'last7days'). Increase max_calls for accounts with heavy volume.
Pass exclude_status (e.g. 'in progress') to omit in-flight calls for a point-in-time completed-calls view. Live calls that haven't finished ring as 'in progress' — they're counted by default since this is a real-time snapshot, but if you want only terminal states (answered, no answer, failed, etc.), pass exclude_status='in progress'.
| Name | Required | Description | Default |
|---|---|---|---|
| cols | No | status | |
| rows | No | source | |
| end_date | No | ||
| max_calls | No | ||
| start_date | No | ||
| account_ids | No | ||
| time_duration | No | ||
| account_status | No | ||
| exclude_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses the tool's behavior: it fetches calls, returns a matrix, includes live calls by default, lets users exclude in-progress calls via exclude_status, and explains the caveat about paid attribution data and Google withholdings. This goes well beyond minimal disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but each sentence adds useful context, from the high-level purpose to specific dimension nuances and the 'in progress' behavior. It is front-loaded with the main purpose, though the dimension list and caveats add length that could overwhelm if read in full.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, no annotations, and an output schema, the description addresses nearly every operational aspect: how to filter, what the matrix layout is, which dimensions exist, data attribution caveats, and handling of live calls. It is thorough enough to guide effective use without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 0%, the description compensates by explaining account_ids, date range (start_date/end_date or time_duration), max_calls, exclude_status, and rows/cols defaults and allowed values. However, it does not explain the account_status parameter or the expected format for account_ids (e.g., comma-separated vs. repeated), leaving a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'Build a source × status crosstab matrix across sub-accounts' uses a specific verb and resource, and the description expands on the output format and intended use case. It clearly distinguishes from siblings like call_disposition_report by framing this as a single-call aggregation across sub-accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states it's designed for a specific question ('break down call volume by source and status for accounts X, Y, Z this week') and contrasts with 'fanning out multiple filtered disposition reports.' It also provides concrete guidance on date formats, max_calls, and exclude_status, covering when to use each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_disposition_reportA
Aggregate call outcomes/dispositions across sub-accounts in one call.
Only queries active sub-accounts by default. Pass account_status="archived", "canceled", "paused", or "all" to query other sub-accounts.
Paginates the calls-list endpoint server-side (concurrently, not one page at a time) and returns pre-aggregated counts — call_status/dial_status breakdown, the logged disposition breakdown (CTM's 'sale.name' outcome field, e.g. "wrong number", "no message", "offering services"), duration stats, top marketing sources (which doubles as "breakdown by source" for whatever duration range you asked for), top ad-platform campaigns and keywords (from CTM's per-call "paid" attribution object — real Google/Bing/Meta campaign & keyword data, distinct from the CTM tracking-source label used for "source" above), and call volume by day of week.
Note on campaign/keyword data: Google withholds keyword-level text for some Search traffic even when the call is clearly attributable, so "(not provided)" keywords are expected, not a bug. campaign_id is far more reliably populated than the human-readable campaign name — if campaign names come back mostly blank, use call_crosstab with rows="campaign_id" (or "ad_group_id") for a reliable grouping.
Pass min_duration/max_duration (seconds) to scope everything — including the source/disposition/status breakdowns — to calls in that duration range, e.g. min_duration=60 for "calls over a minute by source". This replaces manually paging through search_calls and grouping raw records by hand.
Pass status (matches call_status/status/dial_status, exact, case-insensitive) and/or source (substring match against the marketing source name, case-insensitive) to scope the whole report further, e.g. status="answered", source="Google". NOTE: like search_calls, this is applied client-side after fetching — the CTM calls-list API's own status filter does not reliably work, so filtering happens here instead, on the full fetched set (not just one page), which is more reliable than filtering via search_calls.
Use this instead of paging through search_calls or looping get_call — this is the tool to reach for when asked to analyze calls/dispositions over a date range; it replaces what would otherwise take one get_call round-trip per call, or a full manual page-by-page scan for a duration/source/status cut.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| source | No | ||
| status | No | ||
| end_date | No | ||
| max_calls | No | ||
| start_date | No | ||
| account_ids | No | ||
| max_duration | No | ||
| min_duration | No | ||
| account_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: it queries only active sub-accounts by default, paginates concurrently server-side, applies status/source filtering client-side because the API's status filter is unreliable, and explains caveats like Google withholding keyword-level data. This is exceptionally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence earns its place. It is front-loaded with the primary purpose and organized into clear paragraphs for caveats, duration scoping, and client-side filtering. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 10 parameters, no annotations, and no schema descriptions, the description covers return values, edge cases (e.g., '(not provided)' keywords), filtering behavior, and alternatives. It is a complete usage guide that leaves little ambiguity for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It meaningfully explains account_status, min_duration/max_duration, status, and source semantics. However, not all 10 parameters are explicitly addressed (e.g., top_n, max_calls, account_ids, start_date/end_date), though some are inferable from context. It still adds significant value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Aggregate call outcomes/dispositions across sub-accounts in one call' — a specific verb+resource+scope. It clearly distinguishes itself from sibling tools like search_calls and get_call, which retrieve raw records rather than aggregated reports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'Use this instead of paging through search_calls or looping get_call — this is the tool to reach for when asked to analyze calls/dispositions over a date range.' It also names an alternative (call_crosstab) for campaign grouping, providing both when-to-use and when-to-avoid guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_exportA
Export a filtered, row-level list of individual calls as CSV.
Use this — not search_calls, not a get_call loop — any time the ask is for actual call records matching a filter (e.g. "answered calls over 60s yesterday with ID/Name/City/State", "give me the calls from Google Ads last week with caller number and city"). It replaces two things people otherwise reach for and both are worse:
Paging through search_calls with a status/disposition filter — that tool only filters within whatever single page it fetched, not across the full date range, so a "321 matching calls" answer from paging is unreliable; the total at the bottom of search_calls output is always the unfiltered count.
Looping get_call once per matching call to read name/city/state — unnecessary. CTM's calls-list endpoint already returns name, city, and state on every call record; this tool fetches once (paginated server-side, same mechanism as call_disposition_report and call_crosstab) and reads those fields directly off the already-fetched payload. No per-call round trip.
Filters (all optional, AND together): min_duration/max_duration (seconds), status (matches call_status/status/dial_status, exact, case-insensitive — e.g. "answered"), source (substring match against the marketing source name, case-insensitive). These are applied client-side across the entire fetched set (bounded by max_calls), not per-page — this is what makes the count reliable, matching what call_disposition_report would report for the same filters. Cross-check against call_disposition_report's "Calls analyzed" count if you want a sanity check before trusting the row count here.
fields: comma-separated columns, in order, forming the CSV header. Supported: id, source, name, city, state, called_at, duration, status, dial_status, disposition, caller_number, tracking_number, receiving_number, agent, tag, day_of_week, campaign, campaign_id, keyword, ad_group, ad_group_id, medium, ad_network, ad_match_type, paid_source. The last several are CTM's per-call "paid" ad-attribution fields (see call_crosstab's docstring for caveats about campaign/keyword sometimes coming back "(not provided)").
sort: field to order rows by, prefix "-" for descending (default "-called_at", most recent first). Only "called_at" and "duration" are supported as sort keys; anything else leaves rows in fetch order.
Use start_date/end_date (ISO format) or time_duration (e.g. 'today', 'yesterday', 'wtd', 'last7days' — see call_crosstab's docstring for the full list of accepted values).
Returns raw CSV text — header row plus one row per matching call. Hand it straight to the user as a file, or paste into a spreadsheet. Rows are capped at max_calls fetched per account (raise it for high-volume accounts/date ranges); a truncation warning is included as a leading comment line if any account hit the cap.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | -called_at | |
| fields | No | id,source,name,city,state,called_at,duration | |
| source | No | ||
| status | No | ||
| end_date | No | ||
| max_calls | No | ||
| start_date | No | ||
| account_ids | No | ||
| max_duration | No | ||
| min_duration | No | ||
| time_duration | No | ||
| account_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description fully discloses the tool's behavior: it returns raw CSV text with a header row, applies filters client-side after fetching the entire bounded set, includes a truncation warning as a leading comment if max_calls is hit, and uses server-side pagination through the same mechanism as call_disposition_report. It also warns about the unfiltered count in search_calls output, which is important for interpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded: it opens with a clear one-sentence purpose, then organizes information into paragraphs for alternatives, filters, fields, sort, dates, and return value. Every paragraph adds essential behavioral or usage detail, and the structure (with explicit 'Filters', 'fields:', 'sort:' labels) makes it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 12-parameter tool with no annotations, this description is exceptionally complete: it covers the return format, edge cases (truncation warning), cross-tool sanity checks (call_disposition_report), and the exact list of supported fields. It even explains the pitfalls of using sibling tools, which helps an agent avoid misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameter descriptions, so the description is critical. It meticulously documents most parameters: filters (min/max_duration, status, source), fields (with a full supported list and semantics), sort (with allowed keys and default), date/time selectors (start_date/end_date or time_duration), and max_calls (with the cap behavior). However, account_ids and account_status are not explicitly explained, leaving a small gap despite the otherwise thorough coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states the tool exports a filtered, row-level list of calls as CSV, naming the specific verb and output format. It explicitly differentiates from siblings by saying 'not search_calls, not a get_call loop', and clarifies the use case with examples.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides extensive guidance: it tells the agent to use this tool when raw call records matching a filter are needed, and explicitly names two tempting alternatives (search_calls and get_call) that are worse. It explains why those alternatives fail (per-page filtering and per-call loops) and even gives example queries, making the when-to-use decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_summary_reportA
Get aggregated call summary statistics across sub-accounts.
Returns call counts, average duration, total talk time, and breakdown by status/tag for each account and a combined total.
Use start_date/end_date (ISO format) or time_duration (e.g. 'today', 'yesterday', 'last7days', 'last30days').
Only queries active sub-accounts by default. Pass account_status="archived", "canceled", "paused", or "all" to query other sub-accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | ||
| start_date | No | ||
| account_ids | No | ||
| time_duration | No | ||
| account_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It does this well by stating the returned statistics, the default behavior of querying only active sub-accounts, and the ability to override via account_status. It omits finer details like timezone handling or pagination, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured: a one-line purpose, a concise list of return values, and two clear parameter usage notes. No repetitive or filler content; every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return details are not required in the description. The description covers the main filtering parameters and behavioral defaults, making the tool operable. The missing account_ids semantics is the only notable completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains start_date, end_date, time_duration, and account_status with formats/examples. However, account_ids is completely omitted, leaving the agent without any guidance on how to specify which sub-accounts to include, which is a meaningful gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Get aggregated call summary statistics across sub-accounts.' It clearly distinguishes this from sibling tools by emphasizing aggregation, sub-account scope, and combined totals, while also listing the specific metrics returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context by explaining accepted date parameters (start_date/end_date or time_duration), including concrete examples for time_duration, and the account_status filter with its possible values. However, it does not explicitly contrast with sibling tools like call_disposition_report or call_crosstab.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_callA
Get details for a specific call.
By default returns the full payload, including call_path and
transcript data — this is large (~100+ fields). If you only need a
handful of fields (e.g. when checking several calls in a row), pass
fields as a comma-separated list of top-level keys (e.g.
"call_status,dial_status,duration,source,tracking_number,tag_list,
sale,called_at,direction") to get back just those, which is much
cheaper than the full payload. For bulk disposition analysis across
many calls, prefer call_disposition_report instead of looping this.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| call_id | Yes | ||
| account_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full burden of behavioral disclosure. It reveals the non-obvious large default payload (~100+ fields) and explains how the 'fields' parameter truncates the response, which is critical operational knowledge. It does not mention permissions or error handling, but these are not prominent concerns for a read-only retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized but front-loads the primary purpose. Each sentence delivers operational value—large payload warning, field-filtering optimization, and alternative tool referral—without redundancy. It could be slightly tightened, but the structure is logical and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return shape is already documented. The description covers the main contextual concerns: default response size, parameter filtering behavior, and alternative tool selection. It does not detail error cases or authentication, but these are not major gaps for a straightforward single-call retrieval tool with an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides only names and types with 0% description coverage. The description compensates by thoroughly explaining the 'fields' parameter, including comma-separated format and examples of valid top-level keys. The required call_id and account_id are self-evident identifiers from the tool name, so the description adds sufficient semantic value for the most complex parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Get details for a specific call'), clearly indicating single-record retrieval. It also differentiates from the sibling call_disposition_report by explicitly directing bulk analysis elsewhere, establishing its scope as individual call detail access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using call_disposition_report for bulk disposition analysis, providing a clear alternative and exclusion condition. It also gives practical usage tips (pass 'fields' to reduce payload when checking several calls), giving the agent concrete guidance on when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactA
Get full details for a specific contact.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several contacts
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| account_id | Yes | ||
| contact_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the full payload is returned unless fields is specified, and that field filtering is 'cheaper.' However, it does not address error cases, permissions, or rate limits, which are relevant for an API retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp sentences with front-loaded purpose and a clear, useful tip about fields. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema handles return values. The description explains how to request a subset of fields, which complements the schema. It lacks guidance on alternative tools or error behavior, but for a simple getter this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description meaningfully explains the `fields` parameter's format (comma-separated keys) and its benefit. It does not elaborate on `contact_id` and `account_id`, but their names and schema types make them self-explanatory. Given 0% schema description coverage, the description partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves full details for a specific contact, using a specific verb ('Get') and resource ('specific contact'). It doesn't explicitly distinguish from list_contacts, but the 'specific' qualifier implies a single-record lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives guidance on using the fields parameter to reduce payload when checking several contacts, implying the tool is for targeted lookups. It does not mention when to use list_contacts or other alternatives, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_geo_routeA
Get full details for a specific geo router.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several routes
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| account_id | Yes | ||
| geo_route_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It discloses the behavior of the `fields` parameter (comma-separated list of top-level keys, returns subset, cheaper) which adds useful context beyond the schema. It does not mention auth or side effects, but the operation is clearly a read-only fetch by its name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose. The second sentence efficiently explains the optional parameter with a concrete example. Every word earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with an output schema available, so return values are covered. The description covers the main purpose and the only non-obvious parameter behavior. No external dependencies or edge cases are left unaddressed for this type of retrieval operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does an excellent job explaining the `fields` parameter's syntax and purpose, but gives no additional semantics for `geo_route_id` and `account_id`, which are largely self-explanatory from their names and the required schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'specific geo router', distinguishing it from list_geo_routes and other get_* tools. The scope is specific to retrieving details for one router identified by an ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the `fields` parameter (e.g., when checking several routes in a row), but it does not explicitly contrast this tool with the sibling `list_geo_routes` or state when to prefer one over the other. The intent is implied but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_numberA
Get full details for a specific tracking number.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several numbers
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| number_id | Yes | ||
| account_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains that the tool returns either the full payload or a subset via `fields`, which is a useful behavioral detail beyond the schema. It does not mention side effects or permissions, but since this is a read operation, the disclosed behavior is sufficient for typical use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary purpose, and provides a focused example. Every sentence earns its place without redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (so return values are already documented) and the tool is a simple single-resource getter, the description covers the main behavioral nuance (partial payload selection). It does not mention prerequisites beyond the required parameters, but the schema already lists those. The description is complete enough for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the lack of parameter documentation. It thoroughly explains `fields` but provides no additional meaning for `number_id` or `account_id` beyond their self-evident names. This partial compensation is insufficient for a low-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves 'full details for a specific tracking number,' using a specific verb and resource. It distinguishes itself from sibling get_ tools by explicitly naming the resource type (tracking number), so the agent knows exactly what this tool accesses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on using the `fields` parameter to reduce payload, including a concrete use case ('when checking several numbers in a row'). However, it does not mention any alternatives or when not to use this tool, so it misses the full picture of exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_queueA
Get full details for a specific call queue.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several queues
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| queue_id | Yes | ||
| account_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It transparently discloses the default full-payload behavior and the field-selection option, which gives insight into performance trade-offs. However, it does not explicitly state read-only status, error behavior, or permissions, leaving some gaps for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences, front-loaded with the main purpose, followed by a valuable tip. No wasted words or repetition of schema info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get tool with an output schema, the description is mostly sufficient, but given 0% schema coverage it could provide more context about the identifiers (e.g., how queue_id is scoped by account_id) or example usage. The field-selection tip adds value, but the overall guidance feels slightly under-specified for an agent encountering it cold.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful detail for the 'fields' parameter (comma-separated list, purpose) but gives no additional semantics for 'queue_id' or 'account_id' beyond their schema titles. Since schema coverage is 0%, the description partially compensates but not fully for the required identifier parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('call queue'), clearly distinguishing this from sibling list_queues. It states exactly what the tool does: returns full details for a specific queue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when to use the fields parameter ('when checking several queues in a row') and implies the tool is for retrieving a single queue. It does not explicitly mention when not to use it or alternatives, but the usage context is well implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleA
Get full details for a specific schedule, including time blocks.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several schedules
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| account_id | Yes | ||
| schedule_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It does add useful context: the fields parameter returns only requested top-level keys, which is 'cheaper' — implying a smaller payload. However, it does not mention potential side effects, authentication requirements, error behavior, or rate limits, leaving gaps for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs: the first states the core purpose, the second gives a focused usage tip. Every sentence earns its place, and key information is front-loaded. There is no redundant or verbose wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read tool with an output schema, so the description does not need to explain return values. It covers the essential purpose, the time blocks detail, and an optimization for the fields parameter. Missing explicit guidance on when to choose this over list_schedules or what happens on error, but overall sufficient for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does explain 'fields' with concrete semantics: a comma-separated list of top-level keys that limits the payload, with a cost/benefit note. The other parameters (schedule_id, account_id) are self-explanatory from their names, and the description adds enough value for the one non-obvious parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get full details for a specific schedule, including time blocks,' which uses a specific verb ('get') and resource ('specific schedule'), clearly distinguishing it from list_schedules. It also specifies what the response includes (time blocks), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by explaining when to use the 'fields' parameter (when checking several schedules in a row) and implies the tool is for single-schedule retrieval. However, it does not explicitly mention alternatives like list_schedules or state when not to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sourceA
Get full details for a specific source.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several sources
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| source_id | Yes | ||
| account_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explains the field-subsetting behavior and the 'cheaper' nature, which is useful, but it does not mention error cases, authentication needs, or explicit read-only guarantees. The term 'Get' implies read-only, but that is not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the core purpose, the second explains a smart usage hint. It is concise, front-loaded, and every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-resource getter, the description covers the main purpose, the optional field filtering, and a performance consideration. Since an output schema exists, return values need no further explanation. It is missing some details about parameter roles, but overall it is complete enough for straightforward use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'fields' parameter in detail (comma-separated top-level keys, subset of payload, cost efficiency), but does not clarify 'source_id' or 'account_id', though their purpose is implied by their names. The compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get full details for a specific source,' which clearly identifies a single-resource retrieval operation. The verb 'get' and resource 'source' distinguish it from sibling tools like 'list_sources' and other resource-specific getters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by explaining when to use the 'fields' parameter ('when checking several sources in a row') and emphasizes the cost benefit. It does not explicitly mention alternatives or when not to use the tool, but the purpose is evident from the resource-specific naming.
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 details for a specific user.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several users
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| user_id | Yes | ||
| account_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose a key behavioral trait: passing 'fields' returns only those fields and is 'cheaper' than the full payload. However, it does not mention error behavior, permissions, account_id semantics, or any other potential side effects. This is minimal 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The main purpose is front-loaded in the first sentence, and the second sentence efficiently explains the optional fields parameter. Every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple get-by-ID operation with an output schema present, so the description need not detail return values. It covers the core purpose and the main behavioral variation. Some missing parameter explanations and a lack of sibling differentiation slightly reduce completeness, but it is adequate for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all parameters. It does explain 'fields' well: comma-separated list, returns just those, cheaper. However, it does not explain the required 'user_id' and 'account_id' parameters, which are only given as titles in the schema. The description fails to fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Get full details for a specific user.' This clearly distinguishes it from sibling tools like list_users (which lists many users) and other get_* tools (which target different resource types). The resource and action are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use this tool when you need details for a single user, as opposed to listing all users. It also gives practical guidance on when to use the 'fields' parameter (when only a few fields are needed). However, it does not explicitly name alternatives or state when not to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_voice_botA
Get full details for a specific voice bot, including prompt and config.
Pass fields as a comma-separated list of top-level keys to get
back just those instead of the full payload — cheaper when you
only need a couple of fields, e.g. when checking several bots
in a row.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| account_id | Yes | ||
| voice_bot_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It transparently describes the two response modes (full payload vs selected fields) and the cost-saving intent, though it omits auth and error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary purpose, followed by focused parameter guidance. No filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format details are unnecessary. The description covers the tool's purpose and the main optional behavior; only minor error/edge-case guidance is missing, but the overall context is sufficient for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage. The description compensates for the fields parameter by specifying comma-separated top-level keys and a practical use case. voice_bot_id and account_id remain self-explanatory from their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it gets full details for a specific voice bot, including prompt and config. The verb 'get' plus 'specific' distinguishes it from sibling tools like list_voice_bots and other getters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on using the optional fields parameter for cheaper, partial responses when checking several bots. It does not explicitly mention alternatives like list_voice_bots, but the 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.
list_contactsA
List contacts across sub-accounts.
Filter by name, email, or phone number substring match.
Fetches up to max_items contacts per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large contact list; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| phone | No | ||
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No | ||
| name_contains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses key behaviors: automatic paging, the CTM per_page cap, max_items truncation with a warning, defaulting to active sub-accounts, and allowed status values. This goes well beyond a basic list operation and gives the agent a solid understanding of side effects and limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into clear, purposeful sections: purpose, filters, pagination behavior, and status defaults. Every sentence adds value without fluff, making it concise yet informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters and no annotations, the description is quite comprehensive, covering filters, pagination, truncation, and status handling. The output schema exists, so return values are already covered. The only notable omission is the account_ids parameter, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It explains the name, email, and phone filters, the per_page and max_items usage, and the status enum values. However, it does not explicitly describe the account_ids parameter, leaving a minor gap in an otherwise strong compensatory effort.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'List contacts across sub-accounts,' which uses a specific verb (List), defines the resource (contacts), and clarifies the scope (across sub-accounts). This clearly distinguishes it from siblings like get_contact (single contact) and list_sub_accounts (accounts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on filtering (name, email, phone), pagination behavior, and status defaults. It explains how to adjust scope with status values, but it does not explicitly discuss when to use this tool versus alternatives like get_contact. This aligns with 'clear context, no exclusions,' meriting a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_geo_routesA
List geo routers and conditional routers across sub-accounts.
Fetches up to max_items of each per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large number of routers; a truncation warning is included if any account had more than max_items of either type.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains pagination (CTM caps per_page at ~100, auto-walking pages), truncation warnings, and default status filtering. This goes well beyond a basic 'lists routes' statement and gives the agent essential execution expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear paragraph breaks, front-loaded purpose, and every sentence adds useful information. It is long but justified by the behavior it discloses; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 optional params, no annotations) and the presence of an output schema, the description covers the most critical behavior: pagination, truncation, status defaults, and account-level iteration. It falls short only on explicit parameter documentation for account_ids, though the output schema mitigates return-value ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description compensates partially by explaining max_items (raise for large accounts), status (allowed values and default), and per_page (indirectly via CTM cap). However, it does not explicitly explain account_ids semantics, which is a notable gap for a multi-account listing tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List geo routers and conditional routers across sub-accounts,' using a specific verb and resource while distinguishing this list operation from the sibling get_geo_route tool. It also clarifies scope (sub-accounts) and includes both geo routers and conditional routers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it explains default behavior (active sub-accounts only), how to include other statuses, and how to adjust max_items for large accounts. However, it does not explicitly contrast with alternatives like get_geo_route, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_numbersA
List tracking numbers and their routing across sub-accounts.
Shows which numbers exist, their type (toll-free/local), status, and current routing destination.
Fetches up to max_items numbers per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large number inventory; a truncation warning is included if any account had more than max_items.
Only queries active sub-accounts by default (this is about which
accounts get searched, separate from status, which filters
numbers by their own status). Pass account_status="archived",
"canceled", "paused", or "all" to search other sub-accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No | ||
| number_type | No | ||
| name_contains | No | ||
| account_status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to rely on, the description carries the full transparency burden. It discloses the automatic paging behavior, the per_page cap, the truncation warning, and the distinction between account_status and status. This is meaningful behavioral information beyond what the schema provides, though it stops short of covering error handling or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a clear first sentence states the purpose, followed by concise details on output, paging, and filtering. Every sentence adds value and there is no filler. It is neither too terse nor overly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, some nuanced interactions) and the existence of an output schema, the description covers the most important behavioral aspects: paging, truncation, and account filtering. It does not explain account_ids or name_contains in detail, but these are relatively simple. The description is sufficiently complete for an agent to select and invoke the tool correctly in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must clarify parameters. It explains max_items (paging quantity), per_page (indirectly via cap), account_status (which accounts to search), status (filters numbers by their own status), and number_type (toll-free/local). It does not explicitly cover account_ids or name_contains, but the key parameters are well-defined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists tracking numbers and their routing across sub-accounts, immediately distinguishing it from sibling tools like get_number (single number) and list_sub_accounts (different resource). The verb 'list' plus detailed resource and scope makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on how to use the tool: it explains the default active sub-account filtering, how to override with account_status, and the meaning of max_items for paging. It does not explicitly name alternative tools or state when not to use this tool, but the usage context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_queuesA
List call queues (ring groups, agent pools) across sub-accounts.
Fetches up to max_items queues per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large number of queues; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses automatic pagination, the CTM per_page cap, max_items truncation behavior, and the default status filter, going well beyond a typical 'list' tool description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet information-dense, with a clear front-loaded purpose and follow-up paragraphs that each add operational value. There is no wasted text or repetition of schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need not be described. The description covers pagination, defaults, and truncation. However, account_ids is left unexplained, which is a small but notable gap for a tool with four parameters and no schema descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains status values and defaults, max_items semantics, and per_page cap indirectly. However, the account_ids parameter is not described, and schema description coverage is 0%, so the description only partially compensates for the missing schema metadata.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clearly identified resource ('call queues' with synonyms 'ring groups, agent pools'), scoped to 'across sub-accounts'. This distinguishes it from sibling tools like get_queue (singular resource) and list_sub_accounts (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it lists queues across sub-accounts, defaults to active sub-accounts only, and tells the user how to include other statuses. It does not explicitly contrast with get_queue or other alternatives, but the usage 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.
list_schedulesA
List time-based schedules across sub-accounts.
Schedules control when routing rules are active (business hours, holidays, etc.).
Fetches up to max_items schedules per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large number of schedules; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden—and it excels. It discloses pagination behavior (auto-walks pages, CTM caps per_page at ~100), the truncation warning, max_items semantics, and default filtering. This goes beyond the input schema and provides essential operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. It front-loads the core purpose in the first line, then provides need-to-know behavioral details in a structured, skimmable format. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (paging, status filtering, multi-account scope) and complete lack of annotations, the description covers almost everything needed to invoke it correctly. The output-schema exists, so return values are handled structurally. A small gap is not documenting the exact format of account_ids, but overall the contextual need is met.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explicitly explains status (possible values and effect) and max_items (raises limit, triggers truncation warning). It does not detail account_ids format or per_page beyond mentioning the CTM cap, but it meaningfully covers two key parameters and the overall paging model, which is the critical semantic for this tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'List time-based schedules across sub-accounts.' It clearly identifies the tool's function and scope, and later differentiates it from the sibling get_schedule by referencing 'time-based schedules' and 'routing rules' activity windows. This makes the purpose unambiguous and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.' It also explains when to raise max_items for larger accounts. While it doesn't explicitly name alternative sibling tools, it clarifies its own scope and behavior sufficiently for selection among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesA
List tracking sources (channels, campaigns) across sub-accounts.
Fetches up to max_items sources per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large source list; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it explains automatic paging due to CTM's per_page cap, the truncation warning when max_items is exceeded, and the default filtering to active sub-accounts. These details go well beyond the schema and are essential for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct yet information-dense: three sentences cover purpose, paging behavior, and status parameter. Every sentence earns its place, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a listing tool with no annotations, the description provides robust operational details: paging, truncation, default filtering, and parameter guidance. The output schema handles return-value documentation. The only notable gap is the lack of account_ids semantics, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema description coverage is 0%, the description adds meaning for max_items (raising it for large lists), status (accepted values), and per_page (context about CTM's cap). However, account_ids is omitted entirely, leaving its purpose and format unspecified. The description partially compensates for the schema gap but does not cover all parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List tracking sources (channels, campaigns) across sub-accounts,' which specifies a clear verb, resource, and scope. It distinguishes itself from siblings like get_source (which retrieves a single source) and list_sub_accounts (which lists accounts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear operational context: it explains the default behavior (active sub-accounts), how to change the status filter, and when to increase max_items for large source lists. It does not explicitly name alternative tools, but the scope is clear enough that an agent would know when to invoke this versus a get_* or report tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sub_accountsA
List sub-accounts accessible by the parent API key.
Defaults to active accounts only. Pass status="archived", "canceled", or "paused" to see those instead, or status="all" for every account regardless of status.
Returns account IDs, names, statuses, and any labels from the CTMMulti accounts configuration file.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the default active filter, valid statuses, and the return fields (account IDs, names, statuses, labels). This goes beyond basic metadata, though it omits potential pagination or permission details. Still, it provides solid transparency for a read-only list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short paragraphs, front-loaded with purpose, followed by parameter behavior and return details. Every sentence adds information, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one optional parameter, an output schema (so return format is separately defined), and a thorough explanation of status filtering, the description covers all necessary operational aspects. It is complete for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes 'status' only as an optional string/null with no enum or description. The description compensates fully by enumerating valid statuses and explaining the default behavior, making parameter usage clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List sub-accounts accessible by the parent API key', using a specific verb and resource. It clearly distinguishes this from other list_* tools by focusing on sub-accounts and the parent API key context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the default behavior (active only) and the status parameter options ('archived', 'canceled', 'paused', 'all'), giving clear context for when to use. However, it does not explicitly name alternative tools or exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsA
List tags (labels) across sub-accounts.
Tags are used to categorize calls, contacts, numbers, etc.
Fetches up to max_items tags per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large number of tags; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses important behavior: automatic paging with per_page capped at ~100 by CTM, truncation warnings when max_items is exceeded, and default sub-account status filtering. These details go beyond the schema and help the agent set correct expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into three short paragraphs, each adding essential information: a clear definition, pagination and truncation behavior, and defaults for sub-account status. No wasted sentences; the length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 4-parameter schema, zero annotations, and presence of an output schema, the description covers the key behavioral aspects: pagination strategy, truncation handling, status filtering, and account scope. The return shape is presumably covered by the output schema, so not describing it does not harm completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains 'status' values, the 'max_items' behavior with truncation warnings, and the per_page cap. However, 'account_ids' is only implied via 'across sub-accounts' and is not explicitly described, leaving a minor gap in parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List tags (labels) across sub-accounts.' This clearly identifies the tool's function and distinguishes it from sibling tools like list_numbers or list_contacts by emphasizing the cross-account scope and the tagged entity types (calls, contacts, numbers).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it defaults to active sub-accounts, explains how to include archived/canceled/paused accounts via the 'status' parameter, and describes when to raise 'max_items' for large tag counts. It does not explicitly name alternative tools, but no sibling provides tag-specific listing, so this is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_textsA
List SMS/text messages across sub-accounts.
Useful for auditing text communication across all client accounts.
Fetches up to max_items texts per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with heavy text volume or narrow start_date/end_date instead; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| end_date | No | ||
| per_page | No | ||
| max_items | No | ||
| start_date | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It reveals pagination behavior (auto-walking pages due to CTM cap), the role of max_items, truncation warnings, and default status filtering. These are meaningful behavioral traits beyond the bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose, then adds contextual use, then dives into parameter behavior. Every sentence provides distinct value, and the formatting with dashes and semicolons keeps it readable without being bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return format doesn't need explanation. The description covers the most important operational details: pagination, status filtering, truncation, and capacity. The only missing piece is explicit handling of account_ids and date formats, which are secondary for a list operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains max_items, per_page cap, status values, and suggests using date ranges. However, it does not describe account_ids or date format details, leaving a small gap in an otherwise parameter-aware tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List SMS/text messages across sub-accounts.' This clearly distinguishes it from sibling tools like list_calls or list_numbers, and the scope (across sub-accounts) is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a concrete use case: 'Useful for auditing text communication across all client accounts.' It also advises on parameter tuning (raise max_items or narrow dates). However, it does not explicitly mention alternative tools or when not to use it, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersA
List users (agents, admins) across sub-accounts.
Fetches up to max_items users per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large user list; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It discloses pagination behavior (auto-paging, CTM per_page cap ~100), the truncation warning for large lists, and the default status filter. This is rich behavioral context beyond what the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence definition followed by essential details in separate focused paragraphs. Every sentence adds value, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (pagination, status defaults, multi-account scope) and the presence of an output schema, the description covers most key aspects well. The omission of account_ids is a slight gap, but overall it is sufficiently complete for an agent to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain parameters. It does explain max_items, per_page, and status with practical meaning (e.g., 'raise max_items for accounts with a large user list'). However, account_ids is not mentioned, leaving one of four parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List users (agents, admins) across sub-accounts,' which clearly identifies the action, resource, and scope. This distinguishes it from sibling tools like get_user (single user) and list_sub_accounts (sub-accounts themselves).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete usage guidance: defaults to active sub-accounts, how to include archived/canceled/paused via status, and when to raise max_items for large lists. It does not explicitly name alternatives, but the context for when to use this tool is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_voice_botsA
List VoiceAI voice bots across sub-accounts.
Fetches up to max_items voice bots per account, paging automatically (CTM caps per_page at ~100, so this walks as many pages as needed rather than returning just the first one) — raise max_items for accounts with a large number of bots; a truncation warning is included if any account had more than max_items.
Defaults to active sub-accounts only. Pass status="archived", "canceled", "paused", or "all" to include others.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| per_page | No | ||
| max_items | No | ||
| account_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does so well: it discloses automatic pagination, the per_page ceiling (~100), the truncation-warning behavior, and the default status filter. This gives the agent concrete expectations for side effects and limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with purpose, then behavior, then defaults/status. No redundant phrases; every sentence adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is strong for a list tool: it covers pagination, limits, warnings, and statuses, and an output schema exists to define return shape. The main omission is account_ids semantics, which makes it not fully complete for the 4-parameter schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain parameters. It meaningfully explains status values, max_items truncation, and per_page cap, but it never explains the account_ids parameter (format, filtering behavior, relationship to 'across sub-accounts'), leaving a gap for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List VoiceAI voice bots across sub-accounts'), making the tool's scope immediately clear. It is distinct from sibling tools like get_voice_bot (single bot retrieval) and list_voice_menus (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly notes the default active-sub-account scope and lists valid status override values ('archived', 'canceled', 'paused', 'all'), and frames when to raise max_items. However, it doesn't explicitly name alternatives like get_voice_bot for singleton lookups, so it stops short of a full when/when-not guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_seriesA
Get time-series call data aggregated by dimension across sub-accounts.
Uses the CTM Reports Series API to return call counts broken down by the requested dimension. This is the most flexible reporting endpoint — supports 40+ dimensions for slicing call data.
Required: start_date, end_date (ISO format, e.g. 2026-01-01) by: dimension to aggregate on (use reports_series_dimensions for the full list) interval: time granularity — hour, day (default), month, year
If the response comes back empty (items=0), the output includes the envelope keys so the request can be debugged without checking server logs.
Known limitation: this endpoint occasionally returns items=0 even for accounts with known call volume. When it works it's server-side fast; when it doesn't, fall back to call_disposition_report for the same data (client-side aggregation, works reliably).
Optional filters: direction: inbound, outbound, form, msg_inbound, msg_outbound multi_tracking_numbers + operator: filter by tracking number IDs multi_receiving_numbers + operator: filter by receiving number IDs ring_time/talk_time/duration + operator: filter by time thresholds multi_tags + operator: filter by tag names Operators: includes, excludes, less_than, less_than_equal, greater_than, greater_than_equal, equal
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | source | |
| duration | No | ||
| end_date | No | ||
| interval | No | day | |
| direction | No | ||
| ring_time | No | ||
| talk_time | No | ||
| multi_tags | No | ||
| start_date | No | ||
| account_ids | No | ||
| account_status | No | ||
| duration_operator | No | ||
| ring_time_operator | No | ||
| talk_time_operator | No | ||
| multi_tags_operator | No | includes | |
| multi_tracking_numbers | No | ||
| multi_receiving_numbers | No | ||
| multi_tracking_numbers_operator | No | includes | |
| multi_receiving_numbers_operator | No | includes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses a known limitation (intermittent empty responses), explains that debug envelope keys are included when items=0, and compares server-side vs client-side behavior. This exceeds typical disclosure, though it doesn't mention auth or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with labeled sections (Required, Optional filters, Known limitation) and front-loads the main action. It's longer than average but each sentence adds operational value, and there's no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 19-parameter tool with no annotations, the description covers the core functionality, required parameters, optional filters, operators, debugging behavior, and fallback. The output schema exists, so return-value documentation isn't necessary. Minor omissions like auth/rate limits keep it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description compensates by grouping the 19 parameters into required, optional filters, and operators. It explains the by dimension (referring to reports_series_dimensions), interval granularity, and lists all operators. However, it doesn't individually describe account_ids/account_status, which are less self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: 'Get time-series call data aggregated by dimension across sub-accounts.' It further distinguishes itself from siblings by calling it 'the most flexible reporting endpoint' and explicitly mentions a fallback to call_disposition_report, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states required parameters (start_date, end_date, by, interval) and provides explicit guidance on when to use an alternative: 'fall back to call_disposition_report... works reliably.' This gives the agent concrete conditions for use versus a specific sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reports_series_dimensionsA
List available dimensions for the reports_series tool.
These are the values you can pass to the 'by' parameter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains that the output is meant for the 'by' parameter, which adds useful behavioral context. However, with no annotations, it doesn't explicitly state whether this is a read-only operation or other side effects, though the 'list' verb implies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-load the action and immediately state the purpose. No filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with an output schema, the description is complete. It states what is listed and how the list is used, while the output schema handles return format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so the baseline is 4. The description further adds meaning by explaining that the returned dimensions are values for the 'by' parameter in reports_series, which provides context beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists dimensions for reports_series, with an explicit link to the 'by' parameter. This distinguishes it from other list tools like list_sub_accounts or list_users, making the purpose immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool (to get valid values for the 'by' parameter of reports_series). It doesn't mention exclusions or alternatives, but the usage context is clear enough for such a simple metadata tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_callsA
Search calls across sub-accounts.
Pass account_ids as a comma-separated list, or omit to search all active sub-accounts. For large result sets, use per_page and page for pagination, or use narrow date ranges.
Only searches active sub-accounts by default. Pass account_status="archived", "canceled", "paused", or "all" to search other sub-accounts.
Each result line includes call_status/dial_status, the logged disposition (CTM's 'sale' outcome field, e.g. "wrong number", "no message"), source, tags, and (when present) the ad-platform campaign/keyword from CTM's per-call "paid" attribution object — no need to call get_call just to see the outcome or ad attribution of a call. Note campaign/keyword are frequently blank for non-paid traffic, and keyword specifically can be blank even for paid Search traffic (Google withholds it for some queries) — that omission from the line is expected, not a sign the field is missing from the API.
NOTE: the CTM calls-list API does not reliably filter server-side by
status. This tool applies status and disposition as a
best-effort client-side filter on top of whatever page is returned,
so filtered counts only reflect the current page, not the full
unfiltered total shown at the bottom of the output. For an accurate
aggregate breakdown across all pages, use call_disposition_report
instead of paging through search_calls with a filter.
If what's actually wanted is a row-level list of the matching calls themselves (not just counts) — e.g. "the calls answered over 60s yesterday with ID/Name/City/State" — use call_export instead of paging through search_calls page by page and manually filtering/collecting rows, and instead of looping get_call per call afterward to fill in name/city/state (those fields are already present on every call in this list, no per-call lookup needed). call_export filters across the full date range in one shot and returns ready-to-use CSV.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| page | No | ||
| sort | No | ||
| status | No | ||
| user_id | No | ||
| end_date | No | ||
| per_page | No | ||
| queue_id | No | ||
| caller_id | No | ||
| source_id | No | ||
| contact_id | No | ||
| start_date | No | ||
| account_ids | No | ||
| disposition | No | ||
| account_status | No | ||
| tracking_number_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral quirks: server-side filtering is unreliable for status so client-side filtering is best-effort and page-limited; only active sub-accounts are searched by default; campaign/keyword may be blank for non-paid or withheld by Google. These are critical non-obvious behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence contributes essential guidance. It is well-structured into focused paragraphs (scope, pagination, filtering limitation, alternative tools), and the content density justifies the length. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex search tool with 16 optional parameters, no annotations, and no schema descriptions, this description covers almost everything an agent needs: result contents, filtering limitations, expected blanks, pagination, and when to use sibling tools. The presence of an output schema means return-value details are not required here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema has zero descriptions for its 16 parameters, the description adds significant meaning for key ones: account_ids, account_status, page/per_page, status/disposition, and date ranges. However, some parameters like sort, user_id, queue_id, and tracking_number_id are not explicitly explained, so coverage is not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search calls across sub-accounts' and expands on the specific result fields (call_status/dial_status, disposition, source, tags, campaign/keyword) that distinguish it from siblings like get_call and call_export. This makes the tool's role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Excellent guidance: it explicitly recommends call_disposition_report for accurate aggregate counts, call_export for row-level lists, and notes that per-call outcome/ad attribution is already present so there is no need to call get_call afterward. It also explains account_status options and pagination strategy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoA
Return server version and build info to confirm which code is live.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool returns ('version and build info') and implies a read-only, non-destructive operation, but does not explicitly mention that it has no side effects or require any special permissions. For a simple info tool this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys the tool's purpose and context without any filler. It is front-loaded with the action and resource, making it highly scannable and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with an output schema, the description fully covers the essential context: what the tool does and why an agent would use it. There is no missing information about parameters or return shape, as the output schema handles the latter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain parameter details. The baseline of 4 applies, and the description correctly focuses on the tool's purpose rather than inventing parameter-related content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Return' and identifies the resource 'server version and build info', making the tool's purpose immediately clear. It is unique among the listed sibling tools, all of which focus on data listing/retrieval rather than system info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'to confirm which code is live' provides clear context for when this tool is appropriate. No alternatives or exclusions are needed given the tool's singular, self-contained purpose, and the context is sufficient for an agent to decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The list_*/get_* pairs are each clearly scoped to a distinct entity (numbers, contacts, sources, etc.). The reporting tools (call_disposition_report, call_summary_report, call_export, call_crosstab, reports_series) have overlapping call-data purposes but their descriptions clarify distinct output formats and use cases, so an agent can usually pick correctly.
The dominant pattern is list_<entity> / get_<entity>, which is consistent and predictable. The reporting tools deviate with names like call_export, call_crosstab, and reports_series, which are still descriptive but don't follow a uniform verb_noun convention. Overall the set is orderly, not chaotic.
At 32 tools, the server is on the heavy side, exceeding the 3-15 tool sweet spot. However, the count is largely justified by the need to cover 12+ entity types with list/get pairs plus several reporting tools. It's not bloated with redundant duplicates, but it does tax an agent's context window.
The server covers a wide range of call-tracking resources (calls, numbers, contacts, sources, queues, bots, menus, schedules, routes, users, tags, texts) and provides multiple reporting/export options. Minor gaps exist: no get_text, get_tag, or get_sub_account, and no mutation operations, but for a read-heavy reporting API this is largely complete.
Maintenance
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
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenancePublic read-only MCP server for FoxTrove Voice, enabling LLMs to query call logs, customer records, assistant stats, and analytics via secure OAuth.MIT
- AlicenseCqualityDmaintenanceRead-only MCP server for Meta (Facebook) Graph API, enabling access to Marketing API, Pages, Instagram, and WhatsApp Business data through Claude Code and any MCP-compatible client.30141MIT
- AlicenseAqualityAmaintenanceA read-only MCP server for querying AI provider administration APIs, providing normalized usage, cost, and dashboard data for OpenAI and Anthropic.419MIT
- FlicenseNot gradedqualityCmaintenanceA read-only MCP server that exposes Telegram lead conversations to Claude for sales analysis, enabling lead summary, intent, stage, and follow-up insights.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/CTMJSON/ctm-multi-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server