Munin
Munin developer portal
Get a key →
Section · MCP Tools

Tools your agent can call.

Munin exposes 108 tools at /mcp. Audiences gate which tokens see which tools — admin keys see everything, delegated end-user tokens see only self-service tools.

Admin tools 103

Available to admin API keys and admin sessions. Includes everything that writes or that reads across the org.

pingPing the MCP server
adminself-serviceread-only

Verify the MCP pipe; echoes a message and returns the resolved org and actor type.

Input schema
messagestringoptional
cms_list_collectionsList CMS collections
adminread-only

List CMS collections (content types) defined for your org.

cms:read
Input schema
(no fields documented)
cms_get_collectionRead CMS collection
adminread-only

Read one collection by id or slug, including its field definitions.

cms:read
Input schema
idOrSlugstringrequired
cms_create_collectionCreate CMS collection
adminwrites

Define a new collection. Fields is an array of { name, type, required?, options? } — see field types: text, rich_text, markdown, number, integer, boolean, date, datetime, select, multi_select, asset, reference, array, json.

cms:write
Input schema
namestringrequired
slugstringrequired
descriptionstringoptional
fieldsunknown[]required
localizedbooleanoptional
settingsobjectoptional
cms_update_collectionUpdate CMS collection
adminwrites

Patch a collection. Field migration is lossy: dropped or renamed fields stay in entries' `data` jsonb but stop being read by the projection layer.

cms:write
Input schema
idOrSlugstringrequired
patchobjectrequired
cms_delete_collectionDelete CMS collection
admindestructive

Delete a collection. Cascades to all entries, versions, and references.

cms:write
Input schema
idOrSlugstringrequired
cms_list_entriesList CMS entries
adminread-only

List entries. Filters: collection (id or slug), status, locale. Drafts and scheduled entries are returned to admins; the public delivery API only ever returns published.

cms:read
Input schema
collectionstringoptional
statusenumoptional
localestringoptional
limitintegeroptional
cms_get_entryRead CMS entry
adminread-only

Read one entry. Data is projected through the collection's current field schema.

cms:read
Input schema
idstringrequired
cms_create_entryCreate CMS entry
adminwrites

Create a new entry in a collection. `data` is keyed by field name; required fields must be present. Pass `status: "published"` to publish on creation; default is draft.

cms:write
Input schema
collectionstringrequired
slugstringrequired
localestringoptional
dataobjectrequired
statusenumoptional
cms_update_entryUpdate CMS entry
adminwrites

Update an entry. Pass `ifVersion` (the current version you read) for optimistic concurrency. Updating `data` re-validates against the collection schema, regenerates search_text + embedding, and rewrites references.

cms:write
Input schema
idstringrequired
ifVersionintegerrequired
slugstringoptional
localestringoptional
dataobjectoptional
cms_publish_entryPublish CMS entry
adminwrites

Flip an entry to status="published". Stamps publishedAt and fires cms.entry.published.

cms:write
Input schema
idstringrequired
ifVersionintegerrequired
cms_unpublish_entryUnpublish CMS entry
adminwrites

Revert an entry to status="draft". Clears publishedAt; fires cms.entry.unpublished.

cms:write
Input schema
idstringrequired
ifVersionintegerrequired
cms_schedule_publishSchedule CMS entry publish
adminwrites

Schedule an entry to flip to published at a future ISO 8601 datetime. The schedule worker drains due rows every minute.

cms:write
Input schema
idstringrequired
ifVersionintegerrequired
scheduledAtstringrequired
cms_delete_entryDelete CMS entry
admindestructive

Delete an entry. Cascades to its versions and references.

cms:write
Input schema
idstringrequired
ifVersionintegerrequired
cms_list_versionsList CMS entry versions
adminread-only

List all prior versions of an entry, newest first.

cms:read
Input schema
entryIdstringrequired
cms_restore_versionRestore CMS entry version
admindestructive

Roll an entry back to an earlier version. Creates a new current version with that historical data.

cms:write
Input schema
entryIdstringrequired
versionintegerrequired
ifVersionintegerrequired
cms_list_assetsList CMS assets
adminread-only

List media-library assets in your org.

cms:read
Input schema
limitintegeroptional
cms_request_asset_uploadRequest CMS asset upload URL
adminwrites

Mint a presigned upload URL for a new asset. The asset row is created in `uploaded:false` state; PUT the file body to `uploadUrl`, then call cms_complete_asset_upload to mark it live.

