Blog · For developers
What an MCP phone tool is, and what your agent gets from one
Your agent describes the job in a sentence or three. A phone rings somewhere. A few minutes later it reads the result as fields.
By the CosVoice team · · 6 minute read
A tool call that ends with a phone ringing
An MCP phone tool is a tool your agent calls the same way it calls a search tool or a file tool, except the side effect is a real phone call to a real number. The agent never touches audio. It doesn't pick a speech model or manage a carrier. It says who to ring and why, and a phone line on the other side of the tool does the talking.
The mental model that helps: the tool is a colleague with a phone, not a telephony library. You brief it, it makes the call, it writes up what happened. We'll use our own server at cosvoice.com/mcp as the example all the way through, because it's the one we can describe without guessing. The shape is what matters if you're comparing options.
What the agent supplies is intent
The main tool is place_call. It takes a number to ring and a purpose, which is the job in plain English. The purpose is where the work is. Write it the way you'd brief a human assistant: who to ask for, what you want, what to accept if the first answer is no, and what to do on voicemail.
Here's one that works. "Book a table for two this Friday at 7:30 under Graham. If 7:30 is gone, take anything between 7:00 and 8:30. Give this line's number as the callback." Three sentences, and the line can now deal with the most common thing that goes wrong on a booking call, which is that the time you wanted has gone.
One option is worth knowing early. Add connect_owner, set to true, when the owner wants to speak to a person themselves but doesn't want to sit through the menu and the hold music. The line works the menu, waits, and when someone who can help picks up it says "one moment" and rings the owner's mobile. If the owner doesn't answer, the line apologizes and arranges a callback.
What comes back, and when
Not the answer. Not straight away, anyway. place_call returns an id at once, because a phone call takes minutes and no tool call should block for that long. The agent then asks get_call about every twenty seconds, or you set a webhook and let the call.completed event say when it's done.
We keep the written call and not the audio, so there's nothing to download and nothing to transcribe. Once the call is written up, get_call returns the same conversation at four depths:
- Outcome. One line saying what happened, along the lines of "Reserved · Friday 8:15pm · party of 2".
- Summary. A short written account. The host offered 7:00 or 8:15, the line took 8:15 and booked it under Graham.
- Details and action items. What the line captured (names, amounts, dates, reference numbers) and anything that now needs doing.
- Transcript. The words that were said, turn by turn, for when the agent needs to check something.
The rest of the toolbox
A phone line does more than dial out, so the server has more than one tool. You won't need all of them on day one. Grouped by what they're for:
- Calls: place_call, get_call, list_calls for recent calls with the newest first, and annotate_call to leave a note on one.
- Reservations: book_reservation takes the venue, party size, time and what to accept instead. list_reservations shows what the line has booked.
- Texts and email: send_text, list_messages, send_email, list_emails, get_email and forward_email. The line has its own email address, so mail is part of the picture.
- People: list_contacts, add_contact and remove_contact decide who the line knows and how it treats them.
- The line itself: get_line, get_settings and update_settings cover the number, the name, the voice, the greeting and the standing instructions.
- Catching up: recent_activity returns everything since a timestamp, which is what you want after downtime. list_history gives the history as JSON or CSV.
- Being told: set_webhook and set_bot_push say where to send events and how to wake your agent when something happens.
About send_text, since you'll ask
Texts to the line always arrive and are saved. A text from the owner's own mobile is treated as an instruction for the agent. Texts from the line to other people are limited for now: US carriers only deliver business texts from registered numbers, and our registration is still in progress, so a text may be filtered and never land.
What that means for your agent is simple. If something has to arrive, call or email. And never let it report a text as delivered.
An agent can set the line up too
Before a line exists, the server offers a smaller set of tools: get_account, search_numbers and create_line. The agent confirms who it's connected as, asks the owner for an area code and a name for the line (a first name works best), shows three or four numbers, and creates the line. If payment isn't on file yet, create_line comes back with a checkout link to pass to the owner. Payment always comes before a number is issued.
Connecting is one address. You add cosvoice.com/mcp to the agent, a CosVoice page opens in the browser, the owner signs in and presses Allow. There's no key to paste. We walked through what happens underneath in OAuth for MCP servers, in practice, and the clicks for one particular client are in connect Claude to a phone line.
What the tool decides for you
Some behavior is fixed in the line, whatever the agent asks for. It says it's an AI assistant when anyone asks. It never reads out a card number and never agrees to a charge, so a request for a deposit comes back marked as needing the owner. It gives the line's own number and email as the contact, not the owner's mobile, unless the owner has allowed that.
One rule lands on the agent's side of the fence: don't tell the owner something is booked until the outcome says so. A placed call isn't a confirmed table.
We think that's the right split, and it's the thing to look for in any phone tool you evaluate. How much of the call do you have to specify, and how much can you leave alone? Your agent should own the intent. The line should own the manners. The full list of tools is on the docs page.
Common questions
Does my agent need to handle audio to use an MCP phone tool?
No. The agent sends text and reads text. The line holds the spoken conversation and returns an outcome, a summary, the details it captured and a transcript.
How long does place_call take to return?
It returns an id straight away. The call itself takes minutes, so the agent polls get_call about every twenty seconds or waits for the call.completed webhook.
Which agents can connect to an MCP phone server?
Any client that can add a remote MCP server by address. Ours works with Grok Bot, Claude, ChatGPT and Cursor. An agent that can't speak MCP can use the REST API with a key instead.
Can one tool call ring a list of numbers?
No. One call goes to one number for one reason. There is no bulk dialing, by design.
Read next: A phone number for your agent, over MCP · Why fields beat a transcript · The same calls over plain REST
Hear it for yourself.
Call our own AI agent and ask her anything, or get a number in your area code in about a minute.