Twilio SMS + Voice backend binding plugin for mcpg. One cdylib carrying THREE entities: a `backend` binding whose operations proxy the Twilio REST API (send/list/get SMS, make/list/get/modify calls, recordings, TwiML authoring, call-response staging), an `http_route` entity that receives Twilio's inbound SMS/voice/status/gather webhooks with HMAC-SHA1 signature validation, and a `watch_strategy` entity for native push notifications. REST auth is HTTP Basic with an API Key or Account Auth Token; webhook signature is keyed by Account Auth Token. Pure-Rust transport (reqwest + rustls).
Strong foundation with 16 well-named tools, comprehensive schemas, and detailed parameter descriptions. All tools follow verb_noun naming (send_sms, list_messages, make_call). Input schemas are complete with type definitions and descriptions for all parameters. However, output schemas are not documented, LLMs cannot predict response structure. Error handling is present but lacks recovery guidance. Some parameter descriptions exceed 200 chars (verbose). Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint) for risk classification.
Build TwiML (Twilio Markup Language) from structured verb objects. Accepts `twiml_verbs` array of verb definitions. Returns rendered TwiML XML string. This is a purely local operation (no REST call).
Configure inbound SMS/voice webhooks for a Twilio phone number. Mutates Twilio account state — opt-in, capability-gated. Requires `phone_number` (E.164 format). Accepts `sms_url`, `voice_url`, `sms_method`, `voice_method`, `fallback_url`, `fallback_method`, `status_callback`, `status_callback_method`.
Delete an SMS message. Requires `sid` argument.
Retrieve a single voice call by SID. Requires `sid` argument.
Retrieve a single SMS message by SID. Requires `sid` argument (two uppercase letters followed by 32 hex digits).
Output schemas not documented. LLMs cannot predict response structure for list_messages, list_calls, get_message, get_call, get_recording, lookup, verify_check, build_twiml. Responses must include pagination cursors, field types, and chaining IDs (e.g., call_sid for downstream modify_call).
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint declared. Agents cannot distinguish safe (list_messages, get_call) from destructive (delete_message, configure_number_webhooks) operations without reading descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Retrieve a call recording by SID. Requires `sid` argument.
List voice calls from the Twilio account. Optionally filter by `to`, `from`, or `status`. Returns paginated results with `calls` array and `next_page_uri` cursor.
List SMS messages from the Twilio account. Optionally filter by `to`, `from`, or `date_sent`. Returns paginated results with `messages` array and `next_page_uri` cursor.
Phone number validation, carrier info, and caller name lookup via Twilio Lookups v2 API. Requires `phone_number` argument (E.164 format). Optionally accepts `type` array to request specific lookup types (e.g. 'carrier', 'caller_name').
Initiate an outbound voice call. Requires `to` and `from` (or config default). Call flow is determined by exactly one of: `twiml_verbs` (built locally), `twiml` (raw TwiML string), or `url` (TwiML URL). Optionally accepts `status_callback`, `status_callback_event` array, `timeout`, `record`, `recording_channels`, `recording_status_callback`, `machine_detection`, `async_amd`, `async_amd_status_callback`, `trim`, `caller_id`.
Modify an in-progress call. Requires `sid`. Accepts `status` (to end the call), `url` (to redirect to new TwiML), `twiml` (raw TwiML), or `twiml_verbs` (built locally). Optionally accepts `status_callback`, `status_callback_event` array.
Redact an SMS message by clearing its body. Requires `sid` argument.
Send an SMS message via Twilio. Requires `to` and `body` arguments. Optionally accepts `from` (or uses config default), `messaging_service_sid`, `status_callback` (must be https), and `media_url` array (each must be https).
Stage a TwiML response for an inbound voice call. Stores the response locally (in-process state) keyed by either `call_sid` or `to` (phone number). The inbound webhook later retrieves and serves this staged response. Requires non-empty `twiml_verbs` array. Optionally accepts `ttl_secs` (default 900 seconds). This is a purely local operation (no REST call).
Check an OTP verification code via Twilio Verify v2 API. Requires `to` (phone number or email) and `code` (the OTP to verify). Optionally accepts `verify_service_sid` override.
Start an OTP (One-Time Password) verification via Twilio Verify v2 API. Requires `to` (phone number or email) and `verify_service_sid` (from config or override). Optionally accepts `channel` (sms/call/email), `locale`, `custom_message`, `custom_code`.
Error handling lacks recovery guidance. Tools return logical errors (e.g., 'Invalid SID format') but do not suggest next steps. E.g., 'Invalid SID format (expected XX + 32 hex digits). Retrieve SID via list_messages() or get_call().'
Parameter descriptions verbose and example-heavy. make_call description exceeds 400 chars; includes example values ('sms/call/email') that LLMs may reuse literally. Use enum constraints instead.
Mutually exclusive parameters not documented. make_call requires exactly one of twiml_verbs, twiml, or url; modify_call has same constraint. Agents may pass multiple, causing ambiguous failures.