cms:write
Input schema
namestringrequired
mimestringrequired
sizeBytesintegerrequired
altTextstringoptional
metadataobjectoptional
cms_complete_asset_uploadComplete CMS asset upload
adminwrites

Mark a previously-requested asset upload as complete.

cms:write
Input schema
idstringrequired
cms_delete_assetDelete CMS asset
admindestructive

Delete an asset and remove the underlying file from storage.

cms:write
Input schema
idstringrequired
cms_list_localesList CMS locales
adminread-only

List configured locales for your org. The default locale is used when an entry omits one.

cms:read
Input schema
(no fields documented)
cms_create_localeCreate CMS locale
adminwrites

Add a locale. Code is ISO 639-1 (e.g. "en") or BCP-47 ("en-US"). The first locale is the default unless overridden.

cms:write
Input schema
codestringrequired
namestringrequired
isDefaultbooleanoptional
cms_set_default_localeSet default CMS locale
adminwrites

Set which locale is treated as the org's default for new entries.

cms:write
Input schema
codestringrequired
cms_list_inbound_referencesList inbound CMS references
adminread-only

List entries that link to the given entry. Useful before deleting — see "what would break".

cms:read
Input schema
entryIdstringrequired
conv_list_conversationsList conversations
adminread-only

List conversations for your org, newest activity first. Filter by status (open / snoozed / closed / spam), assignee, or topic.

conv:read
Input schema
statusenumoptional
assigneeUserIdstringoptional
topicIdstringoptional
limitintegeroptional
conv_get_conversationRead conversation
adminread-only

Read one conversation including every public + internal message.

conv:read
Input schema
idstringrequired
conv_send_messageSend message in conversation
adminwrites

Append a message to a conversation. Pass `internal: true` to leave a staff-only note (drafts, side comments) — end-user agents never see internal messages.

conv:write
Input schema
conversationIdstringrequired
bodystringrequired
internalbooleanoptional
inReplyToIdstringoptional
conv_assign_conversationAssign conversation
adminwrites

Assign a conversation to a user (pass user id) or unassign (pass null). Useful for routing escalated conversations.

conv:write
Input schema
idstringrequired
assigneeUserIdunknownrequired
conv_change_statusChange conversation status
adminwrites

Change a conversation's status. `snoozeUntil` (ISO 8601) is required when status is "snoozed".

conv:write
Input schema
idstringrequired
statusenumrequired
snoozeUntilstringoptional
conv_request_handoverRequest handover to a human
adminwrites

Flag a conversation as needing human attention. Use this when you have reached the limit of what you can resolve autonomously — billing decisions, refunds outside policy, sensitive complaints, anything where a human teammate should step in. Appends an internal system note (visible only to staff) recording your stated `reason`, sets the conversation's "needs human attention" flag (which pins it to the top of the dashboard's Conversations page), and emits `conversation.handover_requested`. Also pass `suggestedReply` — your best guess at what a human teammate could send to resolve the issue. The team sees this as a starting draft they can edit, approve, or rewrite. Idempotent — calling again on an already-flagged conversation is a no-op. The flag clears automatically once a human teammate replies or closes the conversation.

conv:write
Input schema
conversationIdstringrequired
reasonstringoptional
suggestedReplystringoptional
conv_search_messagesSearch conversation messages
adminread-only

Substring search over message bodies. Returns the matching messages newest first; use conv_get_conversation to load surrounding context.

conv:read
Input schema
querystringrequired
limitintegeroptional
conv_list_channelsList conversation channels
adminread-only

List conversation channels configured for your org. Currently shipping adapters: email and chat (widget). The `voice` and `sms` channel types are reserved for upcoming adapters.

conv:read
Input schema
(no fields documented)
conv_create_channelCreate conversation channel
adminwrites

Add a new conversation channel. Currently shipping adapters: `email` and `chat` (widget). Channel-specific configuration goes in `config`. The `voice` and `sms` channel types are reserved and not yet wired to an adapter.

conv:write
Input schema
typeenumrequired
vendorstringrequired
namestringrequired
configobjectoptional
conv_list_topicsList conversation topics
adminread-only

List conversation topics (Billing, Support, Refunds, …) for your org.

conv:read
Input schema
(no fields documented)
conv_create_topicCreate conversation topic
adminwrites

Add a new conversation topic. Slug must be lowercase letters, digits, hyphens.

