twilio-call-data-mcp
Provides read-only access to Twilio call data, enabling call search, recording metadata retrieval, agent activity monitoring, and call summaries with explicit handling for data inconsistencies.
Click on "Deploy 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., "@twilio-call-data-mcpSummarize call volume by agent for yesterday"
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.
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-mcpOr clone and build:
git clone https://github.com/burkecampbell/twilio-call-data-mcp.git
cd twilio-call-data-mcp
npm install
npm run buildCredentials
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 toolsCopy .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 |
| string | No | Start of range (YYYY-MM-DD or ISO 8601), interpreted in |
| string | No | End of range |
| string | No | E.164 format, matches from or to |
| enum | No |
|
| enum | No |
|
| integer | No | Minimum CDR duration in seconds |
| string | No | Agent name or worker SID |
| integer | No | 1-100, default 50 |
| string | No | From a previous response |
| string | No | IANA timezone, default UTC |
get_call
Full detail for one call SID, including child legs.
Parameter | Type | Required | Description |
| string | Yes | Starts with "CA" |
| 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 |
| string | Yes | Starts with "CA" |
| string | No | IANA timezone, default UTC |
list_agents
TaskRouter worker roster with current activity status.
Parameter | Type | Required | Description |
| 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 |
| string | Yes | Starts with "WK" |
| string | Yes | Window start |
| string | Yes | Window end |
| 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 |
| string | Yes | Range start |
| string | Yes | Range end |
| enum | No |
|
| 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 developmentTests use recorded and scrubbed Twilio API responses. No credentials are needed to run CI.
License
MIT
Available Tools
6 toolscall_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.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | End of range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone. | |
| group_by | No | Aggregate by day, agent, or queue. | day |
| timezone | No | IANA timezone. Defaults to UTC. | |
| start_date | Yes | Start of range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | End of window (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone. | |
| timezone | No | IANA timezone. Defaults to UTC. | |
| start_date | Yes | Start of window (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone. | |
| worker_sid | Yes | The TaskRouter Worker SID (starts with 'WK'). |
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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| call_sid | Yes | The Twilio Call SID (starts with 'CA'). | |
| timezone | No | IANA timezone (e.g., 'America/Chicago'). Defaults to UTC. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| call_sid | Yes | The Twilio Call SID to get recordings for. | |
| timezone | No | IANA timezone. Defaults to UTC. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| timezone | No | IANA timezone. Defaults to UTC. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Filter by agent name or worker SID. | |
| cursor | No | Pagination cursor from a previous search_calls response. | |
| status | No | Filter by call status. | |
| end_date | No | End of date range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone. | |
| timezone | No | IANA timezone (e.g., 'America/New_York'). Defaults to UTC. | |
| direction | No | Filter by call direction. | |
| page_size | No | Number of results per page (1-100, default 50). | |
| start_date | No | Start of date range (YYYY-MM-DD or ISO 8601). Interpreted in the given timezone. | |
| min_duration | No | Minimum call duration in seconds (CDR ring-to-hangup). | |
| phone_number | No | Filter by phone number (E.164). Matches either from or to. |
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 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.
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.
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.
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.
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.
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.
6 tool updates
v1.0.0- First observed
call_summary - First observed
get_agent_activity - First observed
get_call - First observed
get_recording - First observed
list_agents - First observed
search_calls
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
- mcpOAuthcom.airtable
Official Airtable MCP server — database and operations layer for agents.
Official MCP server for OmniDimension. Drive voice agents, dispatch calls, and run bulk campaigns.
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis 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/mcp1MIT
- 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
- FlicenseNot gradedqualityDmaintenanceRemote MCP server that exposes Airspeed/Glyphic call data to Claude web, enabling tools to list, retrieve, and query calls, transcripts, snippets, and playbooks.-
- AlicenseNot gradedqualityCmaintenanceLocal Node/TypeScript MCP server for read-only Chatwoot analytics, providing tools to list accounts, scopes, cache sync status, and conversation volume metrics.268 npmMIT