Skip to main content

Account MCP Server

Give an AI agent 331 tools that act on your CallMissed account: draft, build and configure voice agents, set up call flows, menus and queues, place and review calls, run outbound calling campaigns end to end, work the inbox and the support desk, search and update the CRM with its pipelines, custom fields and lead scoring, send WhatsApp and email, sell from a WhatsApp catalog, generate images, connect and disconnect WhatsApp, Facebook, Instagram, integrations and knowledge sources, manage webhooks and managed prompts, version and roll back agents, run evals and A/B experiments, and check credits, over the Model Context Protocol. Connect by signing in with your CallMissed account, or with an API key.

Overview

The Account MCP server lets an AI agent take actions in your CallMissed account through the Model Context Protocol. Point any MCP client at one URL, sign in with your CallMissed account or pass an API key, and the agent gets 331 tools: draft, build and configure voice agents end to end, set up how inbound calls are answered with flows, menus and queues, place and inspect phone calls, read transcripts, build and run outbound calling campaigns, work the shared inbox and the support desk, search and update the CRM and set up its pipelines, custom fields and lead scoring, summarise and score calls, send WhatsApp messages, catalog products and Flow forms, send email, generate images, connect and disconnect WhatsApp, Facebook, Instagram, integrations and knowledge sources, wire up webhooks and managed prompts, version and roll back an agent, run evaluation suites and A/B experiments, and check what it all cost.

It is hosted, so there is nothing to install and nothing to run locally.

This is a different server from the Docs MCP Server. That one is a local npm package that makes this documentation searchable inside your editor and needs no credentials. This one is hosted, needs your account, and acts on your real data and credits.

Endpoint

https://api.callmissed.com/api/v1/mcp

The transport is Streamable HTTP: every call is a single POST that returns one JSON response. There is no session to open or close, so the server works behind any load balancer and needs no sticky routing. GET and DELETE return 405 by design, because this server does not offer a server-initiated event stream.

The server answers initialize, tools/list, tools/call, resources/list and resources/read, and declares the tools and resources capabilities.

Connect

Two ways in. Both reach the same tools; they differ in how the connection is authorised and how much you have to set up.

Option 1: sign in with your CallMissed account

The easy path, and the recommended one. Paste the server URL into your client, click Connect, sign in to CallMissed, and tick what the connection is allowed to do. There is no key to create and nothing to paste into a header.

https://api.callmissed.com/api/v1/mcp

Paste that URL exactly as written, path included. Discovery is bound to the URL you type, so a shortened or altered one is not recognised as this server and sign-in never starts.

If your client cannot complete the sign-in, use an API key instead (option 2 below).

Choose what to allow

The consent screen offers five permission groups.

GroupWhat it allowsOn by defaultCan spend credits
Read your dataSee your calls, contacts, companies, deals, tasks, notes, conversations, agents and usage, plus how your CRM and support desk are set up: pipelines, custom fields, saved views, lead scores, tickets, SLA policies, macros, routing rules and satisfaction scores. Cannot change anything. Searching your knowledge base costs a small amount to read the question.YesYes
Read call transcriptsRead what was said on your voice calls, and what each one cost. This also lets the connection use AI models on your account, which spends credits.NoYes
Take actionsCreate and update records, send WhatsApp messages and email — including catalog products, order updates and Flow forms — place and end calls, rent phone numbers, and generate images. It can also build outbound calling campaigns and start them, which dials everyone on the list, change how your CRM and support desk are set up — pipelines, custom fields, lead scoring, tickets, SLA policies, macros and routing — and open satisfaction surveys. Spends credits, and a rented number is a recurring charge.NoYes
Set up and change your agentsCreate agents and change their instructions, voice, tools and knowledge, draft a new agent from a description, give them custom tools that call your own URLs, change how a team of agents hands callers between them, and run test suites and A/B experiments against them. Cannot send messages or place calls. Indexing a knowledge source, drafting an agent and running a test suite spend credits.NoYes
Configure your workspaceSet up where your events are delivered and when you are alerted, connect an external service or a WhatsApp, Facebook or Instagram account by handing you a link to approve, choose which agent answers each connected number or account, disconnect them, create, edit or delete WhatsApp message templates, and manage the prompts the API resolves by name. Cannot read or write the credentials of a connected service. Publishing a prompt or pinning a model to one changes what your own API calls do and what they cost.NoYes

Read your data is the only group ticked when the screen opens. The other four start off and are granted only if you tick them yourself, so a single click cannot hand an agent the ability to message a customer or spend credits.

Building an agent is its own tick rather than part of Take actions: letting an assistant send a WhatsApp message should not also let it rewrite the instructions, voice and tools of the agent answering your phone. Running an eval suite or an A/B experiment sits on that same tick, because it is work done on the agents it already governs.

At least one group has to be ticked. Approving nothing would create a connection that fails every call, so the consent screen asks you to choose something or press Deny.

Against the tool tables further down: Read your data covers every :read scope, including the campaign, CRM-setup, support-desk, commerce, prompt and eval reads; Read call transcripts grants the stt, tts and llm permissions the three voice-session tools need; Take actions covers the record, CRM-setup, support-desk, messaging, commerce, telephony and campaign :write scopes plus whatsapp:send and the image and email permissions; Set up and change your agents covers bots:write, knowledge:write, squads:write, evals:write and experiments:write; and Configure your workspace covers webhooks:write, integrations:write, prompts:write and whatsapp:write.

The connection appears as an API key

Approving creates an API key on your account named MCP connection: {host}, where the host is the one shown on the consent screen as the client that asked. You will find it at Developer → API keys in the console next to your other keys, carrying exactly the scopes you ticked, with the same budget, rate limit and credit accounting as any key you make by hand. Request logging is off for it.

Its value is never shown and cannot be revealed or copied out, so it can only ever be used by the connection it was made for.

To disconnect, deactivate that key. That is the whole revocation story: once the key is inactive, every token issued to that connection stops working immediately.

Staying connected

The access token your client receives is short-lived and your client renews it in the background using the refresh token issued alongside it. You are not asked to sign in again each time you use the tools. You will be asked again if you deny, if the key is deactivated, if you want to change what is allowed, or after the connection has gone unused for a long stretch.

Discovery endpoints

A client finds the flow from the URL you paste, by fetching these:

EndpointWhat it is for
GET /.well-known/oauth-protected-resourceProtected-resource metadata (RFC 9728): the MCP resource URL, the authorization server, and the scopes this server understands.
GET /.well-known/oauth-protected-resource/api/v1/mcpThe same document at the path-suffixed address, which is what a client derives from the full server URL. Both forms are published so discovery works either way.
GET /.well-known/oauth-authorization-serverAuthorization-server metadata (RFC 8414): the authorization and token endpoints, the supported grant types, and the PKCE methods.

The flow itself is a standard OAuth 2.1 authorization code exchange:

EndpointMethod
https://api.callmissed.com/api/v1/mcp/oauth/authorizeGET
https://api.callmissed.com/api/v1/mcp/oauth/tokenPOST, form-encoded

Two things to know if you are writing the client yourself:

  • PKCE with S256 is required. There is no client secret, so a request without code_challenge_method=S256 is refused.
  • client_credentials is not supported. The only grant types are authorization_code and refresh_token, because every connection needs a person to approve it on the consent screen.