conv:write
Input schema
namestringrequired
slugstringrequired
colorstringoptional
conv_set_topicSet or clear a conversation topic
adminwrites

Tag a conversation with one of the org's existing topics, or pass `topicId: null` to clear the topic. Use `conv_list_topics` first to see what topics exist; topics must be pre-created via `conv_create_topic`.

conv:write
Input schema
conversationIdstringrequired
topicIdunknownrequired
conv_strip_message_signatureStrip the signature from an inbound message
adminwrites

Replace an inbound message's body with a signature-stripped version. Used by the strip-email-signature curator skill — runs after the regex quote-stripper to clean up the trailing sign-off / contact block. The original body is kept in `metadata.preStripBody` for audit; the removed signature (if provided) is stored in `metadata.signatureText`. Refuses if the new body is empty, more than 50% shorter than the original, or if the message isn't an end-user inbound in the caller's org.

conv:write
Input schema
messageIdstringrequired
bodystringrequired
signatureTextstringoptional
conv_email_setup_channelSet up email channel
adminwrites

Create or update an email channel's transport configuration. Pass plaintext SMTP / IMAP passwords; the server encrypts them before storage and returns them redacted. Set `outbound.provider: 'mailer'` to send via Munin's configured Resend mailer instead of a custom SMTP host.

conv:write
Input schema
channelIdstringoptional
namestringrequired
configobjectrequired
conv_email_test_channelTest email channel credentials
adminread-only

Test an email channel's stored credentials. Attempts an SMTP connect (and an IMAP connect if inbound is configured) without sending or fetching anything. Returns `{ smtp: "ok" | error, imap: "ok" | error | "not configured" }`.

conv:write
Input schema
channelIdstringrequired
conv_email_send_testSend test email
adminwrites

Send a real test email through this channel's configured outbound transport (SMTP or Mailer). The message is addressed `to` the recipient you pass in. Useful for confirming credentials and deliverability end-to-end.

conv:write
Input schema
channelIdstringrequired
tostringrequired
conv_messagebird_sms_configureConfigure MessageBird SMS channel
adminwrites

Create or update a MessageBird SMS channel. Pass `channelId` to update; omit to create. The plaintext `accessKey` and `signingKey` are encrypted before storage and returned redacted. On update, omit either secret to keep the existing one.

conv:write
Input schema
channelIdstringoptionalPass an existing channel id to update; omit to create a new channel.
namestringoptional
accessKeystringoptionalMessageBird live or test Access Key (used to authorize outbound SMS). Required on create. On update, omit to keep the existing value.
signingKeystringoptionalMessageBird signing key (used to verify the JWT on incoming webhooks). Required on create. On update, omit to keep the existing value.
originatorstringoptionalSender ID — either an E.164 number registered with your MessageBird account or an alphanumeric ≤ 11 chars. Required on create.
conv_messagebird_sms_test_channelTest MessageBird SMS channel credentials
adminread-only

Verify a MessageBird channel's stored Access Key by fetching the account balance. Returns `{ ok: true, balance }` on success.

conv:write
Input schema
channelIdstringrequired
conv_messagebird_sms_send_testSend a real test SMS via MessageBird
adminwrites

Send a real SMS through this channel's MessageBird account. Useful for end-to-end deliverability checks.

conv:write
Input schema
channelIdstringrequired
tostringrequiredE.164 destination number.
bodystringoptional
conv_twilio_sms_configureConfigure Twilio SMS channel
adminwrites

Create or update a Twilio SMS channel. Pass `channelId` to update an existing channel; omit to create one. The plaintext `authToken` is encrypted before storage and is returned redacted. On update, omit `authToken` to keep the existing one. Either `fromNumber` (E.164) or `messagingServiceSid` is required.

conv:write
Input schema
channelIdstringoptionalPass an existing channel id to update; omit to create a new channel.
namestringoptional
accountSidstringoptionalTwilio Account SID — starts with "AC". Required on create.
authTokenstringoptionalTwilio Auth Token (plaintext). Required on create. On update, omit to keep the existing token, or pass a new value to rotate.
fromNumberstringoptionalE.164-formatted Twilio number to send from. Either this or messagingServiceSid is required.
messagingServiceSidstringoptionalTwilio Messaging Service SID (starts with "MG"). Alternative to fromNumber.
conv_twilio_sms_test_channelTest Twilio SMS channel credentials
adminread-only

