- Connect the server with
POST /v1/mcp-servers. Its tools are read straight away. - Choose which tools agents may use with
enabled_tools. - Attach the server to an agent with
mcp_server_ids.
Connect a popular app
In the console, open Integrations, pick an app, and follow its page. The page lists the tools the app offers and switches on the ones a phone agent needs most. Connecting an app creates an ordinary MCP server, so everything on this page applies to it, and you can connect the same apps from the API with the URLs below. Apps connect in one of four ways:- Sign in. Press the button and sign in to the app. Wixzel Voice registers itself with the app, so there is nothing to set up first.
- API key. Paste a key or token from the app. It is sent as a header.
- Your own app. The app does not let other apps register themselves. Create an OAuth app with the vendor once, give it the redirect URL below, and paste its client id and secret.
- No sign-in. Nothing to enter, or only the server’s URL.
For an app that is not listed, connect its remote MCP server with Add custom
MCP server, or with the API as shown below.
Apps that use an API key
From the API, send these asauth.headers:
Apps that need your own OAuth app
HubSpot, Salesforce, Slack, Asana and Google Calendar do not let other apps register themselves. Create an OAuth app with the vendor once:- Create the app in the vendor’s developer settings:
- HubSpot: Development, then MCP Auth Apps.
- Salesforce: an External Client App with the scopes
mcp_apiandrefresh_token. - Slack: an app in your workspace at api.slack.com/apps. Slack only lets internal or directory apps use MCP, and a workspace admin may need to approve it.
- Asana: an MCP app in the Asana developer console.
- Google Calendar: a Web application OAuth client in a Google Cloud project with the Google Calendar API and the Calendar MCP API enabled. The Calendar MCP server is in Google’s Workspace Developer Preview Program.
- Add this redirect URL to it:
https://api.voice.wixzel.com/mcp-oauth/callback - Paste its client id and client secret on the app’s page in the console and
press Sign in. From the API, send them as
auth.oauth.client_idandauth.oauth.client_secret, then start the sign-in as below.
api.voice.wixzel.com.
Things to know about some apps
- GoHighLevel has no tool to book an appointment yet. Use Cal.com, Calendly or the built-in booking for that.
- Calendly has no reschedule tool; the agent cancels and books again. Booking a slot needs a paid Calendly plan.
- Close is signed in with read and safe-write access. Updating existing records needs Close’s destructive scope, which is not asked for.
- Help Scout is read-only. It cannot create tickets or notes.
- Stripe: live or test mode is chosen on Stripe’s sign-in screen. Refunds wait for someone to approve them in Stripe.
- Razorpay cannot make refunds over its hosted server.
- Dodo Payments asks for your API key and test or live mode when you sign in.
Its
executetool can do anything the key can, including refunds, so it starts switched off. - Zapier charges 2 Zapier tasks for each tool call. Choose the actions in Zapier, then refresh the tools.
- Make scenarios should answer within 25 seconds to be useful on a call.
- Freshdesk limits MCP actions by plan.
- Home Assistant must be reachable at a public
httpsaddress. Home Assistant Cloud gives every instance one;homeassistant.localcannot be reached. Add the Model Context Protocol Server integration in Home Assistant first. The agent only sees the devices exposed to voice assistants. See Smart home devices. - Exa uses Exa’s free, rate-limited tier. No account is needed.
Connect any MCP server
name is what the agent is told the app is called, so use the name a caller
would say. The answer lists every tool the server offers and a status:
Agents only use servers that are
ready. POST /v1/mcp-servers/{id}/refresh
reads the tools again and updates the status.
Authentication
nonefor a public server.headersfor an API key or any fixed header. Values are encrypted at rest and never returned; responses list only the header names. On update, send a header withoutvalueto keep the stored one.oauthfor a server that signs in. Most hosted MCP servers do.
Servers that sign in with OAuth
Create the server with"auth": { "type": "oauth" }, then start the sign-in:
authorization_url in a browser and sign in. When the provider sends the
browser back, the server is connected and its tools are read. The link works
once and expires after ten minutes.
Wixzel Voice registers itself with the server’s authorization server
automatically when the server allows it. If it does not (GitHub’s, for one),
register an OAuth app with the provider using the redirect_uri above, and
send its id and secret as auth.oauth.client_id and auth.oauth.client_secret.
Tokens are refreshed automatically during calls. If a refresh fails, the server
moves to needs_auth and agents stop using it until it is connected again.
Choose the tools
Only tools inenabled_tools are ever offered to an agent. Until you set it,
the first discovery enables only the tools the server marks read-only
(readOnlyHint). Anything that can change data has to be switched on on
purpose.
Attach it to an agent
[] to detach
all of them. Deleting a server detaches it from every agent.
What happens on a call
- The tools are declared to the model when the call starts, from the stored list, so connecting a server never delays the greeting. The connections open in the background.
- Each tool is named
<app>__<tool>, for exampleorders__lookup_order, and its description starts with the app’s name. - The agent says a few words before it uses a tool, so the caller is not left in silence. On the classic and Sarvam engines, if the model goes straight to the tool, the agent says “One moment, let me check that.” for it.
- Before using a tool the server marks as changing data, the agent asks the caller to confirm.
- A tool call times out after 10 seconds. Failures become a sentence the agent can say (“I couldn’t reach Orders right now”); they never end the call.
- Results are cut to 4,000 characters before the model sees them.
- At most 20 tool calls per call, and three rounds of tool calls per caller turn before the agent has to answer in words.
GET /v1/calls/{id} returns them in
tool_calls, with the arguments, whether it worked, and how long it took.
All four engines support tools: classic, sarvam, gemini-live and
deepgram-agent.
Cost
Tool calls are free. The extra language-model tokens a tool result adds to the conversation are billed as usual, on the agent’s LLM line in/v1/usage/events.
Security
- Allowlist. Only enabled tools are declared, and a call to any other name is refused even if the model guesses it.
- Untrusted results. The agent is told that tool results are data, not instructions.
- Network. Server URLs must be public
https(orhttp) on port 443 or 80. Private, loopback and link-local addresses are refused when the server is saved and again on every request, including each redirect, and the connection goes to the address that was checked. A redirect to another host does not carry your headers. - Secrets. Header values, OAuth tokens and client secrets are encrypted at rest and never returned by the API.
- Scopes. Managing servers needs
mcp_servers:readandmcp_servers:write.
Smart home devices
Caller id can be faked, and a caller can try to talk an agent into things. When an agent can control devices through Home Assistant:- Do not expose locks, alarms or garage doors to voice assistants in Home Assistant.
- Only the read tool (
GetLiveContext) is switched on when it is connected. Switch on the tools that change devices only for an agent whose prompt checks who it is talking to.

