Skip to main content
Glama
burkecampbell

twilio-call-data-mcp

twilio-call-data-mcp

An MCP server that gives any MCP client read-only access to Twilio call data. It exposes six tools for searching calls, pulling recordings, querying agent activity, and generating summaries — with explicit handling for the ways Twilio's data misleads you if you take it at face value.

This server is read-only. It cannot place calls, send messages, modify resources, or access billing. That constraint is a feature.

Install

npm install twilio-call-data-mcp

Or clone and build:

git clone https://github.com/burkecampbell/twilio-call-data-mcp.git
cd twilio-call-data-mcp
npm install
npm run build

Credentials

Set three environment variables. The server refuses to start without the first two.

export TWILIO_ACCOUNT_SID=your_account_sid
export TWILIO_AUTH_TOKEN=your_auth_token
export TWILIO_WORKSPACE_SID=your_taskrouter_workspace_sid  # required for agent tools

Copy .env.example to .env for local development. Never commit .env.

MCP Client Configuration

Add to your MCP client config (e.g., Claude Desktop):

{
  "mcpServers": {
    "twilio-call-data": {
      "command": "npx",
      "args": ["twilio-call-data-mcp"],
      "env": {
        "TWILIO_ACCOUNT_SID": "your_account_sid",
        "TWILIO_AUTH_TOKEN": "your_auth_token",
        "TWILIO_WORKSPACE_SID": "your_workspace_sid"
      }
    }
  }
}

Related MCP server: FoxTrove Voice MCP Server

Tools

search_calls

Filter call records by date range, phone number, direction, status, minimum duration, or agent. Returns rows plus a pagination cursor.

Parameter

Type

Required

Description

start_date

string

No

Start of range (YYYY-MM-DD or ISO 8601), interpreted in timezone

end_date

string

No

End of range

phone_number

string

No

E.164 format, matches from or to

direction

enum

No

inbound, outbound-dial, outbound-api, outbound

status

enum

No

completed, busy, no-answer, canceled, failed, etc.

min_duration

integer

No

Minimum CDR duration in seconds

agent

string

No

Agent name or worker SID

page_size

integer

No

1-100, default 50

cursor

string

No

From a previous response

timezone

string

No

IANA timezone, default UTC

get_call

Full detail for one call SID, including child legs.

Parameter

Type

Required

Description

call_sid

string

Yes

Starts with "CA"

timezone

string

No

IANA timezone, default UTC

get_recording

Recording metadata for a call: signed URL with expiry, duration, channel count, and transcript if one exists. Never returns audio bytes.

Parameter

Type

Required

Description

call_sid

string

Yes

Starts with "CA"

timezone

string

No

IANA timezone, default UTC

list_agents

TaskRouter worker roster with current activity status.

Parameter

Type

Required

Description

timezone

string

No

IANA timezone, default UTC

get_agent_activity

Activity and reservation history for one worker over a time window, with summary statistics.

Parameter

Type

Required

Description

worker_sid

string

Yes

Starts with "WK"

start_date

string

Yes

Window start

end_date

string

Yes

Window end

timezone

string

No

IANA timezone, default UTC

call_summary

Aggregates by day, agent, or queue: call counts, talk time, and abandonment rate.

Parameter

Type

Required

Description

start_date

string

Yes

Range start

end_date

string

Yes

Range end

group_by

enum

No

day, agent, or queue (default day)

timezone

string

No

IANA timezone, default UTC


Talk Time: Why This Server Returns Two Numbers

Every tool that reports call duration returns two fields, not one:

{
  "duration_seconds": { "value": 42, "source": "cdr", "measures": "ring_to_hangup" },
  "talk_seconds":     { "value": 35, "source": "taskrouter", "measures": "agent_audio_open" }
}

What is happening: Twilio's CDR (Call Detail Record) duration counts from the moment the call connects — including ring time — to hangup. TaskRouter and Flex Insights count from when the agent's audio path actually opens. For the same call, these numbers disagree. In the example above, seven seconds of ringing are counted as "duration" in the CDR but are not part of the actual conversation.