Verify a Twilio SMS channel's stored Account SID + Auth Token by fetching the account record from Twilio. Returns `{ ok: true, friendlyName, status }` on success.

conv:write
Input schema
channelIdstringrequired
conv_twilio_sms_send_testSend a real test SMS
adminwrites

Send a real SMS through this channel's Twilio account. The recipient must be a number Twilio is permitted to reach (verified caller ID on trial accounts). Useful for end-to-end deliverability checks.

conv:write
Input schema
channelIdstringrequired
tostringrequiredE.164 destination number.
bodystringoptional
conv_vapi_configureConfigure Vapi voice channel
adminwrites

Create or update a Vapi voice channel. Pass `channelId` to update; omit to create. The plaintext `apiKey` and `webhookSecret` are encrypted before storage and returned redacted. The assistant + phone number must already exist in Vapi — paste their IDs here.

conv:write
Input schema
channelIdstringoptionalPass an existing channel id to update; omit to create a new channel.
namestringoptional
apiKeystringoptionalVapi API key. Required on create. On update, omit to keep the existing value.
webhookSecretstringoptionalShared secret used to authenticate inbound webhooks from Vapi. In the Vapi dashboard go to the assistant's Advanced → Webhook Server → HTTP Headers and add header `X-Webhook-Secret` with this value. Required on create.
assistantIdstringoptionalVapi assistant ID. Create the assistant in the Vapi dashboard or via their API, then paste its ID here.
phoneNumberIdstringoptionalVapi phone number ID. Only required if you want to place or receive PSTN phone calls — leave blank for WebRTC/browser-only voice. Either import a Twilio number into Vapi or buy one from Vapi, then paste the ID here.
publicKeystringoptionalVapi public key — safe to expose to the browser. Required if you want the chat widget to start in-browser voice sessions; not needed for phone-only setups. Find it in the Vapi dashboard under your assistant.
conv_vapi_test_channelTest Vapi voice channel credentials
adminread-only

Verify a Vapi channel's stored API key and assistant by fetching the assistant from Vapi. Returns `{ ok: true, assistant }` on success.

conv:write
Input schema
channelIdstringrequired
conv_voice_call_initiatePlace an outbound voice call
adminwrites

Initiate an outbound voice call through this channel. The Vapi assistant will run the conversation. Returns the Vapi call id and status.

conv:write
Input schema
channelIdstringrequired
tostringrequired
customerNamestringoptional
conv_voice_call_contactPlace a voice call to this conversation's contact
adminwrites

Place an outbound voice call to the contact attached to a conversation. Resolves the phone number from the conversation's contact and picks the org's active Vapi voice channel automatically. For arbitrary destinations, use `conv_voice_call_initiate` instead.

conv:write
Input schema
conversationIdstringrequired
conv_widget_create_channelCreate chat-widget channel
adminwrites

Create a chat-widget channel and mint a widget API key (`mn_widget_*`) bound to it. Returns the plaintext key once; store it server-side and pass it as `Authorization: Bearer` when calling POST /api/v1/widget/messages from the external agent.

conv:write
Input schema
namestringrequired
originAllowliststring[]required
webhookOnEscalationstringoptional
requireVerifiedIdentitybooleanoptional
conv_widget_update_channelUpdate chat-widget channel
adminwrites

Update a chat-widget channel's originAllowlist / webhookOnEscalation. Pass null to clear webhookOnEscalation. The widget API key is unchanged.

conv:write
Input schema
channelIdstringrequired
originAllowliststring[]optional
webhookOnEscalationunknownoptional
requireVerifiedIdentitybooleanoptional
conv_widget_rotate_keyRotate widget API key
admindestructive

Revoke any active widget keys bound to this channel and mint a fresh `mn_widget_*` key. Returns the new plaintext key once. Existing inflight requests using the old key keep working until revocation lands.

conv:write
Input schema
channelIdstringrequired
conv_widget_rotate_identity_secretRotate widget identity-verification secret
admindestructive

Generate a fresh per-channel HMAC secret used to verify browser-side `data-user-hash` values against `data-external-id`. The previous secret is replaced atomically; any previously-issued user hashes stop verifying immediately and the operator must re-render their pages with newly-computed hashes. Returns the new plaintext once.

conv:write
Input schema
channelIdstringrequired
crm_list_contactsList contacts
adminread-only

List contacts in your org, newest-updated first. Filter by company or tag.

crm:read
Input schema
companyIdstringoptional
tagstringoptional
limitintegeroptional
crm_get_contactRead contact
adminread-only

