Skip to main content
Glama

pbx-mcp

pbx-mcp MCP server Documentation Status

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:

pbx-mcp tools listed in 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-mcp

Or run it straight from npx, which is what most MCP client configs do:

npx -y pbx-mcp

You 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-mcp

The same image is on Docker Hub as ictinnovations/pbx-mcp if that registry is an easier pull for you.

Three things to know:

  • -i is 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.internal on Mac and Windows, or add --network host on 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

ASTERISK_AMI_HOST

(required to enable)

Hostname or IP of the Asterisk box

ASTERISK_AMI_PORT

5038

AMI port from manager.conf

ASTERISK_AMI_USERNAME

AMI user

ASTERISK_AMI_PASSWORD

AMI secret

ASTERISK_AMI_TLS

false

Set true if tlsenable=yes

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 = command

FreeSWITCH

Variable

Default

Notes

FREESWITCH_ESL_HOST

(required to enable)

Hostname or IP of the switch

FREESWITCH_ESL_PORT

8021

Inbound ESL port

FREESWITCH_ESL_PASSWORD

ClueCon

From event_socket.conf.xml

Shared

Variable

Default

Notes

PBX_MCP_ALLOW_WRITE

false

Unlocks call control. Read the safety section first

PBX_MCP_TIMEOUT_MS

10000

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

asterisk_status

Version, uptime, active calls and calls processed

asterisk_channels

Every live channel with caller ID, state, bridge, duration and dialplan position. Optional substring filter

asterisk_endpoints

PJSIP endpoints with device state and contact count. Falls back to chan_sip peers on older installs

asterisk_dialplan

Dumps a context, or one extension inside a context

asterisk_cli

Any CLI command, subject to the safety policy below

asterisk_hangup_preview

Shows which live channels a hangup would drop, without dropping them

asterisk_originate

Places a call. Write mode only

asterisk_hangup

Kills a channel by name. Write mode only

FreeSWITCH

Tool

What it does

freeswitch_status

Version, uptime, current and maximum sessions

freeswitch_channels

Every live call leg from show channels. Optional substring filter that keeps the header row

freeswitch_registrations

Registered users on a Sofia profile, with contact URI, user agent and expiry

freeswitch_sofia_status

Every SIP profile and gateway, including whether trunks are registered upstream

freeswitch_api

Any API command, subject to the safety policy below

freeswitch_hangup_preview

Shows which live legs a hangup would drop, without dropping them

freeswitch_originate

Places a call. Write mode only

freeswitch_hangup

uuid_kill on a channel UUID. 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 start

The 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-node

  • freeswitch-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 helpers

Contributing

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 tools
asterisk_channelsList active Asterisk channelsA
Read-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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoCase-insensitive substring to match against any field, for example an extension or caller ID.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 commandA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
commandYesThe CLI command, for example 'pjsip show endpoints' or 'queue show support'.

TDQS

A3.8/5.0
Behavior1/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 dialplanA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contextYesDialplan context, for example 'from-internal' or 'default'.
extensionNoOptional single extension to narrow the output.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 stateA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoCase-insensitive substring to match against the endpoint name.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 commandA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
commandYesThe API command, for example 'show calls' or 'sofia status gateway mytrunk'.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 channelsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoCase-insensitive substring to match against the row, for example a number or a UUID.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 registrationsA
Read-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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoSofia profile name, usually 'internal' or 'external'.internal

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoOptional profile name for a detailed view instead of the summary.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 10 tool updatesv0.1.1
    • First observedasterisk_channels
    • First observedasterisk_cli
    • First observedasterisk_dialplan
    • First observedasterisk_endpoints
    • First observedasterisk_status
    • First observedfreeswitch_api
    • First observedfreeswitch_channels
    • First observedfreeswitch_registrations
    • First observedfreeswitch_sofia_status
    • First observedfreeswitch_status

TDQS

A4.3/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

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