There is no registration step. client_id is an https:// URL that identifies your client, and the consent screen shows its host as plain text so the person approving can see who is asking.

Redirect addresses are limited to ones CallMissed has approved, plus loopback addresses for native apps. Any other redirect_uri is refused with a 400 before the consent screen is ever shown, so nothing is redirected to an address we have not vetted.

Option 2: connect with an API key

For clients that do not do the sign-in flow, and for calling the endpoint yourself, pass an API key from your dashboard exactly as you would for any other CallMissed endpoint:

Authorization: Bearer cm_your_api_key

A dashboard login token is refused with 401, even though it works elsewhere in the API. Scope checks are what keep an agent inside its lane, and those apply to keys, so this endpoint takes an API key or a token from the sign-in flow above and nothing else.

Everything attached to the key still applies: its scopes, its spend budget, its rate limit, and its domain allowlist. A key that runs out of budget gets 402; one over its rate limit gets 429.

What a connection needs

Two different gates decide whether a tool works, whether the connection came from signing in or from a key you made by hand:

  • Resource scopes such as contacts:read or whatsapp:send. Most tools use these, and the table below names the one each tool needs. A tool whose scope is missing returns a readable refusal naming the scope to add, so the agent can tell you what to fix.
  • Service permissions on the key. The three voice-session tools need a key with the stt, tts and llm permissions; the two image tools need the image permission. get_credit_balance needs nothing beyond a valid key.

Give each key only what its agent needs. A read-only key is a perfectly good way to let an agent look at the account without letting it spend anything or reach a real person.

Twenty-five tools spend credits and several of them reach real people. start_campaign reaches the most: it dials every person on the campaign's list. They are marked in the tables below. For an agent that should look but not act, tick only Read your data when you sign in, or use a key holding only the read scopes.

Tools

331 tools in sixteen groups. Access is the tool's own readOnlyHint. Credits marks the tools that draw down your balance. Every tool's full JSON Schema, including argument names, types and bounds, comes back from tools/list.

Voice and calls

ToolWhat it doesAccessScope or permissionCredits
place_callPlace an outbound call from one of your numbers, answered by one of your voice agentsWritetelephony:writeYes
list_callsList calls, newest first, with status, duration and costReadtelephony:readNo
get_callFetch one call by id, with hangup cause and costReadtelephony:readNo
end_callHang up a call that is still in progress. Immediate and not undoableWrite, destructivetelephony:writeNo
get_call_recordingGet a short-lived download link for a call's recordingReadtelephony:readNo
click_to_callRing one of your people, dial the contact, and bridge the two. No AI agent involvedWritetelephony:writeYes
list_phone_numbersList your numbers and their status, to find the from_number_id place_call takesReadtelephony:readNo
search_available_numbersSearch the numbers you could rent, with monthly price and whether each takes calls. Buys nothingReadtelephony:readNo
provision_phone_numberRent a number. It is bought immediately and renews monthly until released; needs an approved compliance applicationWritetelephony:writeYes
attach_number_to_agentPoint one of your numbers at an agent, so calls to it are answered by that agent. Pass bot_id: null to detachWritetelephony:writeNo
list_voice_sessionsList voice agent sessions, newest firstReadstt + tts + llm permissionsNo
get_voice_session_transcriptGet a session's full turn-by-turn transcriptReadstt + tts + llm permissionsNo
get_voice_session_costBreak down what one voice session cost in creditsReadstt + tts + llm permissionsNo

Call handling

How an inbound call is answered: the flow it walks, the menu it hears, the queue it waits in, the message left on a machine, and whether the number has been flagged as spam. This is the whole console setup journey, available to an agent.

ToolWhat it doesAccessScope or permissionCredits
list_call_flowsList call flows with each one's shape and whether it is live. Returns no graphsReadtelephony:readNo
get_call_flowOne flow with its full draft graph; the live snapshot is summarised, not repeatedReadtelephony:readNo
create_call_flowCreate a flow. It answers nothing until published and attached to a numberWritetelephony:writeNo
update_call_flowChange the draft. Sending graph replaces the whole graphWritetelephony:writeNo
publish_call_flowMake the draft the version that answers real calls, from the next call onWrite, destructivetelephony:writeNo
attach_number_to_flowAnswer one of your numbers with this flow. detach: true undoes it. Not yet available — returns 409 while inbound flow execution is being wiredWritetelephony:writeNo
simulate_call_flowDry-run one step and see the instruction a real call would get. Webhook steps are not calledReadtelephony:readNo
list_call_menusList press-1-for-sales menus with their prompt and key mapReadtelephony:readNo
get_call_menuOne menu with its prompt, key map and retry settingsReadtelephony:readNo
create_call_menuCreate a menu: what the caller hears and where each key sends themWritetelephony:writeNo
update_call_menuChange a menu. Sending options replaces the whole key mapWritetelephony:writeNo
attach_number_to_menuAnswer one of your numbers with this menu. detach: true undoes it. Not yet available — returns 409 while inbound menu execution is being wiredWritetelephony:writeNo
list_call_queuesList queues: how callers are held and in what order they are servedReadtelephony:readNo
get_call_queueOne queue with its serving order, hold settings and overflow behaviourReadtelephony:readNo
create_call_queueCreate a queue that holds callers until a roster member is freeWritetelephony:writeNo
update_call_queueChange serving order, hold audio, waiting limit or overflow behaviourWritetelephony:writeNo
list_queue_membersWho answers for a queue, with priority, capacity and how busy each isReadtelephony:readNo
add_queue_memberPut an agent (bot_id) or a person (user_id) on a queue's rosterWritetelephony:writeNo
remove_queue_memberTake an answerer off the roster. They stop receiving calls immediatelyWrite, destructivetelephony:writeNo
attach_number_to_queueSend one of your numbers through this queue. detach: true undoes itWritetelephony:writeNo
get_queue_liveWho is holding right now, how long, and how much of the roster is free. Callers show as last four digits onlyReadtelephony:readNo
list_voicemail_templatesThe messages your calls leave on a machine, and whether each is ready to playReadtelephony:readNo
get_voicemail_templateOne voicemail message with its words, voice and stateReadtelephony:readNo
create_voicemail_templateWrite the message a call should leave when a machine answersWritetelephony:writeNo
update_voicemail_templateChange a message. New words throw away the recording made from the old onesWritetelephony:writeNo
get_number_reputationWhether one of your numbers is flagged as spam, and the complaints still open against itReadtelephony:readNo

Deleting a flow, menu, queue or voicemail message is not an MCP tool: an assistant should not be able to remove a routing object that live numbers still point at. Take one out of service reversibly instead — enabled: false on a menu or queue, or detach the number. Clearing a spam complaint needs a proof document and stays in the dashboard.

More voice and calls tools

ToolWhat it doesAccessScope or permissionCredits
get_voice_sessionGet one voice agent session's status, timing and post-call analysis (summary, outcome, sentiment) once it existsReadstt + tts + llm permissionsNo
update_number_call_settingsSet a number's call settingsWritetelephony:writeNo
declare_number_for_ai_callsRecord that a number has been declared to your telecom provider for automated/AI calls (India TRAI). Records a declaration already made; does not file oneWritetelephony:writeNo
list_telephony_complianceList this account's phone-number KYC applications and whether each is approved, pending or rejected (with the reason)Readtelephony:readNo
unpublish_call_flowStop answering live calls with this flow; numbers on it answer normally againWritetelephony:writeNo
update_queue_memberChange a queue member's priority, concurrent-call limit, or enabled flagWritetelephony:writeNo