Read one contact, including AI fields, tags, custom fields, and compliance flags.

crm:read
Input schema
idstringrequired
crm_find_contactFind contact by email or phone
adminread-only

Find an existing contact by email and/or phone before creating a new one. Returns null if no match.

crm:read
Input schema
emailstringoptional
phonestringoptional
crm_create_contactCreate contact
adminwrites

Create a new contact. Search with crm_find_contact first to avoid duplicates.

crm:write
Input schema
namestringoptional
emailstringoptional
phonestringoptional
titlestringoptional
addressstringoptional
companyIdstringoptional
endUserIdstringoptional
tagsstring[]optional
customFieldsobjectoptional
crm_update_contactUpdate contact
adminwrites

Update fields on a contact. Setting `doNotContact: true` also stamps `unsubscribedAt`; setting it false clears it. Pass `mode: 'fill-null'` from automated/curator contexts to refuse overwriting existing non-null values (only null/empty fields are filled). Default `mode: 'overwrite'` applies the patch as-is and is appropriate for human-driven edits.

crm:write
Input schema
idstringrequired
patchobjectrequired
modeenumoptionalWhen 'fill-null', only applies patch keys whose existing value on the contact is null or empty — non-null fields are left untouched. Default 'overwrite' applies the patch as-is. Curator skills that backfill automated data should pass 'fill-null'; human-driven dashboard edits should use the default.
crm_bulk_create_contactsBulk-create contacts
adminwrites

Bulk-create contacts with dedupe + compliance checks: rows whose email or phone already match a do_not_contact contact are skipped, as are rows that would duplicate an existing contact.

crm:write
Input schema
contactsobject[]required
crm_search_contactsSearch contacts
adminread-only

Substring search across name, email, phone, and title. Returns contacts ordered newest-updated first.

crm:read
Input schema
querystringrequired
limitintegeroptional
crm_list_companiesList companies
adminread-only

List companies in your org.

crm:read
Input schema
limitintegeroptional
crm_create_companyCreate company
adminwrites

Create a new company.

crm:write
Input schema
namestringrequired
domainstringoptional
tagsstring[]optional
customFieldsobjectoptional
crm_list_pipelinesList sales pipelines
adminread-only

List sales pipelines for your org with their stages in position order.

crm:read
Input schema
(no fields documented)
crm_create_pipelineCreate sales pipeline
adminwrites

Create a new sales pipeline with at least one stage. Stages are inserted in array order; mark a stage `winLoss: "won"` or `"lost"` to record terminal outcomes.

crm:write
Input schema
namestringrequired
slugstringrequired
stagesobject[]required
crm_list_dealsList deals
adminread-only

List deals, optionally filtered by pipeline or stage.

crm:read
Input schema
pipelineIdstringoptional
stageIdstringoptional
limitintegeroptional
crm_create_dealCreate deal
adminwrites

Create a new deal in a pipeline. If `stageId` is omitted, the deal lands in the pipeline's first stage by position.

crm:write
Input schema
namestringrequired
pipelineIdstringrequired
stageIdstringoptional
amountCentsintegeroptional
currencystringoptional
primaryContactIdstringoptional
companyIdstringoptional
expectedCloseAtstringoptional
crm_change_stageChange deal stage
adminwrites

Move a deal to a new stage. If the destination stage is a won/lost terminal, `closedAt` is stamped automatically.

crm:write
Input schema
dealIdstringrequired
stageIdstringrequired
crm_log_activityLog CRM activity
adminwrites

Record an activity (note / call / email / meeting / task) against a contact, company, or deal. If `contactId` is set, the contact's `lastContactedAt` is also bumped.

crm:write
Input schema
typeenumrequired
subjectstringoptional
bodystringoptional
contactIdstringoptional
companyIdstringoptional
dealIdstringoptional
dueAtstringoptional
completedAtstringoptional
metadataobjectoptional
crm_list_activitiesList CRM activities
adminread-only

List CRM activities filtered by contact, deal, or company.

crm:read
Input schema
contactIdstringoptional
dealIdstringoptional
companyIdstringoptional
limitintegeroptional
crm_set_ai_summarySet AI summary or next action
adminwrites

Set the AI-generated summary and/or next-action for a contact, company, or deal. These live in dedicated columns so agents do not pollute the human-edited description.

