3CX MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TCX_FQDN | Yes | The FQDN of your 3CX instance (e.g., company.my3cx.de) | |
| TCX_PORT | No | Port for 3CX API (443 for hosted, 5001 for self-hosted) | 443 |
| TCX_TIMEZONE | No | Timezone for call history scope (e.g., Europe/Berlin) | |
| TCX_CLIENT_ID | Yes | Your 3CX API Client ID (numeric extension number, e.g., 900) | |
| TCX_CLIENT_SECRET | Yes | Your 3CX API Client Secret |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_system_statusA | Returns 3CX system overview. Fields: FQDN, Version, Activated, MaxSimCalls, ExtensionsRegistered, ExtensionsTotal, TrunksRegistered, TrunksTotal, CallsActive, LicenseActive, ExpirationDate, MaintenanceExpiresAt, Support, ProductCode, BackupScheduled, LastBackupDateTime, DiskUsage, FreeDiskSpace, OS. Use this to check system health, license status, or how many active calls are running. |
| find_usersA | Use this when the user asks about people, extensions, or phone users. Searches across extension number, first name, last name, display name, email, and mobile. Examples: 'find Philipp', 'who has extension 101?', 'who is online?', 'list all users'. Set onlyRegistered=true for 'who is online/registered?' questions. Returns: Id, Number, FirstName, LastName, DisplayName, EmailAddress, Mobile, IsRegistered, CurrentProfileName, QueueStatus, Enabled. |
| get_userA | Use this when the user asks about ONE specific extension by number. Returns the complete user record including the numeric Id (needed for update_user and delete_user). Fields: Id, Number, FirstName, LastName, DisplayName, EmailAddress, Mobile, IsRegistered, CurrentProfileName, QueueStatus, Enabled, Tags. Always call this before update_user or delete_user to get the Id. |
| create_userA | [DESTRUCTIVE] Creates a new 3CX user/extension. The Number must be unused — use find_users first to check availability. Returns the created user with its assigned Id. Requires confirmation from the user before executing. |
| update_userA | [DESTRUCTIVE] Updates a 3CX user by numeric Id. Get the Id from get_user or list_users first. Only provided fields are changed. Can update name, email, mobile, or enable/disable a user. |
| delete_userA | [DESTRUCTIVE] Permanently deletes 3CX users by their numeric Ids. Cannot be undone. Get Ids from get_user or list_users first. Accepts an array to delete multiple users at once. |
| list_departmentsA | Returns all 3CX departments (called 'Groups' in the API). Each department has: Id, Name, Number, Language, TimeZoneId, Members. The Id is needed for update_department. Filter examples: "Name eq 'Sales'", "Name eq 'DEFAULT'". |
| create_departmentB | [DESTRUCTIVE] Creates a new department (group) in 3CX. Returns the created department with its assigned Id. |
| update_departmentA | [DESTRUCTIVE] Updates a 3CX department by its numeric Id. Get the Id from list_departments first. Only provided fields are changed. |
| list_trunksA | Returns all SIP trunks configured on the 3CX system. Each trunk has: Id, Number, Name, IsOnline (registration status), Direction, SimultaneousCalls. Use get_trunk_details with the Id for full configuration details. |
| get_trunk_detailsA | Returns full configuration of a specific SIP trunk including registration details, codecs, routes, and authentication. Get the trunk Id from list_trunks first. |
| get_active_callsA | Returns all currently active (live) calls on the 3CX system. Each call includes caller/callee info, duration, and status. Returns an empty array if no calls are in progress. Use this for 'who is on the phone right now?' questions. |
| get_call_historyA | Use this for ANY question about past calls: 'show today's calls', 'missed calls today', 'recent calls for extension 101', 'calls to queue 802 yesterday'. Returns newest calls first. Each record: StartTime, SourceDisplayName, SourceCallerId, DestinationDisplayName, DestinationCallerId, Answered (true/false), TalkingDuration, Direction, Status, Reason. Set missedOnly=true for missed/unanswered calls. Handles timezone-aware 'today' filtering automatically. Requires System Owner role. |
| find_queuesA | Use this when the user asks about call queues: 'show all queues', 'find support queue', 'which queue is 802?'. Searches by queue number or name with fuzzy matching. Returns: Id, Number, Name, IsRegistered, PollingStrategy, Agents (with login status), RingTimeout, MaxWaitTime. Use get_queue_agents for detailed agent info on a specific queue. |
| get_queue_agentsA | Use this when the user asks 'who is in queue X?', 'which agents are logged into 802?', or 'who is working the support queue?'. Resolves the queue by number or name, then returns its agents with login status. Set loggedInOnly=true to show only currently logged-in agents. |
| list_ring_groupsA | Use this when the user asks about ring groups (not queues). Ring groups ring multiple extensions simultaneously or in sequence. Returns: Id, Number, Name, Members, RingStrategy. |
| search_contactsA | Use this when the user asks about contacts or the phonebook: 'find contact Mueller', 'search for Acme', 'who has number 0731...'. Searches across FirstName, LastName, CompanyName, Business phone, and PhoneNumber. Returns: Id, FirstName, LastName, CompanyName, PhoneNumber, Business, Email, Department, Title. For exact phone number matching (ignoring formatting), use find_contact_by_phone instead. |
| find_contact_by_phoneA | Use this when the user provides a specific phone number and wants to know who it belongs to: 'whose number is +49 731 123456?', 'who called from 0176-1234567?'. Normalizes the number (ignores spaces, dashes, formatting) for exact matching across all phone fields. |
| get_extension_statusA | Use this when the user asks 'is extension 101 online?', 'what status has extension 200?', or 'is Philipp available?'. Returns: Number, DisplayName, IsRegistered (true=phone connected), CurrentProfileName (Available/Away/Out of office), QueueStatus (LoggedIn/LoggedOut). For full user details use get_user, for searching by name use find_users. |
| get_event_logsA | Returns system event logs from 3CX. Each entry has: Id, Type (Info/Warning/Error), EventId, Message. Filter examples: "Type eq 'Error'" for errors only, "Type eq 'Warning'" for warnings. Use this for 'are there any errors on the phone system?' or 'show me recent system events' questions. |
| get_forwarding_profilesA | Use this when the user asks 'how are calls routed for extension 101?', 'what forwarding profiles does 200 have?', or 'show me the call routing for Philipp'. Returns the active profile name and all available profiles (Available, Away, Out of office, Custom 1, Custom 2) with their routing rules. Call this before set_forwarding_profile to see valid profile names. |
| set_forwarding_profileA | [DESTRUCTIVE] Use this when the user wants to change call routing: 'set extension 101 to Away', 'put Philipp on DND'. Changes take effect immediately. Valid profiles: 'Available', 'Away', 'Out of office', 'Custom 1', 'Custom 2'. Call get_forwarding_profiles first if you need to verify available profile names. Requires user confirmation. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/SSIG-IT/3cx-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server