Calling campaigns

An outbound campaign is a list of people, a voice agent and the rules for when and how fast to dial. Build it as a draft, load the list, then start it. The account-wide do-not-call list lives here too.

ToolWhat it doesAccessScope or permissionCredits
list_campaignsList campaigns, newest first, with status and contact countsReadcampaigns:readNo
get_campaignFetch one campaign: status, schedule, calling hours, dial modeReadcampaigns:readNo
create_campaignCreate a campaign. It starts as a draft and calls nobodyWritecampaigns:writeNo
update_campaignChange name, schedule, calling number, calling hours, dial mode or DLT registration fieldsWritecampaigns:writeNo
add_campaign_contactsAdd up to 1000 people to the calling list. Adding calls nobodyWritecampaigns:writeNo
list_campaign_contactsThe per-person result: waiting, calling, done or failed, with attempts and last errorReadcampaigns:readNo
get_campaign_live_stateWhat the campaign is doing right now, and in preview mode who is awaiting a go-aheadReadcampaigns:readNo
get_campaign_trai_readinessWhat stops the campaign meeting India's TRAI rules for AI calls, and whether the account enforces themReadcampaigns:readNo
start_campaignStarts calling. Real calls to every person on the listWrite, destructivecampaigns:writeYes
pause_campaignStop placing new calls. Can be started again laterWritecampaigns:writeNo
stop_campaignCancel the campaign for good. Cannot be started againWrite, destructivecampaigns:writeNo
list_do_not_callList the numbers suppressed from all calling on this accountReadcampaigns:readNo
add_do_not_callSuppress numbers so no call is ever placed to them againWritecampaigns:writeNo

Taking a number back off the do-not-call list is deliberately not a tool. Adding one is safe in the direction that matters — the worst case is a call that does not happen — but removing one un-does somebody's opt-out, and the next thing that happens is a call to a person who asked not to be called. That stays with a person in the console. The DELETE /dnc/{entry_id} endpoint is still there for your own code; see the Campaigns API.

Uploading a CSV to a campaign is not a tool either: it is a file upload, and MCP arguments are JSON. Use add_campaign_contacts for a list the agent already holds, or the Campaigns API for a file.

Conversations

ToolWhat it doesAccessScope or permissionCredits
list_conversationsList conversations across channels with a preview and unread countReadconversations:readNo
get_conversation_messagesRead the messages in one conversation, oldest firstReadconversations:readNo
set_conversation_statusChange a conversation's status, for example to close or escalate itWriteconversations:writeNo
assign_conversationGive a conversation to a teammate by id or email, or unassign itWriteconversations:writeNo
set_conversation_labelsReplace a conversation's labels (short tags such as refund or vip)Writeconversations:writeNo
add_conversation_noteWrite an internal note on the contact behind a conversation. Never sent to the customerWritecrm_notes:writeNo
list_handoffsList conversations escalated to a person and still waitingReadconversations:readNo
resolve_handoffMark an escalated conversation handled, optionally keeping the AI quietWriteconversations:writeNo

More conversations tools

ToolWhat it doesAccessScope or permissionCredits
get_conversationGet one conversation's details: channel, status, contact, agent and unread countReadconversations:readNo
mark_conversation_readClear a conversation's unread count, as opening it in the inbox doesWriteconversations:writeNo
assign_handoffAssign a waiting handoff to a teammate, or pass assignee_id null to unassign itWriteconversations:writeNo
callback_handoffFor a voice handoff, phone your operator number and then the customer and bridge them (two real, billed calls)Writeconversations:writeYes

CRM

ToolWhat it doesAccessScope or permissionCredits
crm_searchSearch contacts, companies, deals, notes and tasks in one callReadcrm_search:readNo
crm_timelineOne contact's or company's full history: conversations, calls, notes, tasks, dealsReadcrm_timeline:readNo
list_contactsList contacts with their per-channel opt-in stateReadcontacts:readNo
create_contactAdd a person to the CRM. Needs at least a phone or an emailWritecontacts:writeNo
update_contactChange fields on an existing contactWritecontacts:writeNo
get_contact_memoryGet the facts your agents have learned about one contactReadcontacts:readNo
create_dealOpen a deal in a pipelineWritecrm_deals:writeNo
move_dealMove a deal to another stage of its own pipelineWritecrm_deals:writeNo
create_taskAdd a follow-up task, optionally attached to a recordWritecrm_tasks:writeNo
complete_taskMark a task doneWritecrm_tasks:writeNo
create_crm_noteAttach a note to a contact, company or dealWritecrm_notes:writeNo
list_companiesList companies, optionally matching a name or domainReadcompanies:readNo
create_companyAdd a company. A domain has to be unique on the accountWritecompanies:writeNo
update_companyChange fields on an existing companyWritecompanies:writeNo

Pipelines and stages

The board a deal moves across. Pipelines and stages share the deal scopes, because a stage is only meaningful as part of the pipeline it belongs to.

ToolWhat it doesAccessScope or permissionCredits
list_pipelinesList the sales pipelines, the default one firstReadcrm_deals:readNo
create_pipelineAdd a pipeline. It starts with no stagesWritecrm_deals:writeNo
update_pipelineRename a pipeline, or make it the defaultWritecrm_deals:writeNo
list_pipeline_stagesList one pipeline's stages in board orderReadcrm_deals:readNo
create_pipeline_stageAdd a column, with its win probability and won/lost meaningWritecrm_deals:writeNo
update_pipeline_stageRename a stage, move it, or change what it meansWritecrm_deals:writeNo
reorder_pipeline_stagesRewrite the whole column order. Must name every stage exactly onceWritecrm_deals:writeNo

Custom fields

ToolWhat it doesAccessScope or permissionCredits
list_custom_fieldsList the custom fields defined on contacts, companies and deals, with each one's typeReadcrm_custom_fields:readNo
create_custom_fieldDefine a typed field: text, number, date, boolean or selectWritecrm_custom_fields:writeNo
update_custom_fieldRename, reorder, re-option or (un)require a field. Its key and type never changeWritecrm_custom_fields:writeNo
list_custom_field_valuesRead every custom value on one recordReadcrm_custom_fields:readNo
set_custom_field_valueSet one field on one record. The value has to match the field's typeWritecrm_custom_fields:writeNo
clear_custom_field_valueUnset one field on one record. The stored value is goneWrite, destructivecrm_custom_fields:writeNo

Deleting a custom field definition is not on this surface: the delete cascades to every value stored against it, on every record. Do that in the console.

Saved views

ToolWhat it doesAccessScope or permissionCredits
list_saved_viewsList the saved filtered lists you can see: shared ones plus your ownReadcrm_views:readNo
create_saved_viewSave a named filter, sort and column preset over a CRM listWritecrm_views:writeNo

Lead scoring