crm:write
Input schema
entityTypeenumrequired
idstringrequired
summaryunknownoptional
nextActionunknownoptional
crm_propose_merge_candidatePropose a CRM merge candidate
adminwrites

File a structured proposal that two contacts are the same person. Pass `confidence` ("high" | "medium"), `evidence` (the matched signals — same email, same phone, similar name, etc.), `recommendedKeeperId` (which row to keep), and optionally `recommendedPatch` (fields to copy onto the keeper from the duplicate). Idempotent on the (contactA, contactB) pair while a pending proposal exists — calling again upserts the existing pending row. The CRM clean-contact-data curator runs this on a periodic cadence; see `skill://crm/clean-contact-data`.

crm:write
Input schema
contactAIdstringrequired
contactBIdstringrequired
confidenceenumrequired
evidenceobjectrequired
recommendedKeeperIdstringrequired
recommendedPatchobjectoptional
crm_list_merge_proposalsList CRM merge proposals
adminread-only

List CRM merge proposals, defaulting to `status: "pending"` (the operator review queue). Returns each proposal with both contacts embedded as summaries — no extra `crm_get_contact` calls needed. Pass `status: "dismissed"` once per curator pass to skip pairs the operator has already rejected.

crm:read
Input schema
statusenumoptional
limitintegeroptional
crm_apply_merge_proposalApply a CRM merge proposal
admindestructive

Atomically apply a pending merge proposal: copies `recommendedPatch` fields onto the keeper, archives the duplicate (adds `dedup-archived-YYYY-MM` tag, sets `customFields.mergedInto = <keeperId>`, sets `doNotContact: true`), and marks the proposal `applied`. Activities and deals stay on whichever contactId they were originally logged under — that's a documented v1 limitation. Throws if the proposal is not in `pending` status.

crm:write
Input schema
idstringrequired
crm_dismiss_merge_proposalDismiss a CRM merge proposal
adminwrites

Mark a pending merge proposal as dismissed (the operator decided these are not the same person). The next CRM hygiene curator pass queries dismissed proposals and skips refiling the same pair. Optional `reason` is stored for audit. Throws if the proposal is not in `pending` status.

crm:write
Input schema
idstringrequired
reasonstringoptional
crm_list_segmentsList CRM segments
adminread-only

List saved contact segments. A segment is a named CRM filter — used as the audience for outreach campaigns and other targeting workflows. Returns each segment with its filter definition.

crm:read
Input schema
(no fields documented)
crm_get_segmentRead CRM segment
adminread-only

Read one segment, including its filter definition.

crm:read
Input schema
idstringrequired
crm_create_segmentCreate CRM segment
adminwrites

Create a saved contact segment. `filter` supports tagsAny (any-of match), tagsAll (all-of match), companyId, searchQuery (substring over name/email/title), and contactedSince (ISO-8601 — narrows to contacts NOT contacted since that timestamp). Combine fields and they AND together.

crm:write
Input schema
namestringrequired
descriptionstringoptional
filterobjectrequired
crm_update_segmentUpdate CRM segment
adminwrites

Patch a segment: rename, edit description, or replace the filter.

crm:write
Input schema
idstringrequired
patchobjectrequired
crm_delete_segmentDelete CRM segment
admindestructive

Delete a segment. Outreach campaigns referencing it will fail until reassigned.

crm:write
Input schema
idstringrequired
crm_list_contacts_in_segmentList contacts in segment
adminread-only

Resolve a segment to its current contacts. ALWAYS excludes suppressed contacts (do_not_contact OR unsubscribed) AND contacts without a recorded lawful basis (consent_lawful_basis IS NULL). Use this — not crm_list_contacts — to materialize an outreach audience: the suppression and consent floors are non-overridable here.

crm:read
Input schema
idstringrequired
limitintegeroptional
kb_list_spacesList KB spaces
adminread-only

List knowledge-base spaces in your org.

kb:read
Input schema
(no fields documented)
kb_create_spaceCreate KB space
adminwrites

Create a new knowledge-base space. Slug must be unique within your org and only contain lowercase letters, digits and hyphens.

kb:write
Input schema
namestringrequired
slugstringrequired
descriptionstringoptional
kb_list_documentsList KB documents
adminread-only

List knowledge-base documents in your org, newest-updated first. Optionally filter by space or tag.

kb:read
Input schema
spaceIdstringoptional
tagstringoptional
limitintegeroptional
kb_get_documentRead KB document
adminself-serviceread-only

