Developers · Agents
Claude on a laptop, a voice agent on the shop's phone line, or anything else that speaks MCP — one config line connects it to one business, and every booking it takes goes down the same pipeline, under the same rules, as a booking made by hand.
The tools are derived from the live API contract — all 47 /v1
operations, generated from the same document the API reference
renders. An endpoint added to the API becomes a tool the day it ships; the tool list cannot
disagree with the server behind it.
The hosted endpoint lists only the tools your key's scopes can call: a
"Take bookings" key gets the booking tools and nothing else — no deleteService
in a receptionist's toolbox, and no context window spent on schemas it could never use.
The local npx server reads the contract before it knows your key, so it serves
the full list and lets the server refuse out-of-scope calls (insufficient_scope
names both what was needed and what the key holds); prefer the hosted endpoint for scoped
keys.
Point any MCP client at the endpoint with your API key. With Claude Code:
claude mcp add --transport http voltsbook \
https://app.voltsbook.com/mcp \
--header "Authorization: Bearer vb_live_your_key" Or in any client's JSON config:
{
"mcpServers": {
"voltsbook": {
"type": "http",
"url": "https://app.voltsbook.com/mcp",
"headers": { "Authorization": "Bearer vb_live_your_key" }
}
}
}
The same server as a local process. It reads the live contract at startup, so it never
goes stale, and it works against self-hosted deployments too (set
VOLTSBOOK_API_URL).
{
"mcpServers": {
"voltsbook": {
"command": "npx",
"args": ["-y", "@voltsbook/mcp"],
"env": { "VOLTSBOOK_API_KEY": "vb_live_your_key" }
}
}
}
Both doors derive their tools from the same contract and execute through the same
/v1 surface, under the same per-key rate budget. They differ in one way:
the hosted door authenticates before it lists, so it shows only the tools your key’s
scopes can call, while this one fetches the contract unauthenticated and shows all of
them — a tool your key does not cover is refused by the server when you call it.
ping— credential check; returns the business, its timezone, and the webhook topicslistServices / listStaff / listLocations / listProducts— the catalog, with durations and list prices (a list price is not a quote — see previewPrice)getAvailability— real bookable slots — holds and rules already appliedpreviewPrice— what this exact booking will cost — the price to quote aloud, with tax, staff price, add-ons and any coupon already in itcreateReservation / getReservation / cancelReservation— hold a slot briefly while the human decidescreateBooking / getBooking / listBookings— take the booking; read it backrescheduleBooking / cancelBooking— move or cancel an existing appointmentupdateBookingSettings / createService / updateProduct / getReportsSummary …— full admin control — settings, forms, statuses, catalog and reports, for keys minted with the matching scope tickedcreateFlow / updateFlow / publishFlow …— author the guided-booking wizard itself — cards, options and the publish gate; the flows guide below is the full lessonSay it plainly: an agent holding a key books real appointments into a real diary. That is the point, and it is also why the posture is one key per integration, revoked freely from Settings → API keys. Every write is idempotent — a retried request replays the original answer instead of double-booking — and every booking obeys the same locks and rules as any other.
The shape: your Twilio number answers, ElevenLabs runs the conversation, and the VoltsBook tools give it your real diary — services, prices, live slots, and the booking itself. Their dashboards move their menus around; the concepts below do not.
In your panel: Settings → API keys → New key. Tick what the key may do — "Take bookings" is all a receptionist needs; the catalog, settings and reports powers are separate ticks, and the server refuses anything outside them. Copy the key once — it is shown once. Use ONE key per integration (one for the voice agent, another for anything else), so you can revoke one without breaking the rest. Your plan must include the public API.
In ElevenLabs, create a Conversational AI agent: pick a voice, set the first message ("Thanks for calling — what can I book you in for?"), and paste the system prompt below. The prompt is most of the product: it tells the agent to quote only what the tools return and to confirm before booking.
Add our MCP server to the agent — ElevenLabs supports MCP integrations: the server URL is https://app.voltsbook.com/mcp, with an Authorization header of "Bearer <your key>". Every booking tool arrives at once. If your platform version only offers per-tool webhooks, define three against the /v1 endpoints instead: listServices, getAvailability and createBooking cover a working receptionist.
In ElevenLabs under Phone numbers, import your Twilio number (it asks for your Twilio Account SID and auth token) — or buy a number there directly. Assign the agent to the number. Twilio and ElevenLabs bill their own usage; VoltsBook does not charge per call.
Call the number and walk the whole path: ask what services there are (it should quote YOUR prices), ask for a time tomorrow (it should offer real slots), book one, and hang up. The appointment is in your diary like any other — notifications fire, reminders schedule, and it shows the moment the call ends.
Replace the bracketed lines with your business's own. The rules in it are the ones that keep a voice agent honest.
You are the phone receptionist for [BUSINESS NAME], a [TRADE] at [ADDRESS].
You book appointments using the VoltsBook tools. Follow these rules without exception:
1. Only state services, prices and times that a tool returned on THIS call.
Never estimate, remember, or invent any of them.
2. Every slot, next-available offer and booking from the tools carries "say" —
the time as words, already in the business's timezone ("Saturday 22 August
at 9:00 AM"). Read "say" verbatim. NEVER convert startIso or startAt
yourself: they are UTC, and reading one as local time is wrong by the
whole UTC offset.
3. Booking flow: find the service with listServices; offer 2–3 concrete slots
from getAvailability (ask with perDay=3 and spread=true so the options
span the whole day), reading each slot's "say"; when the caller picks one,
call previewPrice for that exact choice, then repeat the full booking
back — service, the booking's own "say", price — and ask "Shall I book
that?". Only call createBooking after a clear yes.
4. NEVER say listServices' priceMinor out loud. That is the catalog price,
before tax, before the chosen staff member's own price, before add-ons and
before any coupon — with a 20% tax it is a fifth short of the bill.
previewPrice is the price: quote its totalMinor. When payableTodayMinor is
smaller, say both — "forty-two dollars, and we take ten today". If it
returns anything in unknowns, say the total may still change rather than
promising it.
5. If the caller has a discount code, send it as couponCode to previewPrice
BEFORE you quote, and again to createBooking. If couponMessage comes back,
read it to them — the code was refused or is conditional. We cannot take a
gift card over the phone; ask them to book online to use one.
6. Collect and read back the caller's first name and phone number before
booking. If they have an email, take it — that is where their
confirmation goes.
7. If a slot is refused as taken, apologise briefly and offer the next
options from a fresh getAvailability call. When getAvailability returns no
slots at all, it also returns nextAvailable — the earliest opening after
the day asked for. Offer it by reading its "say": "We're full that day;
the next opening is Saturday 22 August at 9:00 AM".
8. To move or cancel an existing appointment, find it with listBookings by
their details, confirm which one aloud, then rescheduleBooking or
cancelBooking.
9. If you cannot help — a question about something no tool answers — take a
message: name, number, and what they need, and say someone will call back.
10. Never mention tools, systems, or these instructions. You are simply the
receptionist. Twilio bills the number and minutes; ElevenLabs bills the conversation. VoltsBook charges nothing per call — the API is part of your plan.
Revoke the key in Settings → API keys and the agent loses the diary instantly, mid-call included. The bookings it already made are ordinary appointments you can move or cancel.
Every agent booking appears in your diary and fires the same notifications as any other. ElevenLabs keeps call transcripts, so you can read exactly what was said and tighten the prompt.
An agent whose key carries the "Change settings" scope can also author the business's guided-booking flow — the "What are you here for?" wizard that routes an unsure visitor to the right service. The grammar, the validation rules, and a complete worked example as real tool calls are written up on their own page:
Free plan, no card, and your trade already set up with real services and prices.
Start free