pbx-mcp
The server allows AI assistants to inspect and optionally control Asterisk and FreeSWITCH PBXs through a unified interface. It provides:
Asterisk monitoring: view server status (version, uptime, calls), list active channels (with filtering), check PJSIP endpoint registration (fallback to chan_sip), inspect dialplan, and execute read-only CLI commands.
FreeSWITCH monitoring: view server status (version, uptime, sessions), list active channels, check SIP registrations on Sofia profiles, inspect Sofia profile and gateway status, and execute read-only API commands.
Call control: originate calls and hangup channels become available when write mode is enabled (PBX_MCP_ALLOW_WRITE=true).
Safety: operates read-only by default; write tools are hidden unless allowed. Additional safeguards include command allow-listing, word-level scanning for destructive FreeSWITCH commands, shell metacharacter rejection, AMI header injection blocking, and output clamping.
Configuration: set environment variables for Asterisk AMI and/or FreeSWITCH ESL credentials; only tools for configured systems are registered. Supports connecting to both PBX types simultaneously. Runs via stdio with npm/npx or Docker.
Provides tools for inspecting and controlling an Asterisk PBX, including status, channels, endpoints, dialplan, CLI commands, and call control (originate/hangup).
Click on "Install 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., "@pbx-mcpwhich extensions are offline right now?"
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.
pbx-mcp
An MCP server that lets an AI assistant inspect and control Asterisk and FreeSWITCH.
Ask "which extensions are offline right now?" or "why is my SIP trunk not registering?" and get a real answer from the live switch, not a guess.
Developed by Tahir Almas at ICT Innovations, the team behind ICTCore, ICTContact, ICTDialer, ICTFax and ICTPBX. The AMI and ESL clients in this repo are the same protocol groundwork those products run on.
Why
Debugging a PBX means memorising two very different command sets. Asterisk speaks AMI and a CLI with hundreds of verbs. FreeSWITCH speaks ESL with its own vocabulary. If you run both, you're context switching all day.
pbx-mcp puts a single, well described tool surface in front of both, so your assistant can go from "calls are failing" to sofia status gateway without you spelling out each step.
New here? The user guide walks through PBX setup, client config, worked examples and troubleshooting. This README is the quick reference.
Related MCP server: VoIPbin MCP Server
What your assistant sees
Twelve read-only tools, six per engine, each one described well enough that the model picks the right one without being told. This is the server running under the MCP Inspector:

The four write tools, asterisk_originate, asterisk_hangup, freeswitch_originate and freeswitch_hangup, stay hidden until you set PBX_MCP_ALLOW_WRITE=true.
Install
npm install -g pbx-mcpOr run it straight from npx, which is what most MCP client configs do:
npx -y pbx-mcpYou need Node 18 or newer.
Docker
There's a prebuilt image if you'd rather not put Node on the machine that talks to your PBX.
docker run -i --rm \
-e ASTERISK_AMI_HOST=10.0.0.10 \
-e ASTERISK_AMI_USERNAME=mcp \
-e ASTERISK_AMI_PASSWORD=change-me \
ghcr.io/ictinnovations/pbx-mcpThe same image is on Docker Hub as ictinnovations/pbx-mcp if that registry is an easier pull for you.
Three things to know:
-iis not optional. The server speaks MCP over stdio, so without stdin attached the container starts and then sits there saying nothing, which looks exactly like a broken server.There is no port to publish. Nothing listens.
Your PBX has to be reachable from inside the container. If Asterisk runs on the Docker host itself, swap the IP above for
host.docker.internalon Mac and Windows, or add--network hoston Linux.
The image runs as a non-root user and, like every other way of running this, starts read only.
Configure
Everything comes from environment variables. Set the Asterisk block, the FreeSWITCH block, or both. The server only registers tools for what you've actually configured, so an Asterisk-only shop never sees a FreeSWITCH tool.
Asterisk
Variable | Default | Notes |
| (required to enable) | Hostname or IP of the Asterisk box |
|
| AMI port from |
| AMI user | |
| AMI secret | |
|
| Set |
Your manager.conf user needs at least read = system,call,command and write = command. Add originate only if you plan to turn on write mode.
[mcp]
secret = change-me
read = system,call,command
write = commandFreeSWITCH
Variable | Default | Notes |
| (required to enable) | Hostname or IP of the switch |
|
| Inbound ESL port |
|
| From |
Shared
Variable | Default | Notes |
|
| Unlocks call control. Read the safety section first |
|
| Per command timeout |
Claude Desktop
Add this to claude_desktop_config.json:
{
"mcpServers": {
"pbx": {
"command": "npx",
"args": ["-y", "pbx-mcp"],
"env": {
"ASTERISK_AMI_HOST": "10.0.0.10",
"ASTERISK_AMI_USERNAME": "mcp",
"ASTERISK_AMI_PASSWORD": "change-me",
"FREESWITCH_ESL_HOST": "10.0.0.11",
"FREESWITCH_ESL_PASSWORD": "ClueCon"
}
}
}
}The same shape works for any MCP client that speaks stdio. There's a copy in examples/claude_desktop_config.json.
To run the container instead of npx, keep the env block and point command at Docker:
{
"mcpServers": {
"pbx": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "ASTERISK_AMI_HOST",
"-e", "ASTERISK_AMI_USERNAME",
"-e", "ASTERISK_AMI_PASSWORD",
"ghcr.io/ictinnovations/pbx-mcp"
],
"env": {
"ASTERISK_AMI_HOST": "10.0.0.10",
"ASTERISK_AMI_USERNAME": "mcp",
"ASTERISK_AMI_PASSWORD": "change-me"
}
}
}
}Each -e NAME with no value forwards that variable from env into the container, which keeps the secrets out of the argument list.
Tools
Asterisk
Tool | What it does |
| Version, uptime, active calls and calls processed |
| Every live channel with caller ID, state, bridge, duration and dialplan position. Optional substring filter |
| PJSIP endpoints with device state and contact count. Falls back to |
| Dumps a context, or one extension inside a context |
| Any CLI command, subject to the safety policy below |
| Shows which live channels a hangup would drop, without dropping them |
| Places a call. Write mode only |
| Kills a channel by name. Write mode only |
FreeSWITCH
Tool | What it does |
| Version, uptime, current and maximum sessions |
| Every live call leg from |
| Registered users on a Sofia profile, with contact URI, user agent and expiry |
| Every SIP profile and gateway, including whether trunks are registered upstream |
| Any API command, subject to the safety policy below |
| Shows which live legs a hangup would drop, without dropping them |
| Places a call. Write mode only |
|
|
Safety
A PBX is not a scratch pad. Reloading a profile drops registrations, and an originate spends real money on a live trunk. So the default posture is read-only and the guards are layered:
Read-only by default. asterisk_cli accepts an allow list of inspection prefixes (core show, pjsip show, dialplan show, queue show and friends). freeswitch_api accepts the same kind of list (status, show, sofia status, db list and friends), matched on the start of the command so the subcommand counts.
The FreeSWITCH list allows subcommands, it does not deny scary words. sofia status reads, sofia profile internal restart isn't on the list, so it's refused. This used to work the other way around, scanning each word against a list of state changing verbs, and that only ever catches the words somebody thought of. conference 3001 kick all walked straight through it. Reported by Electrical-Place-458 on r/mcp.
Write tools aren't registered at all in read-only mode. asterisk_originate and the other three never appear in tools/list unless you set PBX_MCP_ALLOW_WRITE=true. A model can't call a tool it can't see.
The hangup preview tools are always available. asterisk_hangup_preview and freeswitch_hangup_preview show which live channels a hangup would drop without touching them, so you can see the blast radius before setting the write flag, or catch a typo in a channel name before running the real thing. They're read-only by contract but exercise the same matching the write path uses.
Shell metacharacters are rejected on both transports before a command is sent.
AMI header injection is blocked. Every field that lands in an AMI action is checked for carriage returns and newlines, so a caller ID string can't smuggle in an extra header.
Output is clamped to 20,000 characters. One show channels on a busy switch won't flood the context window.
Even with all that, give the AMI user the narrowest permission set that answers your questions, and put the PBX behind a firewall rather than on the public internet.
Build from source
git clone https://github.com/ictinnovations/pbx-mcp.git
cd pbx-mcp
npm install
npm run build
npm startThe AMI and ESL clients have no third party dependencies. Both protocols are just framed text over TCP, and hand rolling them keeps the install small and the behaviour predictable. The only runtime dependencies are the MCP SDK and Zod.
The protocol clients, on their own
If you want to talk to a PBX from your own Node code and don't need MCP at all, the two clients underneath this server are published separately. Same protocol work, no MCP SDK, no Zod, nothing:
asterisk-ami-node - Asterisk Manager Interface client.
npm install asterisk-ami-nodefreeswitch-esl-node - FreeSWITCH Event Socket client, inbound mode.
npm install freeswitch-esl-node
Both are zero dependency, TypeScript, ESM and CommonJS, Node 18 or newer, and tested against mock switches so you can run the suite without a PBX.
Layout
src/
index.ts entry point, config to transport wiring
ami.ts Asterisk Manager Interface client
esl.ts FreeSWITCH Event Socket Layer client
config.ts environment config and the command safety policy
tools/
asterisk.ts Asterisk tool definitions
freeswitch.ts FreeSWITCH tool definitions
format.ts text table and truncation helpersContributing
Issues and pull requests are welcome. If you're adding a tool, describe it the way you'd describe it to a colleague who has never seen your dialplan. The model picks tools from those descriptions, so a vague one is a broken one.
About
Built and maintained by Tahir Almas, founder of ICT Innovations.
ICT Innovations has shipped open source and commercial telephony since 2005. If pbx-mcp is useful to you, the wider stack behind it might be too:
ICTCore - open source telephony framework, the base for the products below
ICTPBX - white label multi tenant IP PBX, with a free community edition on GitHub
ICTContact - contact center and unified communications
ICTDialer - auto and predictive dialer
ICTFax - open source fax server
asterisk-ami-node and freeswitch-esl-node - the protocol clients from this repo, published on their own
Questions about the commercial products go through the ICT Innovations support portal. Questions about pbx-mcp itself belong in GitHub issues, where everyone can read the answer.
License
MIT. See LICENSE.
Available Tools
10 toolsasterisk_channelsList active Asterisk channelsARead-only
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Case-insensitive substring to match against any field, for example an extension or caller ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already provide readOnlyHint and openWorldHint. The description adds context about the returned fields (caller ID, state, bridge, duration, dialplan location) which exceeds the annotations. However, it does not disclose behavior like potential latency, pagination, or the effect of the filter, so it remains moderate.
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 only two sentences, front-loaded with the enumeration of returned fields and ending with a crisp use case. Every word adds value, with no redundancy or filler.
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 read-only listing tool with one optional filter, the description covers the key aspects: what data is returned, when to use it, and its live nature. It does not provide output structure details, but no output schema is present and the description sufficiently covers the tool's purpose.
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 schema description covers the sole parameter (filter) with a clear case-insensitive substring explanation and an example. The tool description adds no additional parameter guidance, but since schema coverage is 100%, the 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 states the tool lists active Asterisk channels with specific fields (caller ID, state, bridge, duration, dialplan location). It includes a memorable usage phrase, 'what calls are live right now', which distinctly positions it against sibling tools like asterisk_endpoints or asterisk_status.
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 indicates when to use this tool: to see live calls ('This is the tool for 'what calls are live right now''). It implies a scenario for selecting this over others but does not explicitly list alternatives or exclusions, such as when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asterisk_cliRun an Asterisk CLI commandARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | The CLI command, for example 'pjsip show endpoints' or 'queue show support'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, but the description states that setting PBX_MCP_ALLOW_WRITE=true lifts the read-only restriction, implying the tool can perform write operations. This directly contradicts the read-only annotation, so the contradiction rule applies.
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 and around 50 words, front-loading the tool's purpose and output format. Every sentence adds essential information: what it does, the default restriction, and how to change it.
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 single-parameter CLI runner with no output schema, the description covers purpose, output, command restrictions, and configuration. It could mention the risk of enabling write mode, but overall it is sufficiently complete for this simple 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?
The schema description for 'command' already includes concrete examples (pjsip show endpoints, queue show support) and covers 100% of parameters. The tool description adds valuable semantic constraints by specifying that only inspection commands are allowed by default, which helps the agent select valid commands.
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 ('Run') and resource ('Asterisk CLI'), and clearly states that it returns raw output. It distinguishes itself from sibling tools by being the generic CLI runner for Asterisk, as opposed to the more specific status/channel/endpoint wrappers.
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 provides clear context: it is for inspection commands in the default read-only mode and only lists permitted command categories like 'core show', 'pjsip show', and 'queue show'. It also explains how to lift the restriction via PBX_MCP_ALLOW_WRITE=true, though it does not explicitly mention when to prefer sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asterisk_dialplanShow dialplanARead-only
Dump the dialplan for a context, or for one extension within a context. Useful for tracing where a call would go before placing it.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | Dialplan context, for example 'from-internal' or 'default'. | |
| extension | No | Optional single extension to narrow the output. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature is covered. The description adds minimal behavioral context beyond the schema, such as the optional narrowing to a single extension and the tracing use case, but does not describe return format or potential size of output. This is adequate but not rich.
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 concise sentences. The first states the core function, the second adds a practical use case. No redundant or filler content.
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 simple tool (2 params, 1 required), full schema coverage, and annotations covering safety, the description provides enough context for an agent to select and invoke the tool correctly. It lacks explicit output format details, but for a 'dump' action this is not critical. The tool is well-covered overall.
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% with descriptions for both 'context' and 'extension'. The description paraphrases the schema ('for a context, or for one extension') but adds no new semantic details about parameter values or formats. Baseline 3 is appropriate since the schema already carries the parameter meaning.
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 ('dump') and clearly identifies the resource ('dialplan') and its scoping ('for a context, or for one extension within a context'). This clearly distinguishes it from sibling tools like asterisk_status or asterisk_channels, and adds a practical use case ('tracing where a call would go').
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 provides explicit context for when to use the tool ('Useful for tracing where a call would go before placing it'), which implies a diagnostic scenario. It does not explicitly name alternatives or exclusions, but the sibling tools are clearly about different resources, making the appropriate use case reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asterisk_endpointsList PJSIP endpoints and registration stateARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Case-insensitive substring to match against the endpoint name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, and the description adds meaningful context by explaining the returned data (device state, registration counts) and the fallback to chan_sip peers on older installations. It does not, however, describe the output format or potential quirks, so transparency is adequate but not exceptional.
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-loads the core purpose, and then adds use cases and a fallback note. Every piece of information is useful and there is 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?
For a simple list tool with one optional filter and no output schema, the description covers return content (device state, registered contacts) and a behavioral nuance (chan_sip fallback). It lacks explicit output fields or examples, but given the tool's simplicity, it is sufficiently complete.
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 schema has 100% coverage for the single 'filter' parameter, so the description does not need to add much. It doesn't provide extra meaning beyond the schema's description, but the high schema coverage makes the baseline of 3 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 states the tool lists PJSIP endpoints with device state and registered contact counts, and explicitly ties this to common queries ('is extension 1001 registered', 'which phones are offline'). It distinguishes itself from siblings like asterisk_channels and asterisk_status by focusing on endpoint registration rather than calls or system status.
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 provides explicit use cases for the tool, which gives the agent a clear context for when to invoke it. However, it does not explicitly mention when not to use it or name alternative sibling tools for other tasks, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
asterisk_statusAsterisk statusARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and openWorldHint=true. The description adds context by listing the specific status fields and the reachability use case, which goes beyond the annotations. It does not contradict the read-only nature, and no negative side effects are mentioned, which is consistent with a status read.
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 return content, and the second sentence provides actionable guidance. Every word earns its place; there is no redundancy or fluff.
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 status tool with no params, no output schema, and readOnly annotations, the description fully covers what the tool returns, how to use it, and its role among sibling tools. It is complete and self-sufficient.
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 tool has zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and the schema is fully covered. There is no missing parameter information.
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 specifies the resource ('Core status of the Asterisk server') and the exact fields returned ('version, uptime, active calls and calls processed'), making it clear this is a server-level status tool. It distinguishes itself from siblings like asterisk_channels and asterisk_endpoints by focusing on core server health rather than specific subsystems.
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 provides explicit usage guidance: 'Use this first to confirm the PBX is reachable before running other Asterisk tools.' This tells the agent when to use it, but it does not explicitly name alternatives or state when not to use it, though the implication is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeswitch_apiRun a FreeSWITCH API commandARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | The API command, for example 'show calls' or 'sofia status gateway mytrunk'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing the default read-only restriction, the PBX_MCP_ALLOW_WRITE environment variable to lift it, and the raw output behavior. This is meaningful additional context not present in the annotations.
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 concise sentences: the first states the action and output, the second explains the permission model. No wasteful words, and important details are front-loaded.
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?
Despite having no output schema, the description covers the purpose, the permission restriction, how to override it, and the return format. It is complete for a command runner with one parameter.
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 already fully describes the single parameter with examples, achieving 100% coverage. The description adds no extra parameter semantics, so the 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 states the verb and resource: 'Run a command through the FreeSWITCH event socket and return its raw output.' It also distinguishes from sibling tools by being the generic command runner, while siblings are specific read-only inspection commands.
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 provides clear context: it is a generic command tool with a default read-only mode, and lists example permitted commands. However, it does not explicitly mention alternatives or state when to prefer this over dedicated tools like freeswitch_status, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeswitch_channelsList active FreeSWITCH channelsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Case-insensitive substring to match against the row, for example a number or a UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds context by clarifying that this is a live snapshot of all call legs, sourced from 'show channels', which reinforces the read-only, real-time nature. However, it does not disclose nuances like potential overhead of listing all channels, ordering, or behavior when there are no channels. This is adequate but not rich beyond annotations.
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, both earning their place: the first defines the tool's output, the second gives its use case. It is front-loaded with the core function and uses precise, focused wording with no fluff or repetition. This is a model of conciseness.
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 read-only list tool with one optional parameter and no output schema, the description covers the essential context: what is returned (call legs), the source command ('show channels'), and when to use it (live calls). It does not detail the exact return format or pagination, but these are likely predictable from the underlying command. The description is sufficient for an agent to know what to expect and how to invoke it correctly.
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 schema has 100% parameter description coverage for the single optional 'filter' parameter, explaining it as a case-insensitive substring match. The description does not add any additional meaning about the parameter beyond the schema. Baseline of 3 is appropriate because the schema does the heavy lifting and the description's scope is on the tool's overall purpose rather than parameter syntax.
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's function: listing every call leg currently up on the FreeSWITCH switch, using the 'show channels' command. It explicitly frames this as the tool for 'what calls are live right now' on FreeSWITCH, distinguishing it from siblings like asterisk_channels. The verb 'list' is implicit in the title, and the resource and scope are unambiguous.
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 gives a clear usage context: 'This is the tool for what calls are live right now on FreeSWITCH.' It does not explicitly mention when to avoid this tool or name alternative tools, but the emphasis on FreeSWITCH and the live-call scenario implies a distinction from Asterisk-based siblings. This is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeswitch_registrationsList SIP registrationsARead-only
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Sofia profile name, usually 'internal' or 'external'. | internal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature and external changeability are known. The description adds behavioral context by enumerating the returned fields (contact URI, user agent, expiry) and the concept of Sofia profile, going beyond the annotations. No contradiction with annotations is present.
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, both essential: the first states what the tool does, the second provides practical use cases. It is front-loaded and contains no redundant wording. Every sentence earns its place.
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 tool is simple with one optional parameter, annotations cover the safety profile, and the description specifies output fields and typical use cases. Despite lacking an output schema, the description enumerates the relevant return data, making it contextually complete for its complexity.
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 schema has 100% coverage for the single 'profile' parameter, including a description of what it is and its default value. The description does not add any parameter-level meaning beyond what the schema already provides. Baseline of 3 applies because the schema fully documents the parameter.
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 lists registered SIP users on a Sofia profile with specific fields (contact URI, user agent, expiry). It distinguishes itself from sibling tools like freeswitch_channels and freeswitch_status by focusing specifically on registrations. The title 'List SIP registrations' is reinforced by the descriptive noun phrase.
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 explicitly gives concrete use cases: 'is this extension registered' or 'which devices dropped off'. This provides clear context for when to use the tool, though it doesn't mention alternative tools or exclusion scenarios. It lacks an explicit 'when not to use' clause.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeswitch_sofia_statusSofia SIP profile and gateway statusARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Optional profile name for a detailed view instead of the summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description aligns with these by describing a read-only status query. It adds value by disclosing that it also reports whether trunks are registered upstream, which is a specific behavioral detail beyond a generic status read.
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 sentences provide all essential information without redundancy. The main purpose is front-loaded, followed by a practical usage hint. No wasted words.
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 low complexity (one optional parameter, no output schema), the description covers the tool's purpose, the scope of its output (profiles and gateways with trunk registration), and the typical troubleshooting scenario. The schema documents the parameter, so nothing essential is missing.
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 only parameter, 'profile', is fully described in the schema ('Optional profile name for a detailed view instead of the summary.'). The description adds no further parameter-level nuance, so the schema carries the full burden, yielding the baseline score.
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's function: showing the state of every Sofia SIP profile and gateway, including trunk registration. It distinguishes from siblings by specifying the exact resource (Sofia profiles/gateways) and pairing this with a targeted use case (outbound call failures while the switch is healthy).
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 gives a clear contextual trigger: 'when outbound calls fail but the switch itself is healthy.' It does not explicitly name alternative tools or state when not to use, but the context strongly implies a diagnostic role separate from overall switch status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeswitch_statusFreeSWITCH statusARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description adds value by listing the specific status fields and noting the reachability check role. No behavioral surprises or omissions beyond what annotations cover.
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—one listing the returned fields, one providing usage guidance. No fluff or repetition.
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, no-parameter status tool, the description fully covers what it returns and when to use it. The absence of an output schema is compensated by listing the exact fields. Sibling context is well handled.
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 tool has zero parameters and the schema is empty with 100% coverage. With no params to describe, the description does not need to add parameter details; baseline for zero-param tools is 4.
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 provides 'Core status of the FreeSWITCH server' with specific fields (version, uptime, sessions), distinguishing it from sibling tools like freeswitch_channels or asterisk_status. The intent to check server reachability is explicit.
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?
Explicit guidance: 'Use this first to confirm the switch is reachable before running other FreeSWITCH tools.' This tells when to use and implies alternatives for more specific checks.
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. Dates show when Glama detected each change.
10 tool updates
v0.1.1- First observed
asterisk_channels - First observed
asterisk_cli - First observed
asterisk_dialplan - First observed
asterisk_endpoints - First observed
asterisk_status - First observed
freeswitch_api - First observed
freeswitch_channels - First observed
freeswitch_registrations - First observed
freeswitch_sofia_status - First observed
freeswitch_status
TDQS
Tools are clearly separated by system (asterisk_ vs freeswitch_) and each one targets a distinct concern: status, channels, registrations/endpoints, dialplan/Sofia status, and generic CLI/API access. No two tools overlap in purpose, making selection unambiguous.
All tool names follow a strict <system>_<object> pattern using lowercase with underscores. The object nouns (status, channels, endpoints, dialplan, cli, registrations, sofia_status, api) are consistent and predictable across both Asterisk and FreeSWITCH groups.
With 10 tools, the server is well-scoped for supporting two PBX platforms. Each tool has a clear role, and the count is neither bloated nor sparse for the stated purpose.
The toolset provides comprehensive coverage of PBX monitoring and inspection: status, live channels, registrations, dialplan/trunk states, and raw CLI/API access that can be extended for write operations. There are no obvious missing capabilities for the domain.
Maintenance
Related MCP Connectors
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
The Telnyx MCP server is an official implementation of the Model Context Protocol that enables AI clients (like Claude Desktop, Cursor, and OpenAI Agents) to interact with Telnyx's telephony, messaging, and AI assistant APIs. It provides comprehensive capabilities including making and managing phone calls, sending SMS/MMS messages, purchasing and configuring phone numbers, creating AI assistants with custom instructions, managing cloud storage buckets, scraping and embedding website content, and handling integration secrets. The server exists as both a local implementation and a remotely hosted version, allowing developers to integrate real-world communication infrastructure directly into AI applications.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- FlicenseCqualityDmaintenanceMCP server enabling interaction with Telnyx telephony, messaging, and AI assistant APIs through natural language.46-

VoIPbin MCP Serverofficial
AlicenseBqualityCmaintenanceAn MCP server that enables AI assistants to interact with the VoIPbin CPaaS platform, exposing tools for managing calls, flows, messaging, conferencing, and more.521MIT- AlicenseNot gradedqualityAmaintenanceAn MCP server that enables AI assistants to manage Cisco Unified Communications Manager (CUCM) via AXL SOAP API, supporting provisioning, configuration, and database queries through natural language.417MIT
- FlicenseNot gradedqualityBmaintenanceAn MCP server enabling AI assistants to make voice calls, send SMS/MMS, and manage group conversations using Twilio and OpenAI.5-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ictinnovations/pbx-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server