Connect
MCP server
MCP (Model Context Protocol) lets an AI editor - Claude Code, Cursor, Windsurf, and others - pull in a tool from an outside service at runtime and actually use it, not just talk about it. Once volai is connected, just tell your editor what you want ("send an SMS", "create an agent"), and it picks the right tool and calls it - no code, no reading API docs.
Installation
The server runs at https://volai.cz/mcp. You authenticate with an API key from the portal - the first step of the Quickstart shows you how to get one. Pick your editor:
One command in the terminal and you're done:
claude mcp add --transport http volai https://volai.cz/mcp \
--header "Authorization: Bearer vk_YOUR_KEY"Tools
All 31 tools go through the same service layer as the REST API and the portal - same rules, same prices, same limits (including the 60 requests per minute: MCP and REST share it, since they run on the same key). The editor picks the right tool based on its description - you just tell it what you want.
get_balancelist_numberssearch_available_numbersbuy_numberfind_number_addressorder_number_from_regionlist_number_ordersset_number_routingget_sip_credentialscreate_relay_leaselist_relay_leasescancel_relay_leasesend_smslist_messagesmake_calllist_callsget_calladd_to_dnclist_dncremove_from_dnclist_voicescreate_agentlist_agentsupdate_agentdelete_agentlist_toolscreate_toolupdate_tooldelete_toolget_webhookset_webhookAgent tools are two steps, not one
create_tool only creates a tool - it doesn't assign it to any agent on its own. Only update_agent with toolIds assigns it, and the field is ALWAYS sent IN FULL: whatever you leave out won't be on the agent after the update. The same tool can be used by multiple agents - it belongs to the account.
Recording audio doesn't travel over MCP. get_call tells you via the hasRecording field whether a recording exists, and the MP3 itself is downloaded from GET /v1/calls/{id}/recording with the same API key - a binary body has no place in a tool's response.
What MCP deliberately can't do
The only ACTION from the REST API deliberately missing from the tool list is releasing a purchased number (DELETE /v1/numbers/{e164}). You can buy a number through MCP, but not release one - that's what the portal or REST API is for, so one misread sentence can't cost you the number printed on your flyer. The second endpoint without a tool is fetching a recording (see above) - it returns audio, not JSON.
A single agent's detail and a single SMS's detail don't get their own tool, because they wouldn't add anything - list_agents and list_messages return the same fields as the detail endpoints. The "have your own agent call you" trial call (REST POST /v1/agents/{id}/test-call) also doesn't get its own tool - make_call with an agentId parameter is the same call, just without its own daily cap of three attempts.
A trial call with no number of your own is a different thing, and has dedicated support in make_call: the systemPrompt parameter calls from volai's shared demo number, with no number to buy and no agent to set up.
Tax invoices and billing details stay outside both MCP and REST - they only live in the portal (/credit and /settings).
What the editor reads about a tool beforehand
Every tool reports how it behaves, so the editor knows when to ask first and when it can just act. It isn't a security boundary (that's credit, rate limits, and the do-not-call list, all enforced on our side) - it's why a good client asks before it deletes an agent:
| Property | What it means |
|---|---|
readOnlyHint | The tool only reads - it changes nothing and costs nothing. All list_* and get_* tools. |
destructiveHint | A change you can't undo, or one that lifts protection that was in place - delete_agent, delete_tool, cancel_relay_lease, remove_from_dnc. The editor should ask before these. |
idempotentHint | Repeating the call with the same values adds nothing. Paid actions (send_sms, make_call, buy_number, order_number_from_region) and creation actions (create_agent, create_relay_lease, create_tool) deliberately lack this hint: calling them again sends a second SMS, charges a second time, or creates a second record, so the editor must not retry them on its own after a timeout. |
openWorldHint | The action reaches outside your account records, into the phone network or the carrier's directories. |
Every tool's result also comes twice: as a readable sentence with a JSON block, and as machine-readable structuredContent - a client that supports it reads the data from there instead of parsing it out of the text.
Try it out
Once MCP is connected, try telling your editor one of these (your own words are fine - there's no exact wording to match):
- Call me right now at +420777123456 and try the role of a cafe receptionist - I don't want to set up my own number or agent just for this.
- Buy me a phone number and set up an agent on it that takes coffee orders.
- Text +420777123456 that their order is ready for pickup.
- List my last 10 calls and give me a short summary of each.
- Check how much credit I have left, and warn me if it's running low.
- Create an agent for a short satisfaction survey and call my own number with it right away so I can try it out.
- Add a tool for my receptionist that checks order status on my API, and turn it on for her.
- Have the agent capture the caller's name and whether it's urgent from every call.
Security
MCP uses the same API key as the REST API - anyone who has it can spend your credit on your behalf: buying numbers, making calls, sending SMS, creating agents.
Treat your key like a password
Never put it in frontend code, commit it to a GitHub repo, or send it to anyone in plain text. If someone else sees it, they can spend your credit until it runs out.
Suspect a leak, or just want to rotate the key? One button handles it: in the portal, under API and MCP, delete the key - it stops working immediately and can't be restored. Create a new one and update it in your editor's config.
Related
REST API
Complete reference for every endpoint, incl. agent tools and recordings.
Voice agent
System prompt, tools, handoff to a human, recordings and structured call data.
Webhooks
Events, structured data in the body, signature verification, retries on failure.
Bring your own agent
Connect a third-party platform (ElevenLabs, Asterisk...) - no agent surcharge.