What Is an MCP Server and How Does It Make Phone Calls
September 2, 2026 · 7 min read
An MCP server is an interface that lets an AI editor or assistant (Claude Code, Cursor, Windsurf and others) reach into a tool from an outside service at runtime and use it directly - not just talk about it. The Model Context Protocol (MCP) is an open standard the editor uses to ask for a list of available tools, pick the right one for the prompt, and call it with real parameters; the server on the other end runs the tool and sends the result back into the conversation. At volai, one of those tools is make_call - which is why an AI editor can literally pick up the phone and call someone without you writing a single line of code.
What is an MCP server?
Anthropic introduced the Model Context Protocol in November 2024 as an open standard for connecting AI models to outside tools and data - instead of every editor and every service inventing its own one-off integration, they speak one shared protocol. MCP splits the two sides: MCP client is the app you have running (Claude Code, Cursor, Claude Desktop), and MCP server is the interface a service (volai, in this case) exposes to the outside - a list of tools it can be asked to run.
volai's MCP server runs at https://volai.cz/mcp (a remote server reached over what is called streamable HTTP transport, not a process on your own disk) and exposes 31 tools (as of September 2, 2026, the current list always lives at /docs/mcp) - from checking your credit balance and buying a number to sending an SMS and, yes, placing a call.
How does an MCP client call a tool?
A handful of steps happen between installing the server and an actual phone call - the editor does all of them, you only write the prompt:
- The editor connects to the server and authenticates with an API key (
Authorization: Bearer vk_...) - the same key as the REST API, sharing the same rate limit of 60 requests per minute. - The server sends back a list of tools - a name, a human-readable description, and the exact shape of its parameters (a JSON schema) for each one.
- The model reads the description and picks the one that fits the prompt -
make_call, say, when the prompt says "call". - The editor calls the tool with real parameters - an actual phone number and actual instructions for the agent, not generic text.
- The server on our side runs the tool - starts the call, deducts credit - and returns the result twice: as a readable sentence and, at the same time, as structured data (
structuredContent) for a client that can read it directly. - The model gets the result back into the conversation and tells you what happened - or moves on to another tool, like
get_call, to wait for the call to finish and bring back a transcript.
Example: make_call in practice
You tell the editor what you want in plain language - say: "Call +420777123456, introduce yourself as the receptionist for Nordic Coffee, and find out whether the caller wants to reserve a table." The editor turns that into a call to the make_call tool - you never see this part directly, but under the hood it looks like this:
{
"to": "+420777123456",
"systemPrompt": "You are the receptionist for Nordic Coffee. Answer the call, introduce yourself, and ask whether the caller wants to reserve a table - if so, get their name and time."
}The tool requires a destination (to - a Czech or Slovak number, the only ones volai can call today) and exactly ONE of three ways to run the call - agentId (your own agent handles it), from (a plain bridge between two numbers, no agent) or systemPrompt (a trial call with no number of your own - one request, nothing to buy or set up first). The server replies both ways at once (an excerpt - the full call object shape is in the REST API reference):
{
"call": {
"id": "c_7a2f91de",
"direction": "out",
"to": "+420777123456",
"status": "initiated",
"startedAt": 1756111400000
},
"trial": true,
"from": "+420..."
}The call goes out from a shared volai demo number, follows the systemPrompt instructions, and is billed normally including the agent surcharge - just with a stricter daily limit than a real agent: at most three trial calls with no number of your own, per account, per day (documented in the REST API reference, as of September 2, 2026). That is why the response also carries trial: true and from with the shared volai demo number, so it is clear the call did not go out from your own number.
How does an MCP server connect to phone calls?
The MCP server itself does not pick up a phone - it is the front door your prompt reaches the real service logic through. Behind it, make_call calls the same layer as the REST API and the portal, which places the call onto the phone network exactly like any other outbound volai call - over a SIP trunk that bridges internet signaling with the actual telephone network (the how is covered in What Is a SIP Trunk). MCP is the language the AI editor speaks; a SIP trunk is the language the phone network speaks - and the service logic in between connects the two.
Security
MCP authenticates with the same API key as the REST API - whoever holds it can spend your credit in your name: buying numbers, making calls, sending SMS, creating agents. The key belongs only in your editor's configuration, never in frontend code or a GitHub repository. A suspected leak is one button away in the portal (API and MCP) - deleting the key takes effect immediately and cannot be undone.
A second layer of protection runs on the server, not in the prompt. A number added to the do-not-call list (the add_to_dnc tool) blocks calls through make_call and through the relay regardless of what the prompt says - the model does not have to remember on its own who it must not call, the server enforces the boundary. Along the same lines, tools that cost money or change something irreversibly (make_call, send_sms, delete_agent...) carry their own flags in the protocol - the server states upfront whether an action is destructive or safe to repeat. Billable actions are deliberately NOT idempotent: calling make_call a second time after a dropped connection places a second call and charges a second payment, so a well-behaved client will not retry it on its own after a timeout.
One thing is missing on purpose: releasing a purchased phone number is not among the 31 tools. Buying a number through MCP works, releasing one does not - an irreversible action that could cost a customer the number printed on their flyer needs the portal or the REST API, not one misread sentence in a prompt.
Try it yourself
Installing into Claude Code is one command in the terminal (Cursor, Windsurf and Claude Desktop each need their own few lines of JSON, see /docs/mcp):
claude mcp add --transport http volai https://volai.cz/mcp \
--header "Authorization: Bearer vk_YOUR_KEY"| You want | Where to go |
|---|---|
| The full tool list and setup for other editors | MCP server |
| The same data over plain HTTP requests from your own backend | REST API |
So where does the call actually go?
make_call ultimately sends audio onto the real telephone network over a SIP trunk - what that is and why an AI voice agent needs one is covered in What Is a SIP Trunk.
Try volai - first 50 CZK on us
Sign up in a minute and your account already has starter credit for calls, SMS and a number.
What's next
Related articles
What Is a SIP Trunk
A SIP trunk is a data connection that carries phone calls over the internet instead of a cable - exactly what an AI voice agent needs to answer a real phone.
How Much Does an AI Receptionist Cost
A line-by-line breakdown of AI receptionist pricing on volai: number, minutes, agent surcharge, three volume scenarios, and what Czech competitors charge.
Never Miss a Call With an AI Receptionist
Why calls get lost even with a working phone line, what the call.missed webhook tells you, and how an AI receptionist keeps every call answered.