Docs
Use CallAnswer with your AI agent
Everything CallAnswer does for you in the dashboard — see captured leads and transcripts, check the calendar, book or cancel an appointment, read or update business hours — your own AI agent can do too. There are three doors, all opened by one API key from Settings → Agent access: a remote MCP server for Claude, ChatGPT/Codex, Cursor, VS Code and any other MCP client; a REST API with an OpenAPI document; and the callanswer CLI. The agent acts as you, reaching only your business, and cannot send an SMS, place a call, or touch billing.
1. Get an API key
Sign in and open Settings → Agent access. Name the key after the thing that will use it (“Claude Code on my laptop”) and pick a scope: read for listing calls, appointments and hours; write to also book/cancel appointments and change hours. The key is shown once. Put it in an environment variable — every snippet below reads CALLANSWER_API_KEY — rather than pasting it into a config file that gets committed.
2. Claude Code, claude.ai and Claude Desktop
Claude Code, from a terminal (the key is sent as a header on every request):
claude mcp add --transport http callanswer https://callanswer.net/mcp \
--header "Authorization: Bearer $CALLANSWER_API_KEY"Or add it to a project's .mcp.json so the whole team gets it; Claude Code expands ${CALLANSWER_API_KEY} from the environment:
{
"mcpServers": {
"callanswer": {
"type": "http",
"url": "https://callanswer.net/mcp",
"headers": { "Authorization": "Bearer ${CALLANSWER_API_KEY}" }
}
}
}claude.ai and Claude Desktop: Customize → Connectors → Add custom connector. Name it CallAnswer, set the URL to https://callanswer.net/mcp, choose “No sign in”, and under Request headers add Authorization with the value Bearer <your key>. Claude will ask before running cancel_appointment.
3. Cursor and VS Code
Cursor — ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"callanswer": {
"url": "https://callanswer.net/mcp",
"headers": { "Authorization": "Bearer ${env:CALLANSWER_API_KEY}" }
}
}
}VS Code — .vscode/mcp.json; the input prompt keeps the key out of the file:
{
"servers": {
"callanswer": {
"type": "http",
"url": "https://callanswer.net/mcp",
"headers": { "Authorization": "Bearer ${input:callanswer-key}" }
}
},
"inputs": [{ "id": "callanswer-key", "type": "promptString", "password": true, "description": "CallAnswer API key" }]
}4. ChatGPT and Codex
Codex CLI and the ChatGPT desktop app share one MCP configuration:
[mcp_servers.callanswer]
url = "https://callanswer.net/mcp"
bearer_token_env_var = "CALLANSWER_API_KEY"ChatGPT's in-app custom connectors currently require OAuth or no authentication, and cannot send a fixed header. Until CallAnswer has an OAuth authorization server, use Codex or a direct API key with another client.
5. The CLI
Node 18 or newer. No install needed; npx fetches the callanswer package. It talks to the same API with the same key and the same limits, and prints tables for people or JSON for scripts:
# one-time: paste your key when prompted (stored in ~/.config/callanswer/config.json, mode 600)
npx callanswer login
npx callanswer whoami
npx callanswer calls list
npx callanswer calls get <id>
npx callanswer appointments list
npx callanswer appointments create <leadId> "2026-10-15T14:00:00-04:00"
npx callanswer appointments cancel <id> --yes # refuses without --yes
npx callanswer hours get
npx callanswer hours set hours.json --yes
# any command: --json for machine-readable output; CALLANSWER_API_KEY overrides the saved key6. The tools
What any MCP client sees from tools/list. “Read-only” and “destructive” are the server's own annotations; Claude and other clients use them to decide when to ask you first.
| Tool | Scope | Kind | What it does |
|---|---|---|---|
| whoami | read | read-only | The account and business this API key belongs to: email, business name, subscription plan and status, the key's own name and scopes, and the 10 most recent agent calls made with any of this account's keys. Call this first when unsure what the account can do. |
| list_calls | read | read-only | The business's calls -- a missed call becomes a lead with an AI SMS conversation, which is what this lists: lead name/phone, lead status, whether it is flagged hot, message count, the last message, and when it last updated. Optional `query` matches lead name or phone; `status` filters by lead status (NEW, CONTACTED, QUALIFIED, BOOKED, WON, LOST). Use get_call for the full transcript. |
| get_call | read | read-only | One call's full detail: the lead it came from, a short summary (lead status, message count, appointment count), the complete SMS transcript in order, and any appointments tied to that lead. 'id' comes from list_calls. |
| list_appointments | read | read-only | The business's appointments: lead name/phone, date, duration, status (SCHEDULED, CONFIRMED, COMPLETED, NO_SHOW, CANCELLED), service type and notes. Optional `status` filter. |
| create_appointment | write | writes | Book an appointment for an existing lead. This is a real state change on the business's calendar, so call it ONCE without `confirm` to see exactly what would be created, then call again with `confirm: true` to actually create it. `leadId` comes from list_calls/get_call. Does not send any SMS or notify the lead -- it only writes the appointment record. |
| cancel_appointment | write | destructive | Set an appointment's status to CANCELLED. DESTRUCTIVE: the slot is freed and the original time is not recoverable from this API. Call once WITHOUT `confirm` to get the appointment's details back for the user to approve, then call again with `confirm: true`. Does not notify the lead. |
| get_business_hours | read | read-only | The business's configured hours (object keyed monday..sunday; each value an { open, close } object, or absent/null for closed) and timezone. The AI uses these hours to decide whether a caller is 'after hours'. |
| update_business_hours | write | writes | Replace the business's hours configuration (object keyed monday..sunday; each value an { open, close } object or absent/null for closed). This changes how the AI answers 'are you open' and after-hours logic in real time, so call once WITHOUT `confirm` to see what would be set, then again with `confirm: true`. |
Try the endpoint by hand — initialize and tools/list need no key:
curl -s -X POST https://callanswer.net/mcp \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'7. REST API and OpenAPI
The MCP tools and the CLI are thin layers over /api/v1. The full description is at /openapi.json (OpenAPI 3.1), which any code generator or agent framework can read directly.
curl -s "https://callanswer.net/api/v1/calls?status=NEW&limit=10" \
-H "Authorization: Bearer $CALLANSWER_API_KEY"
curl -s -X POST https://callanswer.net/api/v1/appointments \
-H "Authorization: Bearer $CALLANSWER_API_KEY" -H "Content-Type: application/json" \
-d '{"leadId":"<id>","date":"2026-10-15T14:00:00-04:00","confirm":true}'Endpoints: GET /api/v1/me, GET /api/v1/calls?q=&status=, GET /api/v1/calls/{id}, GET|POST /api/v1/appointments, POST /api/v1/appointments/{id}/cancel, GET|PATCH /api/v1/business-hours.
8. Safety, limits and logging
- An API key acts as you. An agent reaches only your business — never another customer's.
- Nothing here can send an SMS, place a call, or touch billing.
create_appointment,cancel_appointmentandupdate_business_hoursall needconfirm: true; the first call only previews the change.cancel_appointmentis additionally destructive. The CLI needs--yes.- Rate limit: 300 agent calls per key per hour.
- Every authenticated call is logged (tool, key, outcome, duration) and shown back to you at
GET /api/v1/me/ thewhoamitool; rows are kept 30 days. - Keys are stored hashed. Revoke one in Settings and it stops working immediately. Deleting your account deletes its keys.
Questions
- Do I need a particular plan to use CallAnswer from an AI agent?
- No. API keys, the MCP server and the CLI are available on every plan (Essentials, Starter, Pro), and they reach exactly the one business your account owns — never anyone else's data.
- How do I get an API key?
- Sign in, open Settings, and under Agent access create a key with a name and a scope (read, or write). The full key is shown exactly once; copy it then. Keys are stored hashed, so a lost key cannot be recovered, only revoked. You can have up to 10 active keys, and every call made with a key is logged (whoami / GET /api/v1/me).
- What is the difference between a read key and a write key?
- A read key can list calls, read a call's transcript, list appointments and read business hours. A write key can also create and cancel appointments and update business hours. Give an agent the smallest scope its job needs.
- Can an agent book or cancel something by accident?
- create_appointment, cancel_appointment and update_business_hours are all state changes. The first call without confirm: true only returns a preview of what would happen; nothing is written until the agent calls it again with confirm: true. cancel_appointment is additionally marked destructive in its MCP annotations, so clients such as Claude ask you before running it.
- Can an agent send a text message, place a call, or change billing?
- No. Nothing in the MCP server, REST API or CLI can send an SMS, place a call, or touch billing — those stay session-only, on the website.
- Which MCP protocol versions does the server speak?
- Both the current stateless revision (2026-07-28, with server/discover) and the earlier handshake revisions clients still use today (2025-03-26, 2025-06-18, 2025-11-25). Transport is Streamable HTTP with plain JSON responses; the endpoint is POST https://callanswer.net/mcp. There are no sessions to manage.
Reviewed 2026-10-02. Protocol facts checked against modelcontextprotocol.io on that date.