Model Context Protocol server for Asterisk and FreeSWITCH. Lets AI assistants inspect channels, SIP registrations, trunk status and dialplan on a live PBX.
This is a well-structured MCP server with 14 domain-specific tools for PBX introspection and control. Strengths: all tools have clear, action-oriented names (asterisk_*, freeswitch_*); descriptions are detailed and explain when to use each tool; input schemas are present with typed parameters and descriptions; risk classification is explicit (READ_ONLY vs WRITE vs DESTRUCTIVE). Weaknesses: output schemas are not documented in the source code provided (only input schemas are visible); some descriptions could be more concise (several exceed 200 chars); no explicit error recovery guidance documented in descriptions; the confirmation/dry-run pattern is absent for destructive operations (originate, hangup), which is a gap given the high-consequence nature of these tools. The per-tool quality is consistent (most tools 70-78 range), but the lack of documented output schemas and confirmation patterns for destructive operations prevent a higher score.
Every channel currently up on the PBX, with caller ID, state, bridge, duration and the dialplan location it is sitting in. This is the tool for 'what calls are live right now'.
Run a command through the Asterisk CLI and return its raw output. In the default read-only mode only inspection commands such as 'core show', 'pjsip show' and 'queue show' are permitted. Set PBX_MCP_ALLOW_WRITE=true to lift that restriction.
Dump the dialplan for a context, or for one extension within a context. Useful for tracing where a call would go before placing it.
PJSIP endpoints with their device state and how many contacts are registered. Use this to answer 'is extension 1001 registered' or 'which phones are offline'. Falls back to chan_sip peers on older installations.
Show which live channels a hangup would affect, without touching them. Takes the same channel argument as asterisk_hangup and reports the exact match plus any near misses, so you can see the blast radius before dropping a call. Always available, including in read-only mode.
Output schemas not documented. While input schemas are well-defined with types and descriptions, return types and response structures are not explicitly documented in the provided source. LLMs need to know what fields to expect in responses to plan chaining and extract relevant data.
Destructive operations (freeswitch_originate, freeswitch_hangup) lack confirmation/dry-run pattern. These tools place real calls (costing money) and terminate calls, high-consequence actions that should include a preview step or explicit confirmation requirement before executing. The hangup_preview tools exist for preview, but there is no mandatory confirmation gate or transaction rollback capability.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | 2026-07-28+ | v2 |
Core status of the Asterisk server: version, uptime, active calls and calls processed. Use this first to confirm the PBX is reachable before running other Asterisk tools.
Run a command through the FreeSWITCH event socket and return its raw output. In the default read-only mode only inspection commands such as 'status', 'show' and 'sofia status' are permitted. Set PBX_MCP_ALLOW_WRITE=true to lift that restriction.
Every call leg currently up on the switch, as returned by 'show channels'. This is the tool for 'what calls are live right now' on FreeSWITCH.
Terminate an active call leg by its UUID. Get exact UUIDs from freeswitch_channels first. Only available when PBX_MCP_ALLOW_WRITE=true.
Show which live call legs a hangup would affect, without touching them. Takes the same UUID argument as freeswitch_hangup and reports the matching channel plus the leg it is bridged to, so you can see the blast radius first. Always available, including in read-only mode.
Originate a call from a dial string to an extension. This places a real call and costs real money on a live trunk. Only available when PBX_MCP_ALLOW_WRITE=true.
Registered SIP users on a Sofia profile, with contact URI, user agent and expiry. Use this to answer 'is this extension registered' or 'which devices dropped off'.
State of every Sofia SIP profile and gateway, including whether trunks are registered upstream. This is where to look when outbound calls fail but the switch itself is healthy.
Core status of the FreeSWITCH server: version, uptime, current and maximum sessions. Use this first to confirm the switch is reachable before running other FreeSWITCH tools.
No explicit error recovery guidance in tool descriptions. Descriptions state what the tool does but do not explain what to do if it fails (e.g., 'If the PBX is unreachable, check connectivity; try asterisk_status first'). Agents need recovery paths in error scenarios.
Some descriptions exceed recommended length (>200 chars). While detail is valuable, overly long descriptions waste tokens and bury key decision-making details. Examples: asterisk_dialplan (268 chars), asterisk_cli (302 chars), freeswitch_api (283 chars). Should be condensed to 150-180 chars with recovery guidance in a separate field if needed.