Read one knowledge-base document, including its full body, tags, and current version. End-user agents see only documents whose `audiences` includes `'self_service'`.

kb:read
Input schema
idstringrequired
kb_get_document_by_slugRead KB document by slug
adminread-only

Read a knowledge-base document by its space slug and document slug — used when a stable identifier (e.g. 'agent-runtime/system-prompt') is needed instead of the document UUID. Returns null when the document does not exist.

kb:read
Input schema
spaceSlugstringrequired
slugstringrequired
kb_create_documentCreate KB document
adminwrites

Create a knowledge-base document inside a space. Body should be markdown. Set `audiences: ['admin', 'self_service']` to expose it to end-user agents; defaults to `['admin']` (admin-only).

kb:write
Input schema
spaceIdstringrequired
titlestringrequired
bodystringrequired
audiencesenum[]optional
tagsstring[]optional
slugstringoptional
kb_update_documentUpdate KB document
adminwrites

Update a knowledge-base document. Pass `ifVersion` (the current version you read) for optimistic concurrency; the call fails if it has changed.

kb:write
Input schema
idstringrequired
ifVersionintegerrequired
titlestringoptional
bodystringoptional
audiencesenum[]optional
tagsstring[]optional
kb_delete_documentDelete KB document
admindestructive

Delete a knowledge-base document. Pass `ifVersion` for optimistic concurrency. Cascades to chunks and versions.

kb:write
Input schema
idstringrequired
ifVersionintegerrequired
kb_list_versionsList KB document versions
adminread-only

List all prior versions of a knowledge-base document, newest first.

kb:read
Input schema
documentIdstringrequired
kb_propose_curation_candidatePropose KB curation candidate
adminwrites

File a draft FAQ-style document into the `kb-curation-inbox` KB space (admin audience only). Used after a curation pass over resolved-handover conversations. The space is created on first use. See `skill://kb/review-content` for the procedure. The candidate is NOT visible to end-user agents until it's promoted with `kb_publish_curation_candidate`.

kb:write
Input schema
subjectstringrequired
draftBodystringrequired
sourceConversationIdstringoptional
sourceMessageIdsstring[]optional
proposedTargetSpaceSlugstringoptional
kb_publish_curation_candidatePublish KB curation candidate
admindestructive

Promote a reviewed curation candidate into a target KB space. Copies the doc to the target space (default audiences `['admin', 'self_service']` so the self-service agent can find it), drops the `curation`/`candidate` tags, and removes the candidate from the inbox. The target space must already exist.

kb:write
Input schema
candidateDocumentIdstringrequired
targetSpaceSlugstringrequired
audiencesenum[]optional
kb_restore_versionRestore KB document version
admindestructive

Roll a document back to an earlier version. Creates a new current version with that historical content.

kb:write
Input schema
documentIdstringrequired
versionintegerrequired
ifVersionintegerrequired
outreach_list_campaignsList outreach campaigns
adminread-only

List outbound-campaign definitions for this org. Each row carries the brief, the targeted CRM segment, the email channel used to send, cadence rules, CTA URL, and the enabled flag. The draft-initial curator only drafts proposals for `enabled = true` campaigns.

outreach:read
Input schema
(no fields documented)
outreach_get_campaignRead one outreach campaign
adminread-only

Read a single campaign by id, including brief and cadence rules.

outreach:read
Input schema
idstringrequired
outreach_create_campaignCreate outreach campaign
adminwrites

Create an outbound-campaign definition. Operators write `brief` as a one-paragraph human description of intent (the curator personalises per contact from this). `segmentId` chooses the audience; the curator calls `crm_list_contacts_in_segment` (which always enforces suppression+consent floor) to materialize it. `channelId` must reference an email channel. New campaigns default `enabled: false` so the curator does not start drafting until you flip it on.

outreach:write
Input schema
namestringrequired
briefstringrequired
segmentIdstringrequired
channelIdstringrequired
cadenceRulesobjectoptional
ctaUrlunknownoptional
enabledbooleanoptional
unsubscribeRequiredbooleanoptional
outreach_update_campaignUpdate outreach campaign
adminwrites

Patch fields on a campaign — rename, swap segment, adjust cadence, toggle enabled.

outreach:write
Input schema
idstringrequired
patchobjectrequired
outreach_list_proposalsList outreach proposals
adminread-only