Why this matters: An LLM handed a bare duration: 42 will average it, bill against it, and compare it to a talk_time: 35 from another source without knowing these are different measurements of the same call. It will produce confident, wrong totals. A human reviewing those totals will not know to question them because the numbers look precise.

What we do: Every duration field in every response carries its source (where the number came from) and measures (what the number actually counts). A consumer that receives both fields can choose which one fits their question. A consumer that ignores the labels is making that choice explicitly rather than accidentally.

What this costs: Slightly larger payloads. Every response carries two labeled objects instead of one bare integer. The trade-off is worth it — seven seconds of mislabeled data across a month of calls adds up to hours of phantom talk time.


What This Server Does Not Do

  • No call control. Cannot place, transfer, hold, or end calls.

  • No messaging. Cannot send or read SMS/MMS.

  • No resource modification. Cannot update call records, recordings, worker states, or any Twilio resource.

  • No billing access. Cannot read account balance, usage records, or pricing.

  • No audio streaming. Recording endpoints return signed URLs and metadata, never audio bytes.

If you need write operations, use the Twilio SDK directly. This server exists specifically to be safe to point an LLM at.


Decision Log

1. Never return one number for talk time

Naive approach: Return duration: 42 like Twilio's API does.

How it fails: A downstream consumer averages CDR durations against TaskRouter talk times from another report. The 7-second ring-time gap per call compounds across hundreds of calls into hours of phantom talk time. Worse, this looks correct — both numbers are real, they just measure different things.

What we do instead: Every duration field is a structured object with value, source, and measures. CDR duration and TaskRouter talk time are never presented as the same kind of number.

What it costs: Larger JSON payloads. Consumers must destructure an object instead of reading a bare integer. This friction is the point — it forces acknowledgment of what the number means.

2. Timezones are explicit or the tool refuses

Naive approach: Accept date strings and assume UTC, or worse, assume the server's local time.

How it fails: A twelve-hour offset between a source timestamp and the server's timezone assumption put an entire day of calls on the wrong date. The symptom looked like missing data — "we had no calls on Tuesday" — when the calls were there, just bucketed into Monday and Wednesday by a timezone mismatch.

What we do instead: Every tool accepts an optional timezone parameter (IANA identifiers only — "America/New_York", not "EST"). Defaults to UTC. Date range filters are interpreted in the caller's timezone. Every timestamp in every response carries its timezone. No implicit conversions.

What it costs: Callers must know their timezone, which they already do. Responses are slightly larger with the timezone field. The alternative — silent misattribution of calls to wrong dates — costs debugging hours.

3. Pagination that admits truncation

Naive approach: Return the first 50 rows. If there are more, include a next_page link.

How it fails: A consumer receives 50 rows and computes totals. There were actually 200 rows. Nothing in the response distinguished "there were 50 calls" from "we stopped at 50." The consumer's summary is confidently wrong by 75%.

What we do instead: Every paginated response includes has_more (boolean), truncated (boolean), total_available (integer or null), and cursor (opaque string). When a result set hits the page size limit, truncated: true tells the consumer explicitly that totals computed from this page are incomplete.

What it costs: One extra boolean and one nullable integer per response. Consumers that want complete data must page through. But now they know they need to.

4. Rate limits handled, not hoped about

Naive approach: Make the API call. If it fails, return the error.

How it fails: Twilio returns 429 under load. A bare error response gives the consumer no information about whether this is a transient throttle or a persistent problem, and no way to distinguish "the data doesn't exist" from "we couldn't get to it."

What we do instead: Exponential backoff with jitter on 429 and 5xx responses, up to 5 retries. Every response includes a retry_info object with the retry count and a throttled boolean. A consumer seeing retries: 3, throttled: true knows the data is fresh but the API is under pressure.

What it costs: Worst case, a single tool call takes 30+ seconds instead of failing immediately. Retry count in the response adds a small object to every payload. The alternative — silent failures that look like empty data — is worse.

Development

npm install
npm test          # runs Vitest with fixture data, no credentials needed
npm run build     # compiles TypeScript
npm run dev       # runs with tsx for development

Tests use recorded and scrubbed Twilio API responses. No credentials are needed to run CI.

License

MIT

Available Tools

6 tools
call_summaryA

