VoIPSense Maroc MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VOIPSENSE_API_KEY | Yes | Your vsk_… API key | |
| VOIPSENSE_BASE_URL | No | API base URL (for staging or a white-label host) | https://app.voipsensemaroc.com/api/v1 |
| VOIPSENSE_READ_ONLY | No | Set to true to expose only read tools (no calls, no lead injection) | false |
| VOIPSENSE_DOWNLOAD_DIR | No | Where download_recording saves files | ~/Downloads/voipsense |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_callsB | GET /v1/calls (permission cdr:read). Unified call history (auto-dialer, manual, inbound) with agent dispositions. Use to read call outcomes back into a CRM/ERP. |
| list_recordingsA | GET /v1/recordings (permission recordings:read). Returns { total, page, limit, recordings: [{ filename, date, duration, src, dst, direction, disposition, format }] }. Pass |
| download_recordingA | GET /v1/recordings/download (permission recordings:read). Saves the audio file to disk and returns its local path. |
| list_listsA | GET /v1/lists (permission callcenter:read). Returns each list's id, number, name, volume and own outbound line (outboundLine: { id, name } or null = follows the campaign). |
| list_campaignsB | GET /v1/campaigns (permission callcenter:read). Campaigns with status, dialMethod, number of lists and agents, and outbound routing (outboundLine, lineSelectionMode FIXED|FIRST_FREE, linePool). |
| list_dispositionsA | GET /v1/dispositions (permission callcenter:read). Outcome codes agents set on calls: [{ id, code, name, category, isSystem }]. Optional campaignId adds campaign-specific dispositions. |
| ghl_list_subaccountsA | GET /v1/ghl/subaccounts (permission callcenter:read or callcenter:write). Returns [{ locationId, name, services: [...] }] for each linked GoHighLevel sub-account. |
| make_callA | POST /v1/calls (permission pbx:write). connectTo.type=extension: rings the agent first, then dials |
| hangup_callA | DELETE /v1/calls/{callId} (permission pbx:write). Ends all legs of the call (normal clearing). Fires the call.ended webhook. 404 = unknown or already ended; 409 = no active channel. |
| transfer_callA | POST /v1/calls/{callId}/transfer (permission pbx:write). Blind-transfers the remote party to an extension, queue or external number. The agent's extension is released; the call keeps its callId. Call must be established (else 409). 400 invalid target · 404 not found · 422 destination unreachable. |
| inject_leadA | POST /v1/leads (permission callcenter:write). Adds one contact to a list (by listId or listName). Idempotent: a number already in the list returns duplicate=true without creating a duplicate. Returns { id, phone, created, duplicate, listId, listNumber, listName, … }. |
| inject_leads_batchA | POST /v1/leads/batch (permission callcenter:write). End-to-end provisioning in one call: create/reuse a list, attach it to a campaign (create it if needed), enroll agents, and inject leads. More than 500 leads are automatically split into batches of 500 and the totals are aggregated. Idempotent by phone number per list: safe to resend the full file every cycle. Without any campaign field the leads go to a plain list ("Mes listes" mode). |
| ghl_set_servicesA | POST /v1/ghl/services (permission callcenter:write). Tells VoIPSense which service(s) a GoHighLevel contact asked for; the agent sees it preselected during the call and the GHL call note gets a 'Service: …' line. Send a single contact (phone + service/services) or up to 500 |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 13 tools
Each tool maps to a distinct resource+action: call history vs recordings vs lists vs campaigns vs dispositions are easy to tell apart, and make_call/hangup_call/transfer_call have clearly separate lifecycle roles. Minor overlap exists between inject_lead and inject_leads_batch (the batch variant silently creates lists, campaigns and agent enrollments), and ghl_set_services touches the same lead/contact surface, but descriptions clarify the boundaries.
Nearly all tools follow a clear snake_case verb_noun pattern (list_calls, download_recording, make_call, hangup_call, transfer_call, inject_lead). The only deviations are the ghl_-namespaced tools (ghl_list_subaccounts, ghl_set_services), where the namespace prefix precedes rather than follows the verb, which is readable but breaks the pattern.
13 tools is well within the sweet spot and every tool earns its place: six read/listing tools over distinct resources, three call-control tools, and three write/provisioning tools plus the GHL scoping pair. Nothing looks redundant or padded.
Read coverage is strong (calls, recordings, lists, campaigns, dispositions, GHL subaccounts) and outbound call control plus lead injection are covered, but the lifecycle is visibly incomplete: there is no get_call by id, no create/update/delete for lists and campaigns, no campaign start/pause control, no lead removal or update, and dispositions are read-only. Agents can read broadly and dial, but must fall back on the batch injector for any list/campaign/agent provisioning.