ToolWhat it doesAccessScope or permissionCredits
list_lead_score_rulesList the rules that award points, oldest firstReadcrm_scores:readNo
create_lead_score_ruleAdd a rule over one of the allowed signalsWritecrm_scores:writeNo
update_lead_score_ruleChange a rule's signal, comparison, points or enabled stateWritecrm_scores:writeNo
recompute_lead_scoresRescore up to 200 contacts or companies. All or nothingWritecrm_scores:writeNo
list_lead_scoresThe leaderboard: scored records, highest firstReadcrm_scores:readNo
get_lead_scoreOne record's score with the breakdown of which rules firedReadcrm_scores:readNo

A new or changed rule does not move any score until recompute_lead_scores runs. The signals a rule may test are a closed list, documented on Lead scoring.

More cRM tools

ToolWhat it doesAccessScope or permissionCredits
get_contactGet one contact's full record by idReadcontacts:readNo
list_dealsList deals, newest first, filtered by pipeline, stage, status, owner, contact or companyReadcrm_deals:readNo
get_dealGet one deal by idReadcrm_deals:readNo
update_dealChange a deal's title, value, links, owner, close date, stage or open/won/lost statusWritecrm_deals:writeNo
list_tasksList CRM tasks, filtered by status, assignee, attached record, overdue or due windowReadcrm_tasks:readNo
update_taskEdit a task's title, description, due date, assignee, attached record or statusWritecrm_tasks:writeNo
list_crm_notesList the notes on one contact, company or deal, newest firstReadcrm_notes:readNo
update_crm_noteReplace the text of a noteWritecrm_notes:writeNo
list_crm_duplicatesFind groups of contacts or companies that look like the same recordReadcrm_search:readNo
merge_crm_duplicatesIrreversibly fold duplicates into a primary record: their linked records move to it and the duplicates are deletedWritecrm_search:writeNo
update_saved_viewRename a saved view or change its filters, sort, columns, layout or sharing; the list it belongs to cannot changeWritecrm_views:writeNo
get_companyGet one company's record by idReadcompanies:readNo

Support desk

ToolWhat it doesAccessScope or permissionCredits
list_ticketsList tickets by status, priority, assignee, contact, conversation or subjectReadsupport_tickets:readNo
get_ticketFetch one ticket with its lifecycle timestampsReadsupport_tickets:readNo
create_ticketOpen a ticket, optionally linked to a conversation or contactWritesupport_tickets:writeNo
update_ticketChange subject, description, priority, links or tagsWritesupport_tickets:writeNo
set_ticket_statusMove a ticket through its lifecycle, keeping the SLA clocks honestWritesupport_tickets:writeNo
assign_ticketHand a ticket to a teammate, or send it back to the queueWritesupport_tickets:writeNo

Deleting a ticket is not on this surface — it would destroy the record of a customer interaction and every SLA number computed from it. Close it instead.

SLA

ToolWhat it doesAccessScope or permissionCredits
list_sla_policiesList the first-response and resolution targets the desk promisesReadsla:readNo
create_sla_policyPromise a first-response time, a resolution time, or both, with business hoursWritesla:writeNo
update_sla_policyChange a policy's targets, priority, hours or enabled stateWritesla:writeNo
get_ticket_sla_statusWhere one ticket stands: due times, what is missed, minutes leftReadsla:readNo
list_sla_breachesTickets already past a deadline, oldest firstReadsla:readNo

Macros, tags and routing

ToolWhat it doesAccessScope or permissionCredits
list_support_macrosList canned replies, most-used firstReadsupport_ops:readNo
create_support_macroSave a canned reply, with {{placeholders}} and optional actionsWritesupport_ops:writeNo
update_support_macroChange a macro's text, actions, category or enabled stateWritesupport_ops:writeNo
use_support_macroFill a macro's placeholders and get the finished text. Sends nothingWritesupport_ops:writeNo
list_support_tagsList the tag vocabulary with colours and descriptionsReadsupport_ops:readNo
create_support_tagAdd a tag to the vocabularyWritesupport_ops:writeNo
list_ticket_routing_rulesList the triage rules in evaluation orderReadsupport_ops:readNo
create_ticket_routing_ruleAdd a triage rule that assigns, prioritises and tags a matchWritesupport_ops:writeNo
update_ticket_routing_ruleChange a rule's conditions, actions, position or enabled stateWritesupport_ops:writeNo
reorder_ticket_routing_rulesRewrite the evaluation order. Must name every rule exactly onceWritesupport_ops:writeNo
preview_ticket_routingDry run: which rule would match a ticket, and what it would do. Writes nothingReadsupport_ops:readNo

Macros and rules are retired with is_active: false rather than deleted, so nothing that a past ticket refers to disappears.

Satisfaction

ToolWhat it doesAccessScope or permissionCredits
create_csat_surveyMint a survey and its public response link. Does not send itWritecsat:writeNo
list_csat_surveysList surveys, optionally only answered or only still-open onesReadcsat:readNo
get_csat_statsResponse rate, average rating and NPS over a window of up to a yearReadcsat:readNo

create_csat_survey returns a token; the link you send is that token on the public response page. Delivering it over WhatsApp or email is a separate call, and that send is what costs credits.

More support desk tools

ToolWhat it doesAccessScope or permissionCredits
update_support_tagRename a support tag or change its color or descriptionWritesupport_ops:writeNo

Call intelligence

ToolWhat it doesAccessScope or permissionCredits
get_call_notesGet the notes already generated for a call: summary, action items, outcomeReadconversations:readNo
generate_call_notesRead a call's transcript and write structured notes from itWriteconversations:writeYes
score_callGrade a call against one of your scorecards and store the resultWriteconversations:writeYes

Messaging

ToolWhat it doesAccessScope or permissionCredits
send_whatsapp_messageSend a free-form WhatsApp text, inside the 24-hour service window onlyWritewhatsapp:sendYes
send_whatsapp_templateSend an approved template, the only way to reach someone outside that windowWritewhatsapp:sendYes
send_whatsapp_buttonsSend a message with up to three tap-to-reply buttons, inside the 24-hour windowWritewhatsapp:sendYes
send_whatsapp_mediaSend an image, video, audio clip, document or sticker from a public https link or an uploaded media id, inside the 24-hour windowWritewhatsapp:sendYes
list_whatsapp_templatesYour templates with review status in plain words, rejection reason and qualityReadwhatsapp:readNo
review_whatsapp_templateWhatsApp's template rules, the practices that keep your account from being restricted (opt-in, opt-outs, the 24-hour window, quality rating), and a scored review of a draft: errors, warnings and tips. Call it before creating or editing a templateReadwhatsapp:readNo
create_whatsapp_templateCreate a template (or copy a library template by name) and submit it for review. A draft that breaks WhatsApp's template rules is refused with the list of problems; remaining warnings come back as policy_warningsWritewhatsapp:writeNo
edit_whatsapp_templateReplace an approved, rejected or paused template's content and resubmit it, with the same rules check as createWritewhatsapp:writeNo
delete_whatsapp_templatePermanently delete a template in every languageWritewhatsapp:writeNo
get_whatsapp_business_verificationWhether the business behind your WhatsApp account is verifiedReadwhatsapp:readNo
list_whatsapp_campaignsList broadcast campaigns with status and recipient countsReadwhatsapp:readNo
send_emailSend an email from a domain this account has verifiedWriteemail permissionYes
send_whatsapp_productSend one product from a WhatsApp catalog so the recipient can add it to a cart in the chatWritewa_commerce:writeYes
send_whatsapp_product_listSend up to 30 products grouped into titled sections, as one browsable messageWritewa_commerce:writeYes
send_whatsapp_catalogSend the whole catalog attached to a business number, fronted by one product as the coverWritewa_commerce:writeYes
list_whatsapp_ordersList the carts customers sent from your catalog, with status, currency and subtotalReadwa_commerce:readNo
get_whatsapp_orderOne cart order with every line item: SKU, quantity and unit priceReadwa_commerce:readNo
update_whatsapp_order_statusAdvance a stored order and tell the customer in the same step. completed and canceled are finalWritewa_commerce:writeYes
list_whatsapp_flowsList your WhatsApp Flows with status and categories. The design document is left outReadwa_flows:readNo
send_whatsapp_flowSend a Flow — a form filled in without leaving the chat — and get the token that identifies the replyWritewa_flows:writeYes
list_whatsapp_flow_responsesThe Flow forms customers submitted, with the answers they gaveReadwa_flows:readNo
publish_whatsapp_flowPublish a draft Flow. One-way: the design is then frozen and changing it means a new FlowWritewa_flows:writeNo