Aggregate call data by day, agent, or queue over a date range. Returns counts, talk time, and abandonment rate. Duration fields always carry their source label — CDR and TaskRouter numbers are never mixed.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYesEnd of range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone.
group_byNoAggregate by day, agent, or queue.day
timezoneNoIANA timezone. Defaults to UTC.
start_dateYesStart of range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the safety and behavior burden. It discloses a key data integrity guarantee (duration fields carry source labels, CDR and TaskRouter numbers are never mixed) and states return metrics. However, it does not explicitly confirm read-only behavior or potential limitations such as data range sizes, though 'aggregate' and 'returns' strongly imply a non-mutating operation.

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

Conciseness5/5

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

The description is two succinct sentences with critical information front-loaded: the aggregation verb, dimensions, date range, and return metrics, followed by an important caveat. Every clause adds value with no redundancy.

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

Completeness4/5

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

The description covers purpose, acceptable group_by values, date range, high-level return metrics, and a data-source caveat. Given the schema fully documents parameters and no output schema exists, the description provides sufficient high-level context, though it could specify return structure or timezone handling more explicitly.

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

Parameters3/5

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

Schema description coverage is 100%, so the description adds limited new parameter information. It does reinforce the meaning of group_by by naming day, agent, or queue, and references date range which maps to start_date/end_date, but the schema already explains these. No additional syntax or format details beyond schema are provided.

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

Purpose5/5

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

The description clearly identifies the tool as aggregating call data by day, agent, or queue over a date range, with specific output metrics (counts, talk time, abandonment rate). This verb+resource+scope is distinct from sibling tools like search_calls and get_call, which focus on individual call retrieval.

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

Usage Guidelines4/5

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

The description conveys a clear use case: when aggregate or summary metrics are needed rather than individual call details. It does not explicitly mention alternatives or exclusions, but the emphasis on aggregation and group-by options implies when this tool is appropriate, making the context clear but not exhaustive.

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

get_agent_activityA

