AI Voice Call Server with MCP tools for outbound/incoming call management, IVR navigation, call transcripts, and context templates via ElevenLabs and Twilio integration
Phony has well-structured tool definitions with explicit schemas and detailed descriptions, but exhibits inconsistent quality across tools. Strengths: 21 tools with complete input schemas visible in source code (calls.tools.ts, contexts.tools.ts, etc.); strong domain naming (verb-noun convention: create_call, list_calls, update_context); rich parameter descriptions that include examples and constraints (e.g., phony_create_call documents dtmfPreflight format and length constraints; phony_create_incoming_config recommends specific ElevenLabs voice IDs with acoustic profiles). Weaknesses: (1) Output schemas completely undocumented, no tool returns a description of its response structure, forcing LLMs to infer field names and types; (2) Descriptions vary widely in quality: phony_list_calls ('List call history with optional filtering') is vague and under 50 chars, while phony_create_call exceeds 1000 chars and includes operational guidance (character encoding cap at 4000 on URL-encoded params, pronunciation warnings for numeric strings); (3) Missing error handling guidance: tools like phony_create_call that interact with Twilio and ElevenLabs do not document failure modes, retryability, or recovery steps; (4) Parameter descriptions occasionally buried in examples rather than clearly stated (e.g., dtmfScript description assumes reader understands DTMF timing semantics without explaining what 'at' means when the call is in an IVR state); (5) No tool composition or chaining guidance, agents cannot infer that phony_get_call_events should be called after phony_create_call fails; (6) Sensitive configuration (ElevenLabs agent IDs, API keys for Twilio) properly hidden from params (good), but voice ID selection is verbose (150+ chars of recommendations) at the cost of clarity.
Create an outbound phone call with an ElevenLabs AI voice assistant. Two modes: "advanced" (default) — Phony hosts a WebSocket bridge with mid-call control (DTMF for IVR navigation, mid-call context injection); works on the typical business number that has an IVR. "native" — ElevenLabs hosts the call end-to-end via /v1/convai/twilio/outbound-call (lowest latency, simplest), opt-in via mode:"native"; lacks DTMF preflight, so any IVR will likely strand the call. Use native only when you know the line is human-answered.
Create a new reusable context template
Configure a phone number to handle incoming calls. Supports three modes: AI conversation (default), message-only (play message and hang up), or voicemail (record and transcribe messages).
Delete a context template
Remove incoming call configuration from a phone number
No output schemas documented for any tool. LLMs must infer response structure without guidance, leading to hallucinated field names and type mismatches. Critical for tools like phony_list_calls, phony_get_call_events, phony_get_system_status.
Descriptions lack consistency and actionable guidance. phony_list_calls (49 chars), phony_list_contexts (58 chars), phony_delete_context (50 chars), phony_get_system_status (50 chars) are under 50 chars and provide minimal context on when to call them vs. similar tools or what they return. Baseline for A+ tools is 50-200 chars with clear WHAT/WHEN/WHY framing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 58 | - | v1 |
Get detailed Twilio event logs from a call for debugging
Get the system and call instructions that were used for a specific call
Get a specific context template by ID
Get system health and statistics
Delete the registered preflight for a phone number. phony_create_call will no longer auto-apply it.
Soft-disable a registered preflight (entry kept, but no longer auto-applied). Use phony_ivr_preflight_set to re-enable.
Get the registered dtmfPreflight for a specific phone number (if any).
List all registered IVR preflights (enabled + disabled).
Register (or update) the dtmfPreflight Twilio sendDigits string for a target phone number. phony_create_call will auto-apply this preflight when called against that number without an explicit dtmfPreflight. Use for barge-in-disabled IVRs that need precisely-timed carrier-level DTMF (e.g. Petco 603-555-0108: pause through Menu 1, spam 0 across Menu 2 operator window).
List all Twilio phone numbers and their configuration status
List call history with optional filtering
List saved context templates for reusable call configurations
List all configured incoming call handlers
Look up line type (mobile/landline/voip/tollFree/...) and carrier for one or more phone numbers via Twilio Lookup v2. USE THIS BEFORE ANY BULK SMS: landlines silently bounce (30005/30006) and repeated undeliverable sends hurt carrier reputation. Returns per-number {lineType, carrier, smsViable} plus a smsViable/notViable split for batches. smsViable = mobile or VoIP (VoIP usually but not always receives SMS). Cost ~$0.008 per number.
Update an existing context template
Update an existing incoming call configuration
No error handling or recovery guidance documented. Tools like phony_create_call (interacts with Twilio + ElevenLabs), phony_create_incoming_config, and phony_lookup_number do not document failure modes (e.g., what if Twilio API times out, or ElevenLabs agent not found?), whether errors are retryable, or what the LLM should do next. Agents cannot self-recover without explicit error categories.
Destructive operations (delete_context, delete_incoming_config, ivr_preflight_delete) lack confirmation or cascade documentation. No guidance on consequences: what happens to active calls or data if a context or config is deleted? LLM cannot infer whether to retry on failure or suggest user confirmation.
Parameter interdependencies undocumented. phony_create_call accepts both dtmfPreflight and mode, but the tool description hints that dtmfPreflight is only used in 'advanced' mode (native mode ignores it). Similarly, phony_create_incoming_config accepts systemInstructions, callInstructions, and messageOnly/voicemailEnabled together, but the description does not clearly state which param combinations are valid (e.g., can you set voicemailEnabled=true AND systemInstructions?). LLMs will pass invalid combinations.
Tool composition and chaining unclear. phony_create_call can fail due to IVR navigation issues, but there is no documented relationship to phony_ivr_preflight_set or guidance on when to call phony_get_call_events after a failed call. Agents cannot plan multi-step recovery sequences.
Pagination and limits not documented. phony_list_calls, phony_list_contexts, phony_list_available_numbers, phony_list_incoming_configs, phony_ivr_preflight_list do not document whether results are paginated, if there are limits, or what happens with very large result sets. Schema shows empty parameters {}, suggesting no pagination support, but this should be explicit.
Verbose parameter descriptions at the cost of clarity. phony_create_call includes 150+ characters of ElevenLabs voice ID recommendations (listing specific IDs with acoustic profiles like 'Sarah (EXAVITQu4vr4xnSDxMaL, professional)'). While helpful, this bloats the description and crowds out guidance on when to use each field. Consider moving voice recommendations to a linked resource or tool documentation, not inline parameter descriptions.