More messaging tools

ToolWhat it doesAccessScope or permissionCredits
list_whatsapp_numbersList your connected WhatsApp Business numbers with their status, quality rating and linked agentReadwhatsapp:readNo
refresh_whatsapp_numberRe-read a number's status, name and quality rating from WhatsAppWritewhatsapp:writeNo
link_whatsapp_number_to_agentChoose which agent auto-replies on a WhatsApp number; null unlinks itWritewhatsapp:writeNo
set_whatsapp_autoreplyTurn the linked agent's automatic replies on or off for one numberWritewhatsapp:writeNo
get_whatsapp_business_profileRead the public business profile customers see on a numberReadwhatsapp:readNo
update_whatsapp_business_profileChange the text fields of a number's public business profileWritewhatsapp:writeNo
search_whatsapp_template_librarySearch WhatsApp's pre-written utility templates, which can be created by name with create_whatsapp_templateReadwhatsapp:readNo
sync_whatsapp_templatesPull the latest templates and review statuses from WhatsAppWritewhatsapp:writeNo
draft_whatsapp_templateWrite a template draft from a plain-language intent, with notes on review-rejection risksWritewhatsapp:writeYes
create_whatsapp_campaignCreate a broadcast campaign draft for an approved templateWritewhatsapp:writeNo
get_whatsapp_campaignRead one campaign with its status and delivery countsReadwhatsapp:readNo
add_whatsapp_campaign_recipientsAdd recipients, each with optional template variables, to a campaign that has not launchedWritewhatsapp:writeNo
launch_whatsapp_campaignStart sending a campaign to all its recipientsWritewhatsapp:writeYes
cancel_whatsapp_campaignStop a campaign; messages already sent are not recalledWritewhatsapp:writeNo
get_whatsapp_analyticsRead WhatsApp messaging analytics: the delivery funnel, a daily time series, or credits spentReadwhatsapp:readNo
list_whatsapp_webhook_eventsList the most recent events WhatsApp delivered to your numbers, for debuggingReadwhatsapp:readNo
list_whatsapp_callsList WhatsApp voice calls, newest firstReadwhatsapp:readNo
get_whatsapp_call_settingsRead whether calling is on for a number, its call hours and callback settingsReadwhatsapp:readNo
update_whatsapp_call_settingsTurn calling on or off for a number and set its call hours, call icon and callback permissionWritewhatsapp:writeNo
request_whatsapp_call_permissionSend a customer WhatsApp's call-permission prompt; you can only call them after they acceptWritewhatsapp:sendNo
place_whatsapp_callCall a customer on WhatsApp; the number's linked agent does the talkingWritewhatsapp:sendYes
end_whatsapp_callHang up a live WhatsApp callWritewhatsapp:sendNo

Images

ToolWhat it doesAccessScope or permissionCredits
generate_imageGenerate an image from a prompt. model picks which image model draws it — its enum lists each model's strength. Returns the image itself, so the model can see it, plus a link to the full-size versionWriteimage permissionYes
list_generated_imagesList images made with this key, with fresh short-lived linksReadimage permissionNo

Agents and knowledge

ToolWhat it doesAccessScope or permissionCredits
list_agentsList the voice and chat agents on the account, to find a bot_idReadbots:readNo
get_agentFetch one agent's configuration by idReadbots:readNo
craft_agent_promptEverything needed to write a strong voice-agent prompt — the four-section structure and limits, the rules that make a prompt work on a phone call, the agent's current prompt, enabled tools and declared {{variables}} — plus a scored review of your draft. Free, writes nothingReadbots:readNo
get_agent_promptAn agent's instructions split into the four boxes its owner edits: objective, response guidelines, conversation script and first messageReadbots:readNo
list_voice_tiersThe voice tiers a calling agent can run on: the voice_tier id, what it sounds like, what a minute costs in credits, and the voices you may pick from. Read before creating or reconfiguring a calling agentReadbots:readNo
get_agent_config_schemaEvery configuration key an agent accepts, with allowed values, defaults, what happens when a key is omitted, and a minimal working exampleReadbots:readNo
validate_agent_configCheck a config you assembled and get one finding per problem. Writes nothingReadbots:readNo
list_agent_tool_catalogThe agent-tool names that go in the config's tools list, with what each does and the channels it cannot run onReadbots:readNo
list_agent_skillsThe skill names that go in the config's skills list, with the tools each bundles and a preview of the instructions it injects. Chat channels onlyReadbots:readNo
create_agentCreate a voice or WhatsApp agent. Active immediatelyWritebots:writeNo
update_agentRename an agent, or replace its instructions with one flat blockWritebots:writeNo
update_agent_promptChange the instructions section by section, so the objective / guidelines / script structure survives the writeWritebots:writeNo
update_agent_configChange configuration keys in place — set some, remove others, leave the rest aloneWritebots:writeNo
toggle_agentFlip an agent between active and pausedWritebots:writeNo
add_agent_knowledgeAdd a document to one agent's knowledge baseWriteknowledge:writeNo
knowledge_searchSearch the knowledge base and get the passages that matchReadknowledge:readNo
add_agent_memoryStore a durable fact for one agent, applied on every future conversationWritebots:writeNo
list_agent_custom_toolsList the custom HTTP tools this account has defined. Stored credentials are never returnedReadbots:readNo
create_agent_custom_toolDefine an HTTP endpoint an agent may call mid-conversationWritebots:writeNo
update_agent_custom_toolChange a custom HTTP tool. Omitted fields, including secrets, are keptWritebots:writeNo
test_agent_custom_toolRun a saved custom tool once. This really calls the endpoint with its stored credentialsWritebots:writeNo
delete_agent_custom_toolPermanently delete a custom tool and its stored credentials, for every agent that uses itWritebots:writeNo
set_agent_voicemail_dropMake a calling agent leave a saved voicemail message when a machine answersWritebots:writeNo
draft_agent_from_descriptionDescribe the agent you want and get a complete, reviewable draft back. Creates nothingWritesquads:writeYes

Building an agent with these tools

create_agent is not the first call. An agent's config is a free-form object whose keys are mostly not checked when written — a wrong value is stored and then fails on the call, usually without an error. So the order is:

  1. get_agent_config_schema — the keys this agent type accepts, and a minimal_example that works. draft_agent_from_description is the shortcut past the blank page: describe the agent and review what comes back. It creates nothing, so whatever it proposes still goes through the steps below.
  2. validate_agent_config — fix every error finding before writing anything.
  3. create_agent, then add_agent_knowledge.
  4. For a voice agent: search_available_numbers → provision_phone_number → attach_number_to_agent, then place_call and get_voice_session_transcript to hear the result.
  5. update_agent_config to change one key later; it merges, so it cannot wipe the rest of the configuration.
  6. craft_agent_prompt → update_agent_prompt to write or improve the instructions. craft_agent_prompt returns the structure, the phone-call rules and the agent's real tools and variables; write the four sections, pass them back as draft until the review has no error findings, then save. An agent's prompt is edited in four boxes — objective, response guidelines, conversation script and first message — and update_agent's flat system_prompt collapses them into one, silently. The pair above is what keeps them.

The same flow over plain HTTP, with curl for every step and the five ways a config silently misbehaves, is on Build an Agent.

More agents and knowledge tools

ToolWhat it doesAccessScope or permissionCredits
list_knowledge_sourcesList the documents, URLs and facts in this account's knowledge base, optionally for one agent, with their ingest statusReadknowledge:readNo
add_agent_knowledge_urlFetch a public web page and add its text to one agent's knowledge baseWriteknowledge:writeYes
list_agent_memoriesList the durable facts one agent has been taught, newest firstReadbots:readNo
list_agent_squadsList squads: groups of agents that hand a caller to one another by roleReadsquads:readNo
get_agent_squadFetch a squad with its handoff policy and full member rosterReadsquads:readNo
create_agent_squadCreate a squad whose entry agent answers the call; the entry agent is enrolled as its first memberWritesquads:writeNo
update_agent_squadChange a squad's name, description, entry agent (must already be a member), handoff policy, or active flagWritesquads:writeNo
add_squad_memberPut an agent on a squad's roster under a role; its description is what routing matches callers againstWritesquads:writeNo
update_squad_memberChange a squad member's role, description or positionWritesquads:writeNo
remove_squad_memberTake a member off a squad's roster; the entry agent cannot be removedWritesquads:writeNo
simulate_squad_handoffDry-run a squad's routing: given what a caller said, which member would take the call and whyReadsquads:readNo

Usage and credits

ToolWhat it doesAccessScope or permissionCredits
get_credit_balanceCheck how many credits are left on the accountReadAny valid keyNo
get_usage_summarySummarise recent spend, broken down by serviceReadusage:readNo

Platform configuration

Webhooks, integrations, managed prompts and agent versions. Every webhook tool — including the two that only read — needs webhooks:write, because a delivery row carries customer conversation data and there is no webhooks:read scope to grant.

ToolWhat it doesAccessScope or permissionCredits
list_webhooksList webhook subscriptions with the events each receives. Signing secrets come back maskedReadwebhooks:writeNo
create_webhookSubscribe an HTTPS endpoint to account events. Returns the signing secret in full, onceWritewebhooks:writeNo
update_webhookChange a subscription's URL, events, agent scope or active flag. is_active: false pauses itWritewebhooks:writeNo
test_webhookSend a real signed POST to the configured endpoint and report its status code and latencyWritewebhooks:writeNo
list_webhook_deliveriesDelivery attempts for one webhook, with status code, attempts and errorReadwebhooks:writeNo
get_webhook_deliveryOne attempt in full, including the JSON payload that was sentReadwebhooks:writeNo
replay_webhook_deliveryRe-send a past payload to the current endpoint. Your server really receives it againWritewebhooks:writeNo
list_integrationsThe external services connected to the account. Stored credentials are never returnedReadintegrations:readNo
list_integration_catalogWhat can be connected, annotated with what already isReadintegrations:readNo
start_integration_oauthReturn a console link that connects a sign-in (OAuth) service to the workspace of the person who opens itWriteintegrations:writeNo
list_promptsThe managed prompts on the account, with each one's current versionReadprompts:readNo
create_promptCreate a managed prompt. Starts empty — add the text as a versionWriteprompts:writeNo
list_prompt_versionsThe revision log: version, label, pinned model, declared variables. Template text omittedReadprompts:readNo
get_prompt_versionOne version in full, with its template, variables and pinned model and parametersReadprompts:readNo
create_prompt_versionAppend a revision. Nothing live changes until a label points at itWriteprompts:writeNo
set_prompt_labelPoint a label such as production at a version. This is how a prompt is publishedWriteprompts:writeNo
render_promptSubstitute variables and get the text back, plus any you did not supply. No model callReadprompts:readNo
list_prompt_presetsSaved presets: a named model plus pinned parametersReadprompts:readNo
create_prompt_presetSave a model and parameters under a name, optionally bound to a prompt versionWriteprompts:writeNo
list_agent_versionsAn agent's version history with label, status and commit message. Bodies omittedReadbots:readNo
get_agent_versionOne version in full. Stored channel credentials are redactedReadbots:readNo
create_agent_versionStage a draft from what is live now. Callers are unaffected until it is publishedWritebots:writeNo
update_agent_versionEdit the staged draft. Published versions are immutableWritebots:writeNo
publish_agent_versionPublish the draft onto the live agent. The next caller hears the new behaviourWritebots:writeNo
rollback_agent_versionPut an older version back on the live agent. Appends rather than rewriting historyWritebots:writeNo

test_webhook and replay_webhook_delivery both make a real outbound HTTP request to your own endpoint, so whatever your server does on that event happens for real — and a replay makes it happen a second time. Neither takes a URL: they use the one already stored on the subscription, which is re-checked against private and internal address ranges on every attempt.

start_integration_oauth hands back a console link for the account owner to open. They sign in to CallMissed and approve access there, and the account is connected to their own workspace; nothing is connected until they do. Confirm it with get_integration_status, and disconnect with disconnect_integration (see Connected platforms). There is no tool that writes a provider credential.

More platform configuration tools

ToolWhat it doesAccessScope or permissionCredits
update_promptChange a prompt's name or descriptionWriteprompts:writeNo
update_prompt_presetChange a preset's name, model, default params or pinned prompt versionWriteprompts:writeNo
set_integration_spreadsheetsReplace the list of spreadsheets agents may use through a Google Sheets connectionWriteintegrations:writeNo
list_usage_logsRow-level log of this account's API calls, newest first: service, model, status, latency and cost per callReadusage:readNo
list_modelsThe public model catalogue with pricing, context window and feature flagsReadNoneNo
get_modelPricing, context window and capabilities of one model id from list_modelsReadNoneNo
get_platform_statusCurrent health of each CallMissed API service, as shown on the public status pageReadNoneNo
get_taskFetch one task in fullReadcrm_tasks:readNo

Testing and quality

ToolWhat it doesAccessScope or permissionCredits
list_eval_suitesEvaluation suites on the account, with the agent each tests and its scorecardReadevals:readNo
create_eval_suiteCreate a suite of synthetic conversations for one agentWriteevals:writeNo
list_eval_casesThe cases in a suite: persona, opening line, turn budget, success criteriaReadevals:readNo
create_eval_caseAdd one synthetic conversation to a suiteWriteevals:writeNo
create_eval_case_from_sessionTurn a real voice session into a test case: its opening, the caller's goal, and suggested outcome checks. The key also needs the stt, tts and llm permissionsWriteevals:writeNo
run_eval_suiteRun every case against the agent and report what passed. Takes minutes on a big suiteWriteevals:writeYes
list_eval_runsRun history with pass counts, model and credits spentReadevals:readNo
get_eval_runOne run in full, including every synthetic transcriptReadevals:readNo
list_experimentsA/B experiments with status, deciding metric and traffic splitReadexperiments:readNo
create_experimentCreate an experiment on one agent. Starts as a draft taking no trafficWriteexperiments:writeNo
create_experiment_armAdd a configuration to compare: an agent version plus optional overridesWriteexperiments:writeNo
start_experimentPut it live. Real callers are split across the arms from this momentWriteexperiments:writeNo
stop_experimentStop splitting traffic. Everything already collected is keptWriteexperiments:writeNo
conclude_experimentRecord the winner and close it. Final — it cannot be restarted or changedWriteexperiments:writeNo
get_experiment_resultsPer-arm sample sizes and the deciding metric, with a plain-language verdictReadexperiments:readNo
list_voice_alertsMetric alerts with their thresholds, windows and whether each is firingReadwebhooks:writeNo
create_voice_alertBe notified when a call metric crosses a threshold over a rolling windowWritewebhooks:writeNo
update_voice_alertChange a threshold, window, channel or cooldown, or silence an alertWritewebhooks:writeNo

run_eval_suite is the one tool here that spends: each case is a real model conversation of up to its turn budget, and a suite with a scorecard adds a grading call per case. No real caller is ever contacted — the caller is synthetic. The balance is checked before anything runs, so a refusal costs nothing.

Metric alerts use webhooks:write rather than a scope of their own. An alert is a notification subscription that sends mail and fires webhooks, which is exactly what that scope already governs.

More testing and quality tools

ToolWhat it doesAccessScope or permissionCredits
update_eval_suiteRename a suite, change its description or grading scorecard, or turn it on or offWriteevals:writeNo
update_eval_caseChange one case's name, persona, opening line, turn budget, success criteria or positionWriteevals:writeNo
get_experimentFetch an experiment with its status, metric, traffic split and armsReadexperiments:readNo
update_experimentChange an experiment's name, hypothesis, metric (only while a draft) or traffic splitWriteexperiments:writeNo
update_experiment_armChange an arm's name, agent version, overrides or control flagWriteexperiments:writeNo
list_scorecardsList the rubrics used to grade calls and eval runsReadconversations:readNo
create_scorecardCreate a grading rubric: up to 20 criteria, each a unique label, a relative weight (0-100] and optional guidanceWriteconversations:writeNo
update_scorecardReplace a rubric's name and full criteria list; scores already taken keep their old breakdownWriteconversations:writeNo

Connected platforms

Check, connect and disconnect the channels and services the account runs on, without opening the console. Listing and re-pointing WhatsApp numbers, Facebook Pages and Instagram accounts is in the Messaging and Facebook and Instagram groups; adding knowledge is in Agents and knowledge.

ToolWhat it doesAccessScope or permissionCredits
get_integration_statusWhether an integration is connected, and to which account. Call it after the person approves the start_integration_oauth linkReadintegrations:readNo
disconnect_integrationDisconnect an integration and discard its stored credentials. Reconnect with start_integration_oauthWriteintegrations:writeNo
start_channel_connectionThe link that connects a WhatsApp Business number, Facebook Page, Instagram account or personal WhatsApp number, with the steps to followReadwhatsapp:writeNo
list_whatsapp_accountsConnected WhatsApp Business accountsReadwhatsapp:readNo
get_whatsapp_numberOne WhatsApp number's live statusReadwhatsapp:readNo
disconnect_whatsapp_numberDeregister a WhatsApp number from this workspace. History is keptWritewhatsapp:writeNo
get_knowledge_sourceOne knowledge source's status, including the error if indexing failedReadknowledge:readNo
remove_knowledge_sourceRemove a source from an agent's knowledgeWriteknowledge:writeNo
list_payment_requestsPayment links your agents sent to customers during calls and chats, with amount, amount paid and status. The money goes to your own connected Razorpay accountReadintegrations:readNo

Two steps cannot happen inside a chat: Meta's own sign-in window for WhatsApp Business, Facebook and Instagram, and the QR scan that links a personal WhatsApp number. start_channel_connection returns the one page that runs that step, and list_whatsapp_numbers, list_facebook_pages or list_instagram_accounts confirms it worked. No tool accepts an access token or provider key.

The disconnect and remove tools are marked destructive, so your client asks before running them. None of them deletes conversation history.

Facebook and Instagram

Facebook Pages and Instagram accounts: publish and schedule posts, answer comments and DMs, read analytics. Posting, comments and DMs are not billed.

ToolWhat it doesAccessScope or permissionCredits
list_facebook_pagesList your connected Facebook Pages with their ids and linked agentReadwhatsapp:readNo
list_instagram_accountsList your connected Instagram professional accounts with their ids and linked agentReadwhatsapp:readNo
set_social_account_agentChoose which agent auto-replies to DMs on a Facebook Page or Instagram account; null unlinks itWritewhatsapp:writeNo
publish_facebook_postPublish to a Facebook Page: text, a link, photos by URL, or a Reel from a video URLWritewhatsapp:sendNo
publish_instagram_postPublish an image, video, Reel, story or carousel from public media URLsWritewhatsapp:sendNo
get_instagram_container_statusCheck whether Instagram has finished processing a post's mediaReadwhatsapp:sendNo
publish_instagram_containerPublish a processed media container once its status is FINISHEDWritewhatsapp:sendNo
get_instagram_publishing_limitHow many posts the account has published in the last 24 hours against Instagram's capReadwhatsapp:sendNo
generate_social_postDraft a ready-to-publish post: a caption, hashtags and, unless generate_image is false, an image linkWriteNoneYes
list_social_commentsList comments on a Facebook post or Instagram mediaReadwhatsapp:readNo
list_social_comment_repliesList the replies under one commentReadwhatsapp:readNo
reply_to_social_commentPost a public reply to a Facebook or Instagram comment as the Page or accountWritewhatsapp:sendNo
hide_social_commentHide a comment from everyone but its author, or unhide itWritewhatsapp:sendNo
list_social_conversationsList Facebook Messenger or Instagram DM threads, most recent firstReadwhatsapp:readNo
get_social_conversation_messagesRead the messages in one Facebook or Instagram DM threadReadwhatsapp:readNo
send_social_messageSend a text reply into an existing Facebook Messenger or Instagram DM thread; Meta only allows it within its reply windowWritewhatsapp:sendNo
get_social_analyticsRead Facebook or Instagram DM analytics: the conversation funnel or a daily time seriesReadwhatsapp:readNo

Email

Domains, templates, suppressions, inbound addresses and send history for the Email API. Every tool needs a key with the email permission.