List drafted outreach proposals (initials in PR2; replies in PR3). Defaults to all statuses. The draft-initial curator queries `status: "pending", kind: "initial"` filtered by `(campaignId, contactId)` to dedupe before drafting a new candidate. The operator review surface queries `status: "pending"`.

outreach:read
Input schema
statusenumoptional
campaignIdstringoptional
kindenumoptional
contactIdstringoptional
limitintegeroptional
outreach_propose_initialPropose an initial outreach draft
adminwrites

File one drafted initial outreach email per (campaign, contact) for human approval. Idempotent: re-proposing the same (campaign, contact, kind=initial) while a pending row exists throws — call `outreach_list_proposals` first to dedupe. Suppression and consent are re-checked at approve-time too; this tool refuses up-front if the contact is already suppressed.

outreach:write
Input schema
campaignIdstringrequired
contactIdstringrequired
draftSubjectstringoptionalRequired for email campaigns; omit for voice campaigns where the call has no subject.
draftBodystringrequiredFor email campaigns: the email body. For voice campaigns: the opening line / talking-points the AI agent should use when the call connects.
evidenceobjectoptional
proposedSendAtstringoptional
outreach_propose_replyPropose an outreach reply draft
adminwrites

File a drafted reply to an inbound message on an outreach-originated conversation, for human approval. The conversation must have an `outreachCampaignId` set (it's an outreach conversation) and a CRM contact resolvable by email. Idempotent: re-proposing while a pending reply exists for the same conversation throws — the operator should approve or dismiss the existing one first. Reply approvals send via `conv_send_message` on the existing conversation; no unsubscribe footer is appended (replies thread inside the existing email chain that already carries the unsubscribe link).

outreach:write
Input schema
conversationIdstringrequired
draftBodystringrequired
evidenceobjectoptional

Self-service tools 8

Visible to delegated end-user tokens. Scoped to one principal and read-only or contributor at most.

pingPing the MCP server
adminself-serviceread-only

Verify the MCP pipe; echoes a message and returns the resolved org and actor type.

Input schema
messagestringoptional
conv_request_handover_in_my_conversationRequest a human teammate to take over
self-servicewrites

Flag the current conversation as needing human attention. Use this when you can't answer the end-user's question on your own — pricing exceptions, account-specific issues you can't verify, anything sensitive. Pass the exact `conversationId` you were given in the system context. Sets a "needs human attention" flag on the conversation (pinning it to the top of the team's dashboard) and posts an internal note recording your `reason`. Also pass `suggestedReply` — your best guess at what a human teammate could send to resolve the issue. The team sees this as a starting draft they can edit, approve, or rewrite. After calling this, do not keep generating replies on your own — let the user know a teammate will follow up, then stop. The flag clears once a teammate replies. The end-user does not see the system note or the suggested reply — only the team does.

conv:write
Input schema
conversationIdstringrequired
reasonstringoptional
suggestedReplystringoptional
conv_request_phone_call_for_my_conversationPlace a phone call to the user in this conversation
self-servicewrites

Place an outbound phone call to the contact in this conversation. Use this only when the user has asked to be called — e.g. "can you call me?". The call goes to the phone number already on file for this conversation's contact; you cannot specify an arbitrary number. The org must have an active Vapi voice channel configured. After requesting the call, tell the user briefly that a call is on the way and stop replying — the rest of the conversation happens on the phone.

conv:write
Input schema
conversationIdstringrequired
crm_get_my_contactRead my CRM contact
self-serviceread-only

Read the CRM contact linked to the calling end-user. RLS restricts visibility to that single row.

crm:read
Input schema
(no fields documented)
crm_update_my_contactUpdate my CRM contact
self-servicewrites

Update the calling end-user's own contact record. Only basic personal fields (name, phone, address) are editable from this surface — tags, ownership, custom fields, and AI fields are admin-only.

crm:write
Input schema
namestringoptional
phonestringoptional
addressstringoptional
crm_log_activity_selfLog activity as end-user
self-servicewrites

Record an activity attributed to the calling end-user agent (e.g. a voice agent logging "spoke with customer for 4m, follow-up needed"). Auto-scoped to the end-user's own CRM contact when one exists.

crm:write
Input schema
typeenumrequired
subjectstringoptional
bodystringoptional
metadataobjectoptional
kb_get_documentRead KB document
adminself-serviceread-only

Read one knowledge-base document, including its full body, tags, and current version. End-user agents see only documents whose `audiences` includes `'self_service'`.

kb:read
Input schema
idstringrequired