Dunefox Voice MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DUNEFOX_ORG_ID | Yes | Your Dunefox Voice workspace's org id, shown next to the API key in Settings → Developer. | |
| DUNEFOX_API_KEY | Yes | Your Dunefox Voice API key, created in Settings → Developer. The key is shown once; save it immediately. | |
| DUNEFOX_API_BASE_URL | No | Optional base URL for the Dunefox Voice API. Set only if your workspace runs somewhere else, such as a self-hosted deploy or staging environment. | https://voice.dunefox.io |
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 |
|---|---|
| whoamiA | Confirms the API key and org id are valid, and returns the workspace's name. Call this first if a tool starts failing with 401s. |
| list_agentsA | This workspace's AI agents: id, name, active. Enough to choose one for place_call or send_announcement. For an agent's full setup (prompt, voice, one-way script), use get_agent — it needs the separate "agents" scope. |
| get_agentA | An agent's full configuration: prompt, voice/model params, knowledge base, handoff rules, integrations, and its one-way script if it has one. Needs the "agents" scope. |
| create_agentA | Create a conversational (two-way) or one-way (script-only, no listening) agent. Same rules as the dashboard builder, including the plan's agent limit and provider/language restrictions. For a one-way agent, set communication:"one_way" and pass announcement:{script, useCase}. Needs the "agents" scope. |
| update_agentB | Change any of an agent's fields. Send only what changes - fields left out are untouched. Needs the "agents" scope. |
| delete_agentB | Permanent. Does not touch calls it already placed - only the agent record. Needs the "agents" scope. |
| list_campaignsB | This workspace's outbound campaigns. Needs the "campaigns" scope. |
| get_campaignA | A campaign's full settings and live counters (callsPlaced, callsCompleted, callsConnected). For outcomes/sentiment/the numbers it collected, use get_campaign_report instead. |
| create_campaignA | Create an outbound campaign against a lead group or a filter. Starts as "draft" - call update_campaign with status:"running" to actually dial. Same trial block, concurrency cap and calling-hours narrowing as the dashboard. Needs the "campaigns" scope, and the workspace's campaigns entitlement. |
| update_campaignA | Change settings, or change status. status:"running" starts dialling (kicks the dialer right away - real calls start going out), "paused" holds it, "cancelled" stops it for good. Fires the campaign.status_changed webhook, if the workspace has one subscribed. |
| delete_campaignB | Permanent. Does not touch calls it already placed. Needs the "campaigns" scope. |
| get_campaign_reportB | Did it work, and what did it collect: per-lead outcome, sentiment, talk time, intent score, and the phone numbers/names the agent was told. Set csv:true for a spreadsheet-ready export instead of JSON. |
| place_callA | Starts a real conversational call from this workspace's own number. Behind the same gates as the dashboard: the do-not-call list, calling hours, wallet balance and concurrency. A refusal carries a code (suppressed, outside_hours, wallet_low, ...) to branch on. Needs the "dial" scope, which no key holds by default. For a fixed script with no listening (an order update, a reminder), use send_announcement instead - it is far cheaper. |
| list_callsA | This workspace's calls, newest first, with outcome/sentiment/summary once analysed. Needs the "calls" scope. |
| get_callA | A call's full record - outcome, sentiment, summary, extracted details - with its transcript and lead merged in. |
| get_transcriptC | The turn-by-turn transcript of one call. |
| send_announcementA | Plays a one-way agent's fixed script to one number - a delivery update, a payment reminder, a COD confirmation. Text-to-speech only, no conversation, billed at the one-way rate (far cheaper than place_call). Values are formatted for speech before the call (amounts in words, dates as dates); a script field with no value is refused by name rather than skipped mid-sentence. externalId makes retries safe: the same reference answers with the first send instead of ringing again. |
| get_announcementC | queued, ringing, delivered, no-answer, busy, or a refusal code - never the phone number or the message text. |
| list_leadsB | This workspace's leads, newest first. Needs the "leads" scope. |
| create_leadA | Creates a lead, or returns the existing one with that phone number (201 created, 200 found - check the tool's isError/status if that distinction matters to you). |
| get_lead_for_callC | The lead record linked to a given call. |
| list_webhooksA | This workspace's outbound webhook endpoints. Needs the "webhooks" scope. |
| create_webhookA | Subscribes a URL to one or more events (call.started, call.ended, call.analyzed, lead.created, campaign.status_changed, or "*" for all of them). Returns the signing secret ONCE - store it, it cannot be read back later. |
| delete_webhookD | Permanent. |
| get_webhook_samplesA | Recent real events of one type, in the exact shape a live delivery POSTs - useful for building a receiver before anything has fired for real. |
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 25 tools
Most tools have clearly distinct resource/action purposes, and descriptions actively disambiguate easily confused pairs like get_campaign vs. get_campaign_report, get_call vs. get_transcript, and place_call vs. send_announcement. Some boundaries remain slightly soft, particularly around call detail vs. transcript retrieval and agent listing vs. agent detail, but an agent can generally select correctly.
The tool set uses a highly consistent snake_case verb_noun convention (list_calls, get_call, create_campaign, update_agent, delete_webhook, etc.). The few special cases such as whoami and get_lead_for_call are conventional and still readable, without mixing camelCase or conflicting verb styles.
At 25 tools, the server is on the heavy side for the apparent scope, covering campaigns, calls, agents, leads, webhooks, and announcements. The domain is broad enough that many tools earn their place, but the surface is close to the rubric's borderline-heavy range and could benefit from consolidation.
Core lifecycles for campaigns and agents are well covered, including create, read, list, update, delete, and reporting. However, there are notable gaps such as lead update/delete, announcement listing or cancellation, and webhook update/detail operations, which may force workarounds for full lifecycle management.