Get activity history and reservation history for a single TaskRouter worker over a time window. Includes summary statistics with explicitly labeled duration sources.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYesEnd of window (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone.
timezoneNoIANA timezone. Defaults to UTC.
start_dateYesStart of window (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone.
worker_sidYesThe TaskRouter Worker SID (starts with 'WK').

TDQS

A3.8/5.0
Behavior3/5

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 accurately conveys a read-only retrieval operation and adds a useful detail about explicitly labeled duration sources. However, it does not disclose permissions, data freshness, or any limitations such as pagination or timezone handling beyond the schema. This is adequate but not extra transparent.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose and followed by a single clarifying detail. Every word contributes meaning, with no redundancy or unrelated information. This is a model of concise, well-structured documentation.

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

Completeness4/5

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

Given the absence of an output schema and annotations, the description provides a solid overview: what data is returned (activity/reservation history, summary statistics), for whom (single worker), and over what period (time window). The schema fully covers parameters, so the description only needs to fill in the outcome, which it does. It omits specifics about the summary statistics' composition, but overall it is sufficiently complete for an agent to select and invoke the tool.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter is already fully documented in the schema. The description only references 'time window' and 'single TaskRouter worker', which map directly to existing parameter descriptions without adding new semantic depth. Thus it matches the baseline of 3 for high coverage.

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

Purpose5/5

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

The description clearly identifies the verb ('Get'), the specific resource ('activity history and reservation history for a single TaskRouter worker'), and the scope ('over a time window'). This distinguishes it from call-centric sibling tools like search_calls or get_call, which focus on call records rather than worker activity.

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

Usage Guidelines3/5

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

The phrase 'for a single TaskRouter worker' implies when this tool is appropriate (per-worker queries) but the description does not explicitly mention alternatives or exclusions. There is no direct comparison to sibling tools or guidance on when not to use this tool, so usage guidance is only implied.

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

get_callA

Get full detail for a single call by SID, including child legs. Both CDR duration (ring to hangup) and TaskRouter talk time (agent audio open) are returned with explicit source labels.

ParametersJSON Schema
NameRequiredDescriptionDefault
call_sidYesThe Twilio Call SID (starts with 'CA').
timezoneNoIANA timezone (e.g., 'America/Chicago'). Defaults to UTC.

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description must carry the burden of behavioral disclosure. It does disclose that child legs are included and that both CDR duration and TaskRouter talk time are returned with source labels. However, it doesn't mention error handling, required permissions, or that this is a read-only operation, leaving some gaps.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and includes necessary detail about child legs and duration types. Every sentence earns its place with no redundancy.

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

Completeness3/5

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

Given the absence of an output schema and annotations, the description provides useful information about return contents (child legs, two duration types) but does not describe overall response structure, error cases, or other fields like call status or cost. It is sufficient for a basic understanding but not fully comprehensive.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds the context of 'single call by SID' and explains what is returned, but it doesn't add extra meaning to the timezone parameter beyond what the schema already says. No significant parameter elaboration.

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

Purpose5/5

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

The description clearly states the action ('Get full detail'), resource ('single call'), and selection criteria ('by SID'). It also mentions specific output scope ('including child legs'), which distinguishes it from siblings like search_calls (searching multiple calls) and call_summary (summary view).

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

Usage Guidelines4/5

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

The description implies usage when a specific Call SID is known and full detail is needed, giving clear context. However, it does not explicitly state when not to use this tool vs alternatives like search_calls or call_summary, so it falls short of full exclusion guidance.

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

get_recordingA

Get recording metadata for a call: signed URL with expiry, duration, and transcript if available. Never returns audio bytes.

ParametersJSON Schema
NameRequiredDescriptionDefault
call_sidYesThe Twilio Call SID to get recordings for.
timezoneNoIANA timezone. Defaults to UTC.

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It clearly discloses what is returned (signed URL, expiry, duration, transcript) and what is not (audio bytes). This is significant behavioral context. It doesn't cover errors or permissions, but for a read-only metadata retrieval, this is a reasonable level of disclosure.

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

Conciseness5/5

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

Two concise sentences that front-load the primary action and then provide key details. No redundant or filler text. Every word adds value.

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

Completeness4/5

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

Given there is no output schema, the description fills that gap by naming the returned fields (signed URL, expiry, duration, transcript) and the explicit exclusion. It is complete for a simple metadata tool, though it doesn't discuss potential error conditions or how timezone affects the response.

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

Parameters3/5

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

Schema coverage is 100% and both parameters (call_sid, timezone) have descriptive schema text. The tool description adds context about return values but does not meaningfully enhance the meaning of the parameters beyond what the schema already provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Get') and clearly defines the resource ('recording metadata for a call'). It further specifies the exact return contents (signed URL with expiry, duration, transcript) and explicitly excludes audio bytes, making it distinct from sibling tools like get_call or search_calls.

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

Usage Guidelines3/5

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

Usage context is implied: it's for a specific call and provides metadata only. The phrase 'Never returns audio bytes' hints at when not to use it, but no explicit alternatives are mentioned (e.g., 'for call details, use get_call'). This is adequate but lacks direct guidance.

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

list_agentsC

List the TaskRouter worker roster with each agent's current activity status.

ParametersJSON Schema
NameRequiredDescriptionDefault
timezoneNoIANA timezone. Defaults to UTC.

TDQS

C2.9/5.0
Behavior2/5

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

The description does not disclose any behavioral traits beyond the action of listing. There are no annotations to indicate read-only or destructive behavior, and the description does not mention authentication, rate limits, or what happens when the roster is empty. The word 'List' implies a read-only operation, but this is implicit rather than explicit.

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

Conciseness4/5

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

The description is a single sentence that is direct and free of unnecessary words. It covers the primary purpose but is too brief to provide usage context, which slightly reduces its effectiveness compared to a more complete but still concise description.

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

Completeness3/5

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

For a simple list tool with one optional parameter and no output schema, the description gives the essential action but omits guidance on alternative tools and the role of the timezone parameter. It is adequate but has clear gaps in contextual framing.

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

Parameters3/5

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

The input schema has one optional parameter ('timezone') fully documented in the schema. The description adds no additional meaning about how timezone affects the output, so it relies on the schema's 100% coverage. Baseline of 3 is appropriate.

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

Purpose4/5

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

The description clearly specifies the action ('List') and resource ('TaskRouter worker roster') and adds the purpose of capturing each agent's current activity status. However, it does not explicitly differentiate itself from sibling tool 'get_agent_activity', which may offer a related but distinct functionality.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like 'get_agent_activity' or 'search_calls'. The description only states what it does, not the contexts where it is preferred or where other tools should be used.

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

search_callsA

Search and filter Twilio call records by date range, phone number, direction, status, minimum duration, or agent. Returns rows plus a pagination cursor. Duration fields are labeled with their source and measurement definition — CDR duration (ring to hangup) and TaskRouter talk time (agent audio open) are never conflated.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNoFilter by agent name or worker SID.
cursorNoPagination cursor from a previous search_calls response.
statusNoFilter by call status.
end_dateNoEnd of date range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone.
timezoneNoIANA timezone (e.g., 'America/New_York'). Defaults to UTC.
directionNoFilter by call direction.
page_sizeNoNumber of results per page (1-100, default 50).
start_dateNoStart of date range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone.
min_durationNoMinimum call duration in seconds (CDR ring-to-hangup).
phone_numberNoFilter by phone number (E.164). Matches either from or to.

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the return structure (rows plus pagination cursor) and clarifies the meaning of duration fields, explaining that CDR duration and TaskRouter talk time are never conflated. This goes beyond a simple search description and adds valuable behavioral context, though it omits details like authentication or rate limits.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the action and scope, and every sentence contributes meaningful detail. It is concise with no filler words, and the structure effectively communicates purpose, return shape, and key nuances.

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

Completeness4/5

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

Given the tool has 10 parameters, no output schema, and no annotations, the description does a good job covering the essential usage context: what it filters on, that it returns rows and a pagination cursor, and that duration semantics are explicit. It could have described return fields in more detail, but the provided info is sufficient for an agent to select and invoke the tool reasonably.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds a small amount of extra meaning by clarifying duration measurement semantics relevant to min_duration, but the schema already documents each parameter well. The added value is marginal but not absent.

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

Purpose4/5

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

The description clearly states the tool searches and filters Twilio call records, listing the specific filter dimensions (date range, phone number, direction, etc.). It provides a specific verb and resource, but does not explicitly name sibling tools for differentiation, so it falls just short of a 5.

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

Usage Guidelines3/5

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

The description implies when to use the tool (searching and filtering call records) and what it returns (rows plus pagination cursor), but it does not explicitly state when not to use it or mention alternatives like get_call for a single call. This provides some context but no exclusions or alternative references.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv1.0.0
    • First observedcall_summary
    • First observedget_agent_activity
    • First observedget_call
    • First observedget_recording
    • First observedlist_agents
    • First observedsearch_calls

TDQS

A3.8/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct resource and action: searching calls, getting call detail, retrieving recording metadata, listing agents, getting agent activity, and aggregating summaries. There is no overlap between tools; even the two agent-related tools are clearly separated by current status versus historical activity.

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern (search_calls, get_call, get_recording, list_agents, get_agent_activity). The one outlier is call_summary, which drops the verb and uses a noun phrase instead of something like summarize_calls. This is a minor deviation that does not impede readability.

Tool Count5/5

Six tools is within the ideal 3-15 range and each tool serves a clear purpose in the call data exploration and analytics domain. The count feels well-scoped without being bloated or too thin.

Completeness5/5

The tool set covers the full read-only lifecycle for Twilio call data: search, retrieve details, retrieve recordings, list agents, retrieve agent activity, and generate summaries. There are no obvious gaps for the stated purpose of analyzing call data; the domain is fully represented.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    This read-only MCP Server allows you to connect to Twilio data from Claude Desktop through CData JDBC Drivers. Free (beta) read/write servers available at https://www.cdata.com/solutions/mcp
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Remote MCP server that exposes Airspeed/Glyphic call data to Claude web, enabling tools to list, retrieve, and query calls, transcripts, snippets, and playbooks.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Local Node/TypeScript MCP server for read-only Chatwoot analytics, providing tools to list accounts, scopes, cache sync status, and conversation volume metrics.
    268 npm
    MIT