ToolWhat it doesAccessScope or permissionCredits
list_email_domainsList your sending domains and whether each is verifiedReademail permissionNo
add_email_domainAdd a sending domainWriteemail permissionNo
get_email_domain_recordsList the DNS records a domain needs and whether each is foundReademail permissionNo
verify_email_domainCheck a domain's DNS records now and mark it verified if they passWriteemail permissionNo
list_email_sendsList recent sends with their delivery statusReademail permissionNo
get_email_usageRead email send volume and spend for the last 30 daysReademail permissionNo
list_email_suppressionsList addresses that will not be emailed (bounces, complaints, manual)Reademail permissionNo
add_email_suppressionStop all future email to an addressWriteemail permissionNo
list_inbound_email_addressesList the addresses that receive email on your verified domainsReademail permissionNo
create_inbound_email_addressStart receiving email at an address on a verified domain, optionally forwarding each message to a webhook URLWriteemail permissionNo
list_inbound_emailsList recently received emails, newest firstReademail permissionNo
list_email_templatesList your saved email templatesReademail permissionNo
create_email_templateSave a reusable email templateWriteemail permissionNo
update_email_templateChange an email template; only the fields given changeWriteemail permissionNo
get_scheduled_emailLook up scheduled sends by the send id or batchId a send returnedReademail permissionNo
cancel_scheduled_emailCancel every still-pending send for a send id or batchIdWriteemail permissionNo

Guides and playbooks

Step-by-step playbooks an assistant follows before it builds anything: it interviews you about the use case first. The same playbooks are served as MCP prompts (build_voice_agent, build_whatsapp_agent, launch_campaign, setup_support_desk, setup_crm).

ToolWhat it doesAccessScope or permissionCredits
get_playbookGet a step-by-step playbookReadNoneNo

Calling tools are deployment-gated

33 of the 331 tools are gated on whether calling is switched on for your account, in two independent groups.

20 telephony tools: place_call, list_calls, get_call, end_call, get_call_recording, click_to_call, list_phone_numbers, search_available_numbers, provision_phone_number, attach_number_to_agent, the four voicemail-message tools, set_agent_voicemail_drop, get_number_reputation, update_number_call_settings, declare_number_for_ai_calls, list_telephony_compliance and callback_handoff. With telephony off, tools/list returns the other 311.

13 campaign tools: the whole Calling campaigns table above. With campaigns off, tools/list returns the other 318.

The flow, menu and queue tools are not in either group. Call routing is authored before calling is switched on, so those routes are always mounted and those tools are always served.

Each group appears only where that feature is switched on. Where neither is, tools/list returns the other 298 and those 33 are simply absent, because the REST routes behind them are not mounted there. Calling one by name anyway returns the same Unknown tool error as a typo.

If you do not see them and you expect to, talk to us and we will get calling turned on for you.

Public catalog

GET https://api.callmissed.com/api/v1/mcp/catalog

Unauthenticated, no key needed. It returns the live tool list this deployment serves, which is what the tables above are built from, so you can check what is available before you wire anything up.

curl https://api.callmissed.com/api/v1/mcp/catalog
{
  "serverUrl": "https://api.callmissed.com/api/v1/mcp",
  "protocolVersion": "2025-06-18",
  "count": 331,
  "categories": { "voice": "Voice and calls", "crm": "CRM" },
  "tools": [
    {
      "name": "list_contacts",
      "title": "List contacts",
      "description": "List contacts in your address book, newest first...",
      "category": "crm",
      "categoryLabel": "CRM",
      "readOnly": true,
      "destructive": false,
      "costsCredits": false,
      "scope": "contacts:read"
    }
  ]
}

It carries declarations only: no argument schemas, nothing about the caller, nothing about tools this deployment has gated off. For the JSON Schema of a tool's arguments, call tools/list with your key.

Interactive views

Some results render as an interactive view instead of a wall of JSON, using the official MCP Apps extension (io.modelcontextprotocol/ui). Each view is one self-contained HTML document served over resources/read; a tool points at it through _meta.ui.resourceUri in its declaration.

ViewShowsTools that use it
ui://callmissed/call-logCalls with status, duration and costlist_calls
ui://callmissed/transcriptA call's turns, caller and agent side by sideget_voice_session_transcript
ui://callmissed/inboxConversations with previews and unread countslist_conversations, list_handoffs
ui://callmissed/timelineA contact's history in one streamcrm_timeline
ui://callmissed/image-galleryGenerated imagesgenerate_image, list_generated_images

So five views across seven tools, or six tools where telephony is off.

Where they render. claude.ai, Claude Desktop, Claude mobile and Claude Cowork render MCP Apps, as do ChatGPT, VS Code Copilot and Cursor. The Claude Code terminal does not: it shows the text result instead. That is not a degraded mode. Every tool returns its full data as text and as structuredContent whether or not a view exists, so a client that ignores the extension loses nothing but the pictures.

Connect a client

If your client supports signing in, add the server by URL alone and click Connect: no header, no key. See option 1 above.

Otherwise, most MCP clients accept a remote server as a URL plus a header. In Claude Code:

claude mcp add --transport http callmissed \
  https://api.callmissed.com/api/v1/mcp \
  --header "Authorization: Bearer cm_your_api_key"

For clients configured by file, the shape is usually:

{
  "mcpServers": {
    "callmissed": {
      "type": "http",
      "url": "https://api.callmissed.com/api/v1/mcp",
      "headers": {
        "Authorization": "Bearer cm_your_api_key"
      }
    }
  }
}

Keep the key out of version control. Reference an environment variable if your client supports it.

Call it directly

The endpoint is plain JSON-RPC, so you can drive it with curl. List the tools your key can reach:

curl https://api.callmissed.com/api/v1/mcp \
  -H "Authorization: Bearer cm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list"
  }'

Call one:

curl https://api.callmissed.com/api/v1/mcp \
  -H "Authorization: Bearer cm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "list_contacts",
      "arguments": { "q": "jane", "limit": 10 }
    }
  }'

A successful call returns the data twice, once as structuredContent and once serialized into a text block, so clients that only read one shape still work:

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [{ "type": "text", "text": "[{\"id\":\"...\",\"name\":\"Jane\"}]" }],
    "structuredContent": { "result": [{ "id": "...", "name": "Jane" }] },
    "isError": false
  }
}

Errors

Two different shapes, matching the protocol.

A malformed request, meaning an unknown tool, a missing argument, or a bad method, comes back as a JSON-RPC error:

{
  "jsonrpc": "2.0",
  "id": 3,
  "error": { "code": -32602, "message": "Unknown tool: send_sms" }
}

A refused action, meaning a missing scope, no credits, or a closed messaging window, is a successful result carrying isError, so the agent can read the reason and adapt instead of treating it as a crash:

{
  "jsonrpc": "2.0",
  "id": 4,
  "result": {
    "content": [{ "type": "text", "text": "API key missing required scope: whatsapp:send." }],
    "isError": true
  }
}

Authentication failures happen before any tool runs and use normal HTTP status codes: 401 for a missing or malformed credential, a dashboard login token, or a connection that has been revoked; 402 when the key is out of budget; 429 when it is over its rate limit.

Every 401 from this endpoint carries a WWW-Authenticate header pointing at the protected-resource document, including the very first call a client makes with no credential at all. That is what lets a client offer "Connect and sign in" instead of asking you to paste a key.

Protocol version

The server implements MCP revision 2025-11-25 and also accepts 2025-06-18 and 2025-03-26. Send the version you speak on every call after initializing:

MCP-Protocol-Version: 2025-06-18

Omit the header and the server assumes 2025-03-26, per the specification. Send a version it does not support and the call returns 400. Batched requests are not accepted, because the 2025-06-18 revision removed them, so send one request object per POST.