Unified inbox MCP for WhatsApp, Telegram, Email, voice β read/send messages, search, AI agents.
Unified messaging interface for WhatsApp, Telegram, Email, and voice.
Captured live from the server via tools/list.
contacts_find
π€ Search for contacts in your address book by name or username.
When to use:
- User asks 'find contact X' or 'who is Y?'
- User wants to know someone's username or ID
- Before sending a message to verify contact exists
- To get contact's channel reference for messaging
Examples:
β User: 'find contact named [name]'
β contacts_search(query='[name]', limit=5)
β User: 'who is [full name]?'
β contacts_search(query='[full name]', limit=1)
β User: 'search for @username'
β contacts_search(query='username', limit=10)
Returns: name, username, channel, channel_ref, similarity_score, match_type. Plus:
- entity_id: local DB key β pass to contacts.profile. Null for live-discovered contacts (skip contacts.profile for those).
- telegram_user_id (when channel='telegram'): the Telegram user ID β pass to calls.make / messages.send. NOT entity_id.
Parameters (3)
querystringrequired
Name or username to search for (supports partial matches)
limitinteger
Maximum number of results to return
channelstring
Filter by channel. OMIT to search across all channels.
contacts_discover
Search for a contact on a live channel (Telegram, WhatsApp, etc.) before adding them. Use this to look up a person by username or phone number before calling contacts.sync. This is the right tool when asked to add or find a specific person by @username or phone (use contacts.sync afterwards to actually add them) β not group_discovery.
Parameters (2)
querystringrequired
Username, phone, or name to search for
channelstringrequired
Channel name: telegram, whatsapp, etc.
contacts_sync
Add a discovered contact and open a conversation thread. Returns thread_id for the new conversation. Call contacts.discover first to verify the contact exists.
Parameters (2)
identifierstringrequired
Username or phone number to add
channelstringrequired
Channel name: telegram, whatsapp, etc.
contacts_profile
π€ Get full profile for a contact: all channel identities, notes, role, capabilities, birthday.
When to use:
- After contacts.find to get complete info about a specific person
- To see all channels a contact is reachable on
- To read notes, role, or capabilities for a contact
Requires contact_id (entity_id) from contacts.find.
Parameters (1)
contact_idstringrequired
entity_id from contacts.find
contacts_update
βοΈ Update a contact's profile: name, notes, role, capabilities, birthday, preferred channel.
When to use:
- User wants to add notes about a contact
- User wants to set/update role or capabilities for a contact
- User wants to rename a contact or update birthday
Requires contact_id (entity_id) from contacts.find. At least one optional field must be provided.
Parameters (9)
contact_idstringrequired
entity_id from contacts.find
display_namestring
New display name (max 255 chars)
notesstring
Free-text notes/context about this contact. Empty string clears notes.
preferred_channelstring
Preferred channel for contacting this person. OMIT to leave the preferred channel unchanged.
rolestring
Contact role (e.g. developer, client, partner). Empty string clears role.
capabilitiesarray
List of capabilities (e.g. ['backend', 'design'])
birthday_monthinteger
Birth month 1-12 (must be set together with birthday_day)
birthday_dayinteger
Birth day 1-31 (must be set together with birthday_month)
birthday_yearinteger
Birth year 1900-2100 (optional, standalone)
contacts_add_channel
π Link a new channel identity (email, phone, LinkedIn, etc.) to an existing contact.
When to use:
- User learns a contact's email or phone and wants to save it
- User wants to link a LinkedIn/Instagram profile to an existing contact
- Adding a second channel for an existing person
Requires contact_id (entity_id) from contacts.find.
Parameters (4)
contact_idstringrequired
entity_id from contacts.find
channelstringrequired
Channel type to add
valuestringrequired
Email address, phone number, or username for this channel
display_namestring
Optional display label for this identity
contacts_capture_lead
π Save a website-chat visitor's details as a structured lead (contact + Contacts tab).
When to use:
- In a livechat conversation, AFTER the visitor has shared their name and email (plus company / use case if given) β e.g. when booking a demo.
- Call it once you have the details; then continue (e.g. share the booking link).
Creates/links a contact record and a lead entry. Only works inside a website-chat thread.
Parameters (5)
namestringrequired
The visitor's full name (as they gave it).
emailstring
The visitor's email address.
companystring
The visitor's company / organization, if mentioned.
use_casestring
Their main use case / what they want to do with DialogBrain, if mentioned.
phonestring
Phone number, if the visitor provided one.
group_search
Search for public groups or channels by topic on Telegram (or other channels). Returns matching groups with title, member count, and whether messages can be previewed.
Finds public groups/channels by topic β NOT individual people. To find or add a specific person by @username, use contacts.discover / contacts.find instead.
When to use:
- Finding groups related to a topic or niche
- Building a list of groups for outreach or monitoring
After searching, use group.scan to evaluate quality before joining.
Parameters (3)
channelstringrequired
Channel to search on (e.g. 'telegram')
keywordsstringrequired
Search keywords or phrase (e.g. 'crypto trading signals')
limitinteger
Maximum number of results to return (1-50, default 20)
group_add
Add a specific group to your discovery list by @username or invite link (t.me/...).
Groups and channels only β this does NOT add an individual person/contact. To add a person by @username (e.g. a customer or lead), use contacts.discover then contacts.sync instead.
When to use:
- You already know the group's @username or invite link
- Adding a known group without searching
Returns: group metadata including id, title, member_count.
Parameters (2)
channelstringrequired
Channel the group is on (e.g. 'telegram')
linkstringrequired
The group's @username or invite link (e.g. '@phuket' or 't.me/...')
group_list
List groups you've found and joined in this workspace.
Lifecycle values:
- discovered: found but not yet evaluated
- bookmarked: saved for later
- monitored: joined and actively syncing messages
- dismissed: hidden
By default, dismissed groups are excluded.
Returns: id, title, member_count, lifecycle, scan_status, overall_score.
Parameters (5)
channelstring
Filter by channel (e.g. 'telegram'). Optional.
lifecyclestring
Filter by state: discovered, bookmarked, monitored (=joined/syncing), dismissed. OMIT to include all states (dismissed excluded by default elsewhere).
min_scorenumber
Minimum overall score (0.0-1.0). Optional.
limitinteger
Maximum number of results (1-100, default 20)
offsetinteger
Pagination offset. OMIT to start at row 0 (default).
group_preview_messages
Read recent public messages from a group without joining it. Only works for groups where can_preview_history=true.
Use this to manually evaluate message quality before deciding to join. For an automated quality score, use group.scan instead.
Returns: list of recent messages with sender, text, date, is_reply.
Parameters (2)
group_idintegerrequired
ID of the discovered group (from group.search or group.list)
limitinteger
Number of recent messages to fetch (1-100, default 20)
group_scan
Scan a group to evaluate its quality before joining. Fetches recent messages, analyzes activity, spam, and engagement, then returns a quality score and plain-English verdict.
When to use:
- After finding groups with group.search
- Before deciding which groups to join
Returns: overall_score (0-1), is_disqualified, disqualify_reasons, individual scores, and a verdict string.
Parameters (1)
group_idintegerrequired
ID of the discovered group (from group.search or group.list)
group_join
Join a group and start syncing its messages to your inbox. The group must be in your discovery list (use group.search or group.add first).
What this does:
- Joins the group on Telegram (or other channel)
- Creates a thread in your inbox for syncing messages
- Optionally enables AI auto-reply drafts
Returns: success, thread_id, auto_reply_enabled.
Parameters (2)
group_idintegerrequired
ID of the discovered group (from group.search or group.list)
enable_auto_replyboolean
Enable AI auto-reply drafts for messages in this group. Drafts can be reviewed and sent manually. Default: true.
group_create
Create a new group on a channel (Telegram or WhatsApp). Returns the new group's chat ID and invite link.
What this does:
- Creates a new group with the specified title
- Returns chat_id, invite_link, and channel_ref for further operations
- Optionally registers the group in your inbox for monitoring
Returns: success, chat_id, channel_ref, title, thread_id.
Parameters (5)
titlestringrequired
Title/name of the group to create
aboutstring
Optional description or about text for the group
group_typestring
Type of group to create. Options: 'supergroup' (default), 'basic'. Telegram-only; ignored on WhatsApp.
channelstringrequired
Channel to create the group on (e.g., 'telegram', 'whatsapp')
register_in_inboxboolean
Auto-register the created group in your inbox for monitoring. Default: true.
group_add_member
Add a member to an existing group on Telegram or WhatsApp.
What this does:
- Adds the specified member to the group
- Resolves the member by username, phone number, or JID
- Reports if the member is already in the group
Returns: success, chat_id, member, already_member.
Parameters (3)
chat_idintegerrequired
ID of the group/channel to add the member to
memberstringrequired
The member to add (format depends on channel: @username on Telegram, phone on WhatsApp)
channelstringrequired
Channel where the group exists (e.g., 'telegram', 'whatsapp')
group_promote_admin
Promote a member to admin in an existing group on Telegram or WhatsApp.
What this does:
- Gives the specified member admin status in the group
- On Telegram, this grants visibility of all group messages (even if not a bot)
- Defaults to minimal/empty rights; specify custom rights if needed
Returns: success, chat_id, member.
Parameters (4)
chat_idintegerrequired
ID of the group/channel where the member will be promoted
memberstringrequired
The member to promote (format depends on channel: @username on Telegram, phone on WhatsApp)
rightsobject
Optional admin rights dict (Telegram-specific). If not provided, defaults to minimal/admin status only. Example: {"post_messages": true, "edit_messages": true}
channelstringrequired
Channel where the group exists (e.g., 'telegram', 'whatsapp')
files_ingest
Save and index a file into the knowledge base. Use this when the user asks to save, store, or remember a document. The file will be processed (OCR if needed) and indexed for future search.
Parameters (5)
file_idintegerrequired
ID of the file to ingest (from attachment_file_ids in context).
titlestring
Human-readable title for the file (e.g., 'Project Presentation', 'Q1 Report'). If not provided, uses original filename.
descriptionstring
Optional description of the file contents.
thread_idinteger
Optional thread ID to associate the file with. If not provided, uses context thread.
tagsarray
Optional list of tags for categorization (e.g., ['presentation', 'dextrade']).
files_read
Read **text content** of an attached file. Works for: .txt, .md, .json, code files, and PDFs (after files.ingest extracts text). DO NOT call on binary files β for IMAGES use `files.get_base64`, for AUDIO/VIDEO it cannot be transcribed via this tool, and for non-PDF DOCUMENTS run `files.ingest` first, THEN files.read. Calling on a binary mime-type returns an error β saves you a turn to read the routing hint before deciding.
Parameters (4)
file_idintegerrequired
ID of the file to read (from attachment_file_ids in context).
max_charsinteger
Maximum characters to return (default: 10000). Use smaller values for large files.
encodingstring
Text encoding to use (default: utf-8).
summarizeboolean
If true, generate AI summary instead of returning raw content. Use for 'summary', 'summarize', 'ΠΊΡΠ°ΡΠΊΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅' requests. OMIT to return raw content (the default).
files_upload
Upload a file to DialogBrain and get a file_id for use in messages_send.
When to use:
- User wants to send a file/image to a contact
- Before calling messages_send with an attachment
Returns: file_id (integer) to pass to messages_send attachments parameter.
Parameters (5)
contentstring
Base64-encoded file bytes. Either content OR source_url is required.
source_urlstring
Public URL to fetch file from. Either content OR source_url is required.
filenamestring
Filename with extension (e.g. 'photo.png')
mime_typestring
MIME type (e.g. 'image/png', 'application/pdf')
titlestring
Optional display title
images_generate
Generates a PNG image from a text prompt using Gemini 2.5 Flash Image. Returns a file_id consumable by messages.send(attachments=[...]) and other file-aware tools. Supports up to 12 reference image file_ids for subject-consistent edits and composition (use file IDs from the [ATTACHMENTS] block, files.search, or search.files). Latency: ~8-10s per image. Output: 1024Γ1024 PNG.
Parameters (3)
promptstringrequired
Text description of the image to generate (3-4000 chars).
reference_file_idsarray
Optional list of up to 3 file_ids whose images should be used as visual references (for edits, subject consistency, or composition). Files must be image MIME types (image/png, image/jpeg, image/webp, image/gif).
aspect_ratiostring
Output aspect ratio.
videos_generate
Generate a short video (5-10s) from a text prompt using BytePlus Seedance. Optionally accepts up to 12 image file IDs from the user's attached files (visible in the [ATTACHMENTS] block) as `reference_file_ids` for style and composition. Returns immediately with a job_id; the video is delivered back via continuation when the job completes (~30-90s for fast model, ~2-5min for pro). Reference images are temporarily re-hosted on a third-party CDN (imgbb) for the duration of generation and deleted on completion β don't submit confidential references. Gated behind a workspace opt-in flag.
Parameters (12)
promptstringrequired
Text description of the video to generate (3-4000 chars).
reference_file_idsarray
Optional list of up to 12 image file_ids to use as visual references (style, composition). Files must be image MIME types (image/png, image/jpeg, image/webp, image/gif). Get IDs from the [ATTACHMENTS] block, files.search, or search.files.
modelstring
Video model. Recommended: 'wan2.6-i2v-flash' (default, cheap, 720p/1080p, optional audio), 'wan2.6-i2v' (premium, always-on audio), 'wan2.6-t2v' (text-only input, 720p/1080p, no audio), 'wan2.2-i2v-flash' (cheapest, 480p/720p, no audio). Legacy BytePlus: 'seedance-2-fast', 'seedance-2-pro' (720p only).
durationinteger
Output video duration in seconds. Single-clip: 5 or 10. Long-form (chained, i2v models only): 15, 20, 30, 45, or 60. Long-form videos are silent (no audio in v1) and use only reference_file_ids[0] when refs are provided.
resolutionstring
Output resolution. '720p' is the safe default; '1080p' is wan2.6 only; '480p' is wan2.2-i2v-flash only. Per-model support enforced by validation.
aspect_ratiostring
Output aspect ratio. Wan supports '16:9', '9:16', '1:1'; Seedance also supports '4:3', '3:4', '21:9'. Per-model support enforced by validation.
generate_audioboolean
Whether the model should produce native audio. For wan2.6-i2v-flash this doubles the per-second rate (e.g., 720p+audio is $0.05/s vs $0.025/s silent) β set False for cheaper silent clips. wan2.6-i2v always produces audio regardless of this flag. wan2.6-t2v / wan2.2-i2v-flash / seedance-2-fast never produce audio.
negative_promptstring
Optional text describing what to AVOID in the output. Honored by Wan and Seedance models.
seedinteger
Random seed for reproducibility (0-2147483647). Omit for random.
shot_typestring
Shot mode: 'single' (continuous) or 'multi' (scene cuts). wan2.6-t2v only. OMIT to use the model default.
stylestring
Style preset. Seedance models only. OMIT for no style preset.
camera_motionstring
Camera motion preset. Seedance models only. OMIT for no camera motion.
images_search
Searches images in this workspace by visual content using vector embeddings (Voyage multimodal-3). Pass a text description; returns ranked file_ids with cosine scores and presigned download URLs. Up to 50 results.
Parameters (5)
querystringrequired
Text description of what you're looking for (3-4000 chars).
limitinteger
Max number of results.
score_thresholdnumber
Minimum cosine similarity (0.0 returns all, higher = stricter).
collection_idinteger
Optional β restrict to images attached to this collection. Filter is applied after RAG, so you may get fewer than `limit` results; pass a larger limit to broaden if needed.
mime_typestring
Optional β restrict to a specific image MIME (e.g. "image/png"). Filter is applied after RAG (same caveat as collection_id).
vision_query
Look at the screen currently being shared in a meeting and answer a question about it. Returns a natural-language answer based on the visual content. Use ONLY when the user explicitly asks about the screen/slide/document being shown.
Parameters (2)
questionstringrequired
Question about the shared screen.
image_b64string
Base64-encoded JPEG image of the screen-share frame.
youtube_list_videos
List videos on the connected YouTube channel. Returns id, title, published_at, view_count. Paginate via page_token.
Parameters (2)
page_tokenstring
Pagination cursor returned in a previous call's `next_page_token`. Omit for the first page.
max_resultsinteger
Page size, 1-50. Default 25.
youtube_list_comments
List comment threads on a YouTube video. Pass video_id (e.g. 'dQw4w9WgXcQ') or channel_ref ('youtube:video:<id>'). Returns top-level comments with inline replies.
Parameters (3)
video_idstringrequired
YouTube videoId β bare 11-char form OR full 'youtube:video:<id>'.
page_tokenstring
Pagination cursor from a previous call's `next_page_token`.
max_resultsinteger
Page size, 1-100. Default 25.
youtube_post_comment_reply
Post a comment on a YouTube video, or reply to an existing comment. Pass video_id for a top-level comment, OR parent_comment_id to reply. AI-disclosure suffix appended automatically when configured.
Parameters (3)
textstringrequired
Comment body. 1-10000 chars. AI-disclosure suffix may be auto-appended.
video_idstring
Bare videoId or 'youtube:video:<id>' β for a top-level comment.
parent_comment_idstring
Bare commentId or 'youtube:comment:<id>' β for a reply.
youtube_delete_comment
Permanently delete a YouTube comment by id (or 'youtube:comment:<id>'). Cannot be undone. Costs 50 quota units.
Parameters (1)
comment_idstringrequired
Bare commentId OR 'youtube:comment:<id>'.
youtube_delete_video
Permanently delete a YouTube video by id (or 'youtube:video:<id>'). Cannot be undone. Costs 50 quota units. Caller must own the channel.
Parameters (1)
video_idstringrequired
Bare videoId OR 'youtube:video:<id>'.
youtube_update_video
Update title, description, privacy, or tags on a YouTube video. Costs 1600 quota units. Only fields provided are changed.
Parameters (5)
video_idstringrequired
Bare videoId OR 'youtube:video:<id>'.
titlestring
New title (max 100 chars). Omit to keep current.
descriptionstring
New description (max 5000 chars). Omit to keep current.
privacystring
'private', 'unlisted', or 'public'. Omit to keep current.
tagsarray
New tags list. Omit to keep current.
youtube_moderate_comment
Apply a moderation status to a YouTube comment. Allowed status values: heldForReview, published, rejected, spam. Costs 50 quota units.
Parameters (2)
comment_idstringrequired
Bare commentId OR 'youtube:comment:<id>'.
statusstringrequired
One of: heldForReview, published, rejected, spam.
youtube_upload_video
Upload a workspace-owned video file (file_id) to the connected YouTube channel. Returns video_id + thread_id. Costs 1600 quota units. Default privacy is 'private' β pass privacy='public' to publish.
Parameters (8)
channel_account_idinteger
The connected YouTube channel_account.id. OMIT to auto-resolve the workspace's YouTube account.
file_idintegerrequired
Workspace `files.id` of the video to upload. Must be a video/* MIME type and `status='ready'`. Get IDs from the [ATTACHMENTS] block, files.search, or search.files.
titlestringrequired
Video title (max 100 chars).
descriptionstring
Video description (max 5000 chars). OMIT to upload without a description.
privacystring
Privacy status. 'private' (default), 'unlisted', or 'public'.
tagsarray
Optional list of tag strings (max ~500 chars total).
category_idstring
YouTube category ID (default '22' = People & Blogs). See https://developers.google.com/youtube/v3/docs/videoCategories/list.
made_for_kidsboolean
COPPA flag. OMIT for the standard (non-kids) default.
youtube_video_query
Ask Gemini about a YouTube video. Pass a video URL and any prompt β verbatim transcript with timestamps, summary, targeted Q&A about content or visuals, translation, etc. Works on any public/unlisted video.
Parameters (2)
urlstringrequired
YouTube video URL. Supported forms: youtube.com/watch?v=β¦, youtu.be/β¦, youtube.com/shorts/β¦, m.youtube.com/watch?v=β¦. Pass-through to Gemini verbatim.
promptstringrequired
What to ask Gemini about the video. Examples: 'Provide a verbatim transcript with [HH:MM:SS] timestamps.' / 'What is the main claim made in the first 30 seconds?' / 'Describe what's shown on screen at 0:30.' / 'Translate the spoken Spanish to English.'
instagram_publish_media
Publish a photo (IMAGE) or video (REELS) from workspace files to a connected Instagram Business/Creator account. Returns media_id + permalink. Instagram allows ~25 publishes per day.
Parameters (5)
file_idintegerrequired
Workspace files.id of the photo or video to publish.
captionstring
Post caption (max 2200 chars). OMIT to publish without caption.
media_typestring
'auto' (default, detects from mime), 'image', or 'reels'.
share_to_feedboolean
For Reels: also show on profile grid (default true).
location_idstring
Facebook Place ID for location tag.
instagram_update_media
Update the caption of a published Instagram photo or Reel. Only caption is editable after publish (Instagram limitation).
Parameters (2)
media_idstringrequired
Instagram media ID (from list_media or thread metadata).
captionstringrequired
New caption (max 2200 chars).
instagram_list_media
List photos and Reels on the connected Instagram Business/Creator account. Returns id, caption, media_type, permalink, thumbnail_url, timestamp.
Parameters (2)
limitinteger
Page size, 1-50. Default 25.
afterstring
Pagination cursor from a previous call's next_cursor.
files_info
Get metadata and download URLs for files by their IDs.
When to use:
- After messages_read_history returns attachment_file_ids
- To get a presigned download URL to read a received file
Returns: filename, mime_type, byte_size, download_url (1-hour presigned URL).
Parameters (1)
file_idsarrayrequired
List of file IDs (max 20)
files_get_base64
Download one or more files server-side and return their content as base64-encoded strings. Use this to inspect images, PDFs, or any binary file attached to messages when you cannot access presigned S3 URLs directly. Supports up to 5 files per call, max 15 MB each. For large files batch in groups of 1-2 to avoid oversized responses.
Parameters (1)
file_idsarrayrequired
List of file IDs to fetch as base64 (max 5). Get IDs from files.info or message attachment_file_ids.
messages_read_history
Read messages from a conversation thread. Use text_contains to find specific messages by content. Returns the most recent messages, including sender info and timestamps.
Voice calls: each row carries a `meta` object with allowlisted keys (`event_type` β 'call_started'|'call_ended'|null, `source` β 'voice_transcript'|null, `call_id`, `speaker_display_name`, `duration_seconds`, `outcome`, `direction`) plus per-message `channel`. To find calls without scanning every row, use `calls.list_history` instead.
Usage:
1. Get thread_id from threads.list first, OR
2. Use contact_name to auto-resolve thread_id
Examples:
- User: 'show me messages from chat with [contact]' β read_history(contact_name='[contact]', limit=10)
- User: 'last 5 messages from thread 571' β read_history(thread_id=571, limit=5)
Parameters (6)
thread_idstring
Thread ID to read messages from (e.g., '571' or 'telegram:571'). Optional if contact_name provided.
contact_namestring
Contact/thread name to search for (optional if thread_id provided). Example: 'Jane Smith', 'John Doe'
limitinteger
Maximum number of messages to return (default: 10, max: 100)
offsetinteger
Number of messages to skip (for pagination, default: 0)
include_outgoingboolean
Include messages sent by you (default: true)
text_containsstring
Filter: only return messages containing this text (case-insensitive substring match)
channels_connect_telegram_bot
π€ Connect a Telegram Bot (Bot API) channel from its bot token.
When to use:
- After a bot was created via @BotFather and you have its token.
- The token alone is sufficient β no Telegram user account is needed.
Validates the token, creates the channel account, and registers the webhook so the bot starts receiving messages immediately.
Parameters (1)
bot_tokenstringrequired
Telegram bot token from @BotFather (e.g. '123456789:ABCdef...').
threads_update
βοΈ Update a conversation thread: rename it, add notes/description, or move to a folder.
When to use:
- User wants to rename a chat or group
- User wants to add notes/context about a conversation
- User wants to organize threads into folders
For DM threads, renaming also updates the linked contact's display name by default.
Requires thread_id from threads.list.
Parameters (5)
thread_idstringrequired
Thread ID from threads.list
titlestring
New title for the thread (max 255 chars)
descriptionstring
AI context / notes for this thread. Empty string clears description.
folder_idinteger
Move thread to this folder (null removes from folder)
update_contactboolean
For DM threads, also rename the linked contact (default: true)
folders_create
π Create a new inbox folder to organize threads.
When to use:
- User wants to create a folder to group related conversations
- User wants to organize threads by topic, project, or contact type
After creating a folder, use threads.update with folder_id to move threads into it.
Parameters (2)
namestringrequired
Folder name (max 100 chars)
iconstring
Emoji icon for the folder (max 10 chars, optional)
folders_delete
ποΈ Delete an inbox folder. Threads inside become unfiled (not deleted).
When to use:
- User wants to remove a folder they no longer need
- User wants to clean up their inbox organization
Threads inside the folder are NOT deleted β they simply move back to the inbox.
Parameters (1)
folder_idintegerrequired
ID of the folder to delete
ai_tags_list
List all personal AI tags.
AI tags are automatic message filters: the system runs a lightweight classifier on every incoming message and applies matching tags to threads. This lets AI agents skip expensive full analysis on most messages β they only act on threads that match relevant tags, dramatically cutting LLM costs.
When to use:
- Check which auto-classification filters exist before creating one
- Get tag IDs for add_to_thread / remove_from_thread
- See how many threads each tag currently matches
Returns all tags with thread counts (non-archived, included threads only).
No parameters.
ai_tags_create
Create a new AI tag (automatic message filter).
AI tags are lightweight classifiers that run on every incoming message. When a message matches the tag's description/criteria, the thread is automatically labelled β so AI agents can cheaply pre-filter threads instead of running full LLM analysis on everything. Good descriptions are the key: they tell the classifier exactly when to apply this tag.
When to use:
- User wants to auto-classify incoming messages (e.g. bug reports, sales leads, support requests)
- User wants to reduce AI agent costs by pre-filtering threads by topic or intent
Tips for the description field:
- Be specific: 'Messages reporting errors, crashes, or unexpected behavior in the product'
- Include examples of what qualifies and what doesn't
Limit: 20 active personal tags / 50 active team tags.
Parameters (4)
namestringrequired
Tag name (max 100 chars)
descriptionstring
Classifier prompt: describe exactly when this tag should be applied to a thread. The more specific, the better the auto-classification accuracy. E.g. 'Messages reporting software errors, crashes, or unexpected behavior'. Max 500 chars.
iconstring
Emoji icon for the tag (max 10 chars, optional)
colorstring
Tailwind color key for the tag badge. Allowed: amber, blue, green, red, purple, yellow, slate. OMIT to use the default color.
ai_tags_update
Update an existing personal AI tag's name, description, icon, color, or active state.
When to use:
- User wants to rename a tag
- User wants to change a tag's icon, color, or description
- User wants to enable or disable a tag
Provide only the fields you want to change. At least one field is required.
Parameters (6)
tag_idintegerrequired
ID of the tag to update
namestring
New tag name (max 100 chars, optional)
descriptionstring
New LLM hint (max 500 chars; empty string clears it, optional)
iconstring
New emoji icon (max 10 chars, optional)
colorstring
New color key. Allowed: amber, blue, green, red, purple, yellow, slate. OMIT to leave the color unchanged.
is_activeboolean
Enable (true) or disable (false) the tag. OMIT to leave the active flag unchanged.
ai_tags_delete
Delete a personal AI tag. All thread associations are removed automatically.
When to use:
- User wants to permanently remove a tag they no longer need
This cannot be undone. Threads are NOT deleted β they just lose this tag.
Parameters (1)
tag_idintegerrequired
ID of the tag to delete
ai_tags_add_to_thread
Apply one or more AI tags to a thread (manually).
When to use:
- User wants to label a conversation with one or more tags
- User asks to categorize or tag a thread
Provide the thread_id (integer) and an array of tag_ids to apply.
If a tag is already applied it will be updated to is_manual=true.
Parameters (2)
thread_idintegerrequired
ID of the thread to tag
tag_idsarrayrequired
Array of tag IDs to apply (1β20 IDs)
ai_tags_remove_from_thread
Remove a specific AI tag from a thread.
When to use:
- User wants to un-label or remove a specific tag from a conversation
- User wants to correct an incorrectly applied tag
Provide both thread_id and tag_id.
Parameters (2)
thread_idintegerrequired
ID of the thread to remove the tag from
tag_idintegerrequired
ID of the tag to remove
ai_filters_list
List all AI filters for the current workspace.
AI filters are semantic intent-based message filters that use embeddings (vector representations) to detect whether an incoming message matches a specific intent or topic. Unlike keyword filters, they understand meaning: 'I need help with my order' and 'my package hasn't arrived' both match a 'shipping support' filter even without shared keywords.
Each filter stores a reference embedding of its description. When a message arrives, its embedding is compared via cosine similarity against the filter's reference vector. If the similarity exceeds the threshold, the filter matches.
When to use:
- Check which semantic filters already exist before creating a new one
- Get filter IDs for use in trigger conditions
- Review thresholds and active status of existing filters
Returns all filters with id, name, description, threshold, and is_active.
No parameters.
ai_filters_create
Create a new AI filter for semantic intent-based message matching.
AI filters use vector embeddings (via Voyage AI) to detect whether an incoming message matches a specific intent or topic. The filter's description is embedded as a reference vector at creation time. When a message arrives, its embedding is compared against this reference using cosine similarity.
The description field is the most important part β it becomes the reference embedding that all incoming messages are compared against. Write it as a clear statement of what kind of messages should match:
- 'Customer asking about pricing, subscription plans, or billing'
- 'User reporting a bug, crash, or unexpected behavior in the product'
- 'Inbound sales lead expressing interest in purchasing or trialing'
The threshold controls sensitivity: 0.5 is a balanced default, lower values (0.3) cast a wider net, higher values (0.8) require closer matches.
Note: This tool calls the Voyage AI embedding API to generate the reference vector.
Parameters (3)
namestringrequired
Filter name β a short, human-readable label (max 100 chars)
descriptionstringrequired
Reference text that defines what messages should match this filter. This text is embedded as a vector and used for cosine similarity comparison against all incoming messages. Be specific and descriptive β the quality of this text directly determines filter accuracy. E.g. 'Customer asking about pricing, subscription costs, or billing issues'. Max 500 chars.
thresholdnumber
Cosine similarity threshold for a message to be considered a match. Range 0.1β1.0. Default 0.50. Lower values (e.g. 0.3) are more permissive and catch more messages. Higher values (e.g. 0.8) require closer semantic similarity.
ai_filters_update
Update an existing AI filter's name, description, threshold, or active state.
When to use:
- User wants to rename a filter
- User wants to refine the filter description to improve match accuracy
- User wants to adjust the similarity threshold (higher = stricter matching)
- User wants to enable or disable a filter without deleting it
Provide only the fields you want to change. At least one field is required.
Note: If the description is changed, this tool calls the Voyage AI embedding API to re-generate the reference vector with the new description text.
Parameters (5)
filter_idintegerrequired
ID of the filter to update
namestring
New filter name (max 100 chars, optional)
descriptionstring
New reference description text. If changed, the Voyage AI embedding API is called to re-generate the reference vector. Max 500 chars. Optional.
thresholdnumber
New cosine similarity threshold. Range 0.1β1.0. Optional.
is_activeboolean
Enable (true) or disable (false) the filter. OMIT to leave the active flag unchanged.
ai_filters_delete
Permanently delete an AI filter.
When to use:
- User wants to remove a filter they no longer need
This action cannot be undone. Any triggers that reference this filter by ID will no longer match it β review and update those triggers after deletion.
Parameters (1)
filter_idintegerrequired
ID of the filter to delete
ai_filters_test
Test a message against an AI filter to check whether it would match.
This tool embeds the provided message using Voyage AI and computes the cosine similarity between the message vector and the filter's stored reference vector. It returns the similarity score, whether the message would match (similarity >= threshold), and the filter's threshold value.
Use this to:
- Verify a filter works as intended before using it in a trigger
- Tune the threshold by testing borderline messages
- Debug why a message did or did not match a filter in production
Returns: {similarity: float, matched: bool, threshold: float}
Note: This tool calls the Voyage AI embedding API to embed the test message.
Parameters (2)
filter_idintegerrequired
ID of the filter to test against
messagestringrequired
The message text to test. This is embedded and compared against the filter's reference vector via cosine similarity.
messages_send
Send a message to a thread, channel, or contact. Supports Telegram, Email, LinkedIn, and other connected channels. For LinkedIn posts (comment_thread kind), this posts a comment on the post. Can automatically resolve recipients and channels when not specified. Can send files/images/documents as attachments β pass `attachments=[file_id, ...]` with integer file IDs obtained from collections.list_files, search.files, or files.search. `text` is optional when attachments are provided.
Parameters (8)
thread_idstring
Target thread. OMIT to reply in the same chat you received the triggering message from β the backend defaults to the current thread. Pass an explicit value ONLY to reply in a DIFFERENT thread, and only use: (a) a numeric DB thread id from search.threads, or (b) a channel_ref like 'telegram:-12345'. NEVER use a chat-type word (dm, group, channel, livechat) β those are category labels from the SITUATION block, not ids.
recipient_namestring
Name of person to send to (e.g., 'Jane', 'John'). Tool will auto-resolve channel. Optional if thread_id provided.
recipient_usernamestring
Telegram @username to message (e.g. '@some_username'). Use this for a Telegram user NOT yet in contacts β it resolves the handle, adds the contact, and creates the thread. Telegram only; for existing contacts prefer thread_id or recipient_name.
textstring
Message text to send. Optional if attachments provided.
reply_to_message_idstring
ID of message to reply to (optional)
formatstring
Message format
attachmentsarray
Array of integer file IDs to send as attachments (images, documents, any files). Get file IDs from collections.list_files (field `file_id`), search.files (field `file_id`), or files.search. Example: [302237]. The file must already exist in the workspace (status=ready) β no separate upload step needed. When attachments are provided, `text` becomes optional (a caption can be included alongside).
silentboolean
Send without notification
messages_send_email
Compose and send an email β with subject, CC/BCC, and attachments. Use for email; for chat messages (Telegram/WhatsApp/livechat) use messages.send instead.
Parameters (6)
recipient_emailstring
Recipient email address (e.g. 'john@example.com'). Provide to start a new email thread; OMIT to reply in the current email thread.
subjectstring
Email subject line. Required for new emails; for replies it auto-generates 'Re: ...' when omitted.
textstring
Email body.
attachmentsarray
Array of integer file IDs to attach.
ccarray
Email addresses to CC. OMIT to skip.
bccarray
Email addresses to BCC. OMIT to skip.
messages_delete
Delete a message from a thread. Supports Telegram, WhatsApp, and other connected channels. Note: Some channels have time limits on message deletion.
Parameters (2)
thread_idstringrequired
Thread/channel ID containing the message
message_idstringrequired
ID of the message to delete
messages_forward
Forward a message from one thread to another. Supports native Telegram forwarding (preserves original sender attribution) and text-based forwarding for cross-channel scenarios.
Parameters (4)
source_thread_idstringrequired
Thread containing the message to forward (e.g., 'telegram:123456' or numeric DB ID)
source_message_idstringrequired
ID of the message to forward
dest_thread_idstring
Destination thread to forward into. Provide at least one of dest_thread_id or recipient_name. To forward into the active conversation, pass the current thread_id. (If both are provided, dest_thread_id wins and recipient_name is ignored.)
recipient_namestring
Name of person to forward to (channel auto-resolved). Provide at least one of dest_thread_id or recipient_name. Use only when forwarding to a different contact than the current conversation.
knowledge_query
Answer questions using knowledge base (uploaded documents, handbooks, files).
Use for QUESTIONS that need an answer synthesized from documents or messages.
Returns an evidence pack with source citations, KG entities, and extracted numbers.
Modes:
- 'auto' (default): Smart routing β works for most questions
- 'rag': Semantic search across documents & messages
- 'entity': Entity-centric queries (e.g., 'Tell me about [entity]')
- 'relationship': Two-entity queries (e.g., 'How is [entity A] related to [entity B]?')
Examples:
- 'What did we discuss about the budget?' β knowledge.query
- 'Tell me about [entity]' β knowledge.query mode=entity
- 'How is [A] related to [B]?' β knowledge.query mode=relationship
NOT for finding/listing files, threads, or links β use search.files / search.threads / search.links for that.
Parameters (8)
questionstringrequired
The question to answer from user's knowledge base. Required even for entity queries.
max_sourcesinteger
Maximum number of sources to consider (1-10)
include_relationshipsboolean
Include KG relationships in answer (default: true for entity mode)
file_idsarray
Specific file IDs to search within (for pinned files)
thread_idstring
Limit search to a specific thread/chat
date_fromstring
Filter messages from this date (ISO format: YYYY-MM-DD). Use for time-based queries like 'this week', 'last month'.
date_tostring
Filter messages until this date (ISO format: YYYY-MM-DD).
needs_aggregationboolean
True if query asks for totals/sums/counts.
kg_find_entity
Find an entity by name in the Knowledge Graph.
USE WHEN user mentions a person, project, company by name and you need:
- To resolve a name to entity_id for subsequent queries
- 'ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π°Π΄ X?' β find X first
- 'Π Π°ΡΡΠΊΠ°ΠΆΠΈ ΠΏΡΠΎ Y' β find Y first
RETURNS entity_id for use in kg.get_relationships or kg.explore.
ALWAYS use this as the FIRST step in KG query chains.
Parameters (3)
namestringrequired
Entity name to search for. Can be in any language (Russian, English, etc.) - transliteration is automatic.
entity_typestring
Filter by entity type:
- 'person': People, contacts
- 'project': Projects, tasks
- 'organization': Companies, teams
- 'event': Meetings, deadlines
- 'topic': Discussion topics
- 'location': Places, addresses
- 'document': Files, documents
- 'workspace': User's own facts (my/our company)
OMIT to include all entity types.
limitinteger
Maximum results to return (1-10). Default: 5
kg_get_relationships
Get relationships for a specific entity from Knowledge Graph.
USE WHEN:
- 'ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π°Π΄ X?' - filter by works_on
- 'Π‘ ΠΊΠ΅ΠΌ ΠΎΠ±ΡΠ°Π»ΡΡ Y?' - filter by discussed_with
- 'ΠΡΠΎ ΠΈΠ· ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Z?' - filter by member_of
- 'Π§ΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ W?' - no filter, get all
REQUIRES: entity_id from previous kg.find_entity step.
Use: {{step_N.entity_id}} where N is the find_entity step number.
Parameters (4)
entity_idstringrequired
Entity ID from kg.find_entity step. Use {{step_N.entity_id}} reference.
Maximum relationships to return (1-50). Default: 20
calendar_create_event
Create a new event in Google Calendar. Specify the title, start time, end time, and optionally invite attendees. Use ISO 8601 format for dates (e.g., 2024-12-15T14:00:00).
Parameters (13)
summarystring
Event title/summary. Required. Also accepts 'title' as alias.
titlestring
Alias for summary - event title.
startstring
Event start time in ISO 8601 format (e.g., 2024-12-15T14:00:00). Also accepts 'start_time' as alias.
start_timestring
Alias for start - event start time in ISO 8601 format.
endstring
Event end time in ISO 8601 format. If not provided, defaults to 1 hour after start. Also accepts 'end_time' as alias.
end_timestring
Alias for end - event end time.
descriptionstring
Event description/notes.
locationstring
Event location (physical address or virtual meeting link).
attendeesarray
List of attendee email addresses to invite.
calendar_idstring
Calendar ID to create event in. Defaults to primary calendar.
timezonestring
Timezone for the event (e.g., 'America/New_York', 'UTC').
add_google_meetboolean
If true, automatically creates a Google Meet link for the event. OMIT to skip Meet link.
conference_dataobject
Conference data for Google Meet. Alternative to add_google_meet flag.
calendar_list_events
List events from Google Calendar. Shows upcoming events by default. Can filter by date range and search query.
Parameters (5)
calendar_idstring
Calendar ID to list events from. Defaults to primary calendar.
date_fromstring
Start date/time to query (YYYY-MM-DD or ISO 8601 format). Defaults to now. Alias: time_min.
date_tostring
End date/time to query (YYYY-MM-DD or ISO 8601 format). Defaults to 7 days from now. Alias: time_max.
max_resultsinteger
Maximum number of events to return.
querystring
Free text search query to filter events.
calendar_update_event
Update an existing event in Google Calendar. Can modify title, time, location, description, and attendees. Only specified fields will be updated.
Parameters (8)
event_idstringrequired
ID of the event to update. Required.
summarystring
New event title/summary. Optional.
startstring
New start time in ISO 8601 format. Optional.
endstring
New end time in ISO 8601 format. Optional.
descriptionstring
New event description. Optional.
locationstring
New event location. Optional.
attendeesarray
New list of attendee emails. Replaces existing attendees.
calendar_idstring
Calendar ID containing the event. Defaults to primary.
calendar_delete_event
Delete an event from Google Calendar. This action cannot be undone. Use with caution.
Parameters (3)
event_idstringrequired
ID of the event to delete. Required.
calendar_idstring
Calendar ID containing the event. Defaults to primary.
send_notificationsboolean
Whether to send cancellation notifications to attendees.
calendar_check_availability
Check when you have free time in Google Calendar. Shows busy periods and free slots in a given time range. Useful for finding meeting times or checking schedule conflicts.
Parameters (5)
start_timestring
Start date/time to check availability (YYYY-MM-DD or ISO 8601). Defaults to start of today.
end_timestring
End date/time to check availability (YYYY-MM-DD or ISO 8601). Defaults to end of start_time day, or 7 days from now.
calendar_idstring
Calendar ID to check. Defaults to primary calendar.
working_hours_onlyboolean
If true, only show free slots during working hours (9 AM - 6 PM). OMIT to show all free time (the default).
min_duration_minutesinteger
Minimum duration in minutes for free slots. Filters out short gaps. Default: 30 minutes.
web_search
Search the web for current information, news, facts, prices, or events. Use this when the user asks about something that requires up-to-date information from the internet, or when internal knowledge base doesn't have the answer. Examples: recent news, stock prices, weather, product information, current events.
Parameters (3)
querystringrequired
Search query - what to search for on the web.
num_resultsinteger
Number of results to return (1-10).
search_typestring
Type of search: 'search' for general web, 'news' for news articles.
web_fetch
Fetches a single URL and returns its content. Use this when you have a specific URL in mind β for example, after web.search returns a link you want to read, or when the user pastes a URL.
Modes (extract):
- 'auto' (default): picks the right mode based on response content type.
- 'markdown': for HTML pages; returns cleaned markdown plus the page <title>.
- 'text': for JSON/XML/plaintext APIs; returns the raw decoded body.
- 'file': for images, PDFs, audio, video, archives, or any binary β ingests the bytes into the user's file storage and returns a file_id you can pass to messages.send (to send as an attachment), agents.add_file (to add to agent knowledge), or files.read.
Use web.fetch (not files.upload) when you need the file_id immediately for the next tool call β files.upload(source_url=β¦) is async and won't have the file ready in the same turn.
Use web.search (not web.fetch) when you don't have a specific URL yet and need to find one.
Parameters (2)
urlstringrequired
URL to fetch (http or https). Must be publicly reachable.
extractstring
How to handle the response: 'auto' (default), 'markdown' (HTML β markdown), 'text' (raw body), or 'file' (ingest as binary, return file_id).
web__local_search
Multi-source web research with citations. Returns a synthesized answer with numbered [^1] markers and a citations array of {url, title, snippet, index}. Use for evidence-backed synthesis (competitive analysis, regulatory summary, whitepaper section). For quick fact lookups use web.search instead.
Parameters (3)
querystringrequired
Research question. Specific scoped questions outperform vague keywords.
num_sourcesinteger
How many top search results to fetch and synthesize (1-4, default 4). Lower = faster + cheaper, higher = more comprehensive.
languagestring
Search language hint (BCP-47, e.g. 'en', 'ru'). Defaults to 'en'. The synthesis output language matches the query language regardless.
documents_create
Render a document (PDF / HTML / PPTX / DOCX) and save it to the workspace.
This tool has two input pipelines β pass **exactly one** of `content_html` or `content_markdown`.
# Pipeline A β `content_html` (canonical for decks, proposals, designed pages)
You author full HTML+CSS. A baked-in design-system preamble ships first
(`<style>` with Inter/Manrope as data-URI fonts, CSS-variable palette tokens,
8px spacing scale, and pre-styled layout helpers); your markup and any of
your own `<style>` blocks land after the preamble so you can override
anything. Chromium renders the assembled document into a static PDF β
JavaScript is disabled and DNS is blackholed, so external font / image /
script fetches will fail by configuration.
Required when this pipeline is used:
- `title` β human-readable, used for PDF metadata and the saved filename.
- `content_html` β the `<body>` and any custom `<style>` blocks. The
renderer wraps this in `<html>β¦</html>` and injects the preamble + a
canonical `<meta charset>` + `<title>`. Do NOT emit `<script>`,
`<iframe>`, `<object>`, `<embed>`, `<meta>`, `<link>`, `<base>`,
`<form>`, or event handlers β the sanitizer strips them.
- `output_type` β `"pdf"` or `"html"`. (`"pptx"` and `"docx"` require
`content_markdown` since they need structured markdown intermediates.)
Optional:
- `page_preset` β `"slide_16_9"` (default for any deck), `"a4"` (default
for flowing documents β used if omitted), `"letter"`, or `"none"` (you
declare your own `@page` rule).
- `design_tokens` β flat dict overriding the preamble's CSS variables.
Whitelisted keys: `brand_primary`, `accent`, `surface_dark` (hex color),
`font_display`, `font_body` (font name from ['Inter', 'Manrope', 'monospace', 'sans-serif', 'serif', 'system-ui', 'ui-monospace', 'ui-sans-serif', 'ui-serif']).
- `language` β BCP-47 tag (default `"en"`). Drives `<html lang>`.
## Slide structure (`page_preset="slide_16_9"`)
Each slide is `<section class="slide β¦">β¦</section>`. The base `.slide`
class is what sizes it to the viewport and forces the page break β do
not drop it. Composable variants (apply alongside `.slide`):
- `.slide-cover` β gradient hero, big display title.
- `.slide-split` β two equal columns, image + narrative.
- `.slide-stats` β three-up KPI cards (use `<div class="stat">` with
`.stat-value` + `.stat-label` inside).
- `.slide-quote` β centered pull quote + `<cite>` attribution.
Layout helpers (work in any preset): `.grid-2`, `.grid-3`, `.split`,
`.stack`, `.cluster`, `.callout`, `.muted`, `.kbd`.
## Speaker notes
`<aside class="notes">β¦textβ¦</aside>` inside a `<section class="slide">`.
The sanitizer strips them from the rendered PDF and returns them as
`slide_notes[]` (parallel to slide order). Orphan notes outside any slide
are dropped with a warning.
## Images
Only these `src` schemes resolve:
- `file:NNN` β workspace `file_id`.
- `data:image/...;base64,...` β inline.
- `https://<host>` where `<host>` β `DOCUMENTS_MEDIA_URL_ALLOWLIST`.
Other URLs are dropped and replaced with an HTML comment placeholder.
# Pipeline B β `content_markdown` (invoice / contract only)
Required:
- `title`, `content_markdown`, `output_type`.
Optional:
- `theme` β `"invoice"` or `"contract"`. Triggers the corresponding
exemplar styling and (for invoices) the arithmetic validator that
fail-closes on missing or mismatched totals.
- `language` β BCP-47 (default `"en"`).
# Delivery contract (CRITICAL)
After this tool returns `file_id`, deliver the file with
`messages.send(attachments=[file_id], text="<short caption>")`. Embedding
the file_id in a markdown link, `sandbox:` URL, or `/api/files/<id>/download`
text will render as plain text on the recipient's channel β the
`attachments` parameter is the only way the file actually attaches.
# Exemplars
INVOICE (English):
# Invoice INV-{YYYYMMDD-HHMMSS}
**From:** {Issuer Legal Name}, {Address}, {Tax ID}
**To:** {Customer Name}, {Customer Address}, {Customer Tax ID}
**Issue date:** {YYYY-MM-DD} **Due date:** {YYYY-MM-DD}
| Description | Qty | Unit price | Total |
|---|---:|---:|-
Parameters (8)
titlestringrequired
Short human-readable title for the document.
content_htmlstring
Full HTML body (with optional <style> blocks) for the canonical Chromium pipeline. Mutually exclusive with content_markdown.
content_markdownstring
Markdown body for the invoice/contract pipeline. Mutually exclusive with content_html.
Page geometry for content_html. 'slide_16_9' = 1280x720 deck, 'a4'/'letter' = flowing document, 'none' = LLM declares its own @page. Defaults to 'a4' inside the html branch when omitted. Rejected with content_markdown.
design_tokensobject
Flat dict of CSS-variable overrides for content_html. Whitelisted keys: brand_primary, accent, surface_dark (hex color), font_display, font_body (Inter|Manrope|system-ui|ui-sans-serif|ui-serif|ui-monospace|sans-serif|serif|monospace). Unknown keys / invalid values are dropped with a warning. Rejected with content_markdown.
themestring
Invoice or contract styling for content_markdown. Rejected with content_html (use design_tokens + your own CSS instead). OMIT for default (unthemed) styling.
languagestring
BCP-47 language tag (e.g. 'en', 'ru', 'zh', 'ja'). Drives <html lang> and (markdown path) font fallback for non-Latin scripts.
agents_list
List all AI agents configured in the workspace.
Returns agents with their basic info, trigger count, and knowledge collection count.
Each agent's `description` field tells you when that agent is useful. If you're a router-style agent deciding whether to delegate via `agent.handoff`, read descriptions and pick the best fit.
Use this to:
- See all configured AI agents
- Filter by status (active/paused/archived)
- Get agent IDs for further operations
Parameters (1)
statusstring
Filter by status ('active' / 'paused' / 'archived'). Omit for all.
agents_get
Get detailed information about a specific AI agent.
Returns full agent config including:
- Execution configuration
- Tool configuration
- Knowledge configuration
- Escalation configuration
- Triggers list
- Knowledge collections
- Custom AI instructions (prompt_text)
- Auto-reply rules override (auto_reply_rules)
Parameters (1)
agent_idintegerrequired
ID of the AI agent to fetch
agents_create
Create a new AI agent in the workspace.
Execution modes:
- ai_assisted (default, recommended): Two-phase AI β fast pre-classifier (Haiku) for keyword filtering and simple replies, then full AI with tools for complex messages. Best for: auto-replies, group monitoring, keyword-based filtering.
- agentic: Autonomous multi-step agent with planning and tool execution. Best for: complex scheduled tasks, multi-step automation.
- rule_based: Simple pattern matching without AI.
For keyword filtering: use ai_assisted mode + set keywords in trigger conditions (free, deterministic) and/or auto_reply_rules (smart, LLM-based) via agents.update.
Parameters (8)
namestringrequired
Name of the AI agent (1-100 characters)
descriptionstring
Optional description of what this agent does
text_enginestring
Text-execution engine: 'rule_based', 'ai_assisted', 'agentic' (default), or 'claude_channels'. Voice is derived from triggers, not engine. OMIT to use the default ('agentic').
send_modestring
Default send mode: 'auto' or 'draft'. OMIT to use 'draft' (the default).
prompt_idinteger
ID of the prompt to assign to this agent
modelstring
LLM the agent runs on. OMIT to use the platform default (deepseek-chat). Applied right after creation so you don't need a follow-up agents_update.
allowed_toolsarray
Explicit allow-list of tool IDs the agent may call on triggered runs (e.g. ['workbench.run_python', 'messages.send']). OMIT to use system defaults. Applied right after creation.
max_iterationsinteger
Hard cap on agentic-loop turns per run (1-50). OMIT for the default (10).
agents_update
Update an existing AI agent's configuration.
All parameters are optional β only provided fields will be updated.
Use this to:
- Enable or disable an agent
- Change agent name or description
- Assign or detach a prompt
- Change default send mode
- Replace knowledge collections
- Update agent status
- Change agent priority for trigger matching (lower number = higher priority)
- Override which tools the agent can/can't call on triggered runs
- Override which context sections (situation, communication style, job state, conversation history, thread summary) the agent receives
- Opt into boilerplate prompt sections (safety guidelines, data confidentiality, factual accuracy) β all default OFF
Parameters (47)
agent_idintegerrequired
ID of the agent to update
namestring
New name for the agent
descriptionstring
New description for the agent
prompt_idinteger
Prompt ID to assign (null to detach)
send_modestring
Default send mode: 'auto' or 'draft'. OMIT to leave the send-mode unchanged.
knowledge_collection_idsarray
Replace all knowledge collections with these IDs (empty list = clear all)
statusstring
Agent status: 'active', 'paused', or 'archived'. OMIT to leave the status unchanged.
text_enginestring
Text-execution engine: 'agentic', 'ai_assisted', 'rule_based', or 'claude_channels'. Replaces the legacy execution_mode field (20260523_002). Voice is now derived from triggers, not engine. OMIT to leave unchanged.
modelstring
Canonical source for which LLM the agent runs on. To switch models pass JUST this β do NOT also rewrite prompt_text (any 'duty model' section in the prompt is stale doc, not the config). OMIT to leave the model unchanged.
max_iterationsinteger
Hard cap on agentic-loop turns (LLM round-trips) per run, 1-50 (default 10). Each turn can call tools; the loop stops when the model replies with no tool call OR this cap is hit. Raise it for multi-step tool chains (e.g. browser automation: open β snapshot β fill β confirm β reply) that otherwise exhaust their turns before producing a final answer. OMIT to leave it unchanged.
api_surfacestring
OpenAI HTTPS endpoint for this agent's LLM calls (Phase 3a). 'chat_completions' (default, also when null) routes to /v1/chat/completions. 'responses' routes to /v1/responses β required for OpenAI native server tools (web_search, code_interpreter, image_generation, input_file PDFs). Capability still wins: agents whose tool list triggers the server_tool_responses_api substitution always route to Responses regardless of this setting. Ignored on non-OpenAI models (Anthropic, DeepSeek, Moonshot). OMIT to leave the api_surface unchanged.
prompt_textstring
DESTRUCTIVE β REPLACES the entire system prompt. Pass ONLY when the user explicitly asks to edit/rewrite the prompt. To READ the prompt use prompts.get. When updating other fields (model, name, β¦) OMIT this. To append, prompts.get first then concatenate. Pass null to revert to the linked template.
auto_reply_rulesstring
Plain-English rules injected into the fast model's system prompt as a `## Rules` block. No reserved keywords β the fast model reads them as guidance and decides per turn whether to reply directly or escalate to the main model for tools. Example: '- If the user greets, reply "Hi! How can I help?"\n- If the user asks what you can do, reply with a 1-sentence summary\n- If the question needs live data (prices, stock, booking), escalate'
Engagement filtering (SKIP) belongs in trigger `conditions` (keywords, ai_filters, channel_types, cooldown), NOT here β if a message should be ignored the trigger shouldn't have fired. Pass null to clear.
priorityinteger
Agent priority for trigger matching. LOWER number = HIGHER priority (wins tiebreaks). Typical range 1-100. Fallback auto-reply agents use 10; specialised/topical agents use 100. When two agents match the same incoming message, the one with the lower priority number fires.
vision_enabledboolean
Per-agent opt-in for vision content. When true, the executor splices recent image attachments from the active thread into the LLM call (Phase 3a continuous vision for Meet bot screen-share, plus any future channel that uploads images). Requires the agent's model to support vision (model_has_vision check). Default false; new calls pay zero token cost until the operator opts in. OMIT to leave the vision flag unchanged.
allowed_toolsarray
Explicit allow-list of tool IDs this agent can call on triggered runs (e.g. ['messages.send', 'agent.handoff']). Empty list [] = clear the allow-list and fall back to system defaults. When set, only these tools (minus denied_tools) are exposed to the agent. Does NOT affect the My AI dropdown path.
denied_toolsarray
Block-list of tool IDs the agent must not call on triggered runs. Applied after allowed_tools and default visibility. Empty list [] = clear the block-list.
include_situationboolean
Include situation context (channel, sender info, trigger type) in the agent's prompt. OMIT to leave this flag unchanged.
include_learned_styleboolean
Include learned communication style (per-contact tone, dormancy state) in the agent's prompt. OMIT to leave this flag unchanged.
include_job_stateboolean
Include current job state (active job context, tasks, notes) in the agent's prompt. OMIT to leave this flag unchanged.
include_conversation_historyboolean
Include recent messages from this thread (up to 20) in the agent's prompt. OMIT to leave this flag unchanged.
include_thread_summaryboolean
Include condensed summary of older thread messages in the agent's prompt. OMIT to leave this flag unchanged.
include_tool_call_historyboolean
Include the agent's own tool calls and results from the last 3 runs on this thread, compacted to IDs + top hits (~200-1000 tokens). Lets the agent recall file IDs, search hits, and decisions it already made across turns. Default ON. Agentic mode only. OMIT to leave this flag unchanged.
include_safety_guidelinesboolean
Inject the generic Safety Guidelines block (~80 tokens) into the system prompt. Default OFF β enable only if you don't already write safety rules in your Instructions. Agentic mode only. OMIT to leave this flag unchanged.
include_data_confidentialityboolean
Inject the Data Confidentiality block (~250 tokens, cross-contact PII isolation + prompt-injection defense) into the system prompt. Recommended for multi-tenant workspaces. Default OFF. Agentic mode only. OMIT to leave this flag unchanged.
include_factual_accuracyboolean
Inject the Factual Accuracy block (~100 tokens, generic anti-hallucination rules) into the system prompt. Default OFF β skip if you write domain-specific accuracy rules in Instructions. Agentic mode only. OMIT to leave this flag unchanged.
include_specialistsboolean
Inject a [SPECIALISTS] block (~50β200 tokens) listing the workspace's delegation-capable agents so a router-style agent can pick a handoff target without first calling agents.list. Default OFF for new agents; the Router template ships with this ON. Agentic mode only. OMIT to leave this flag unchanged.
fast_modelstring
Model for the fast-path responder (voice, text auto-reply, agent executor). Defaults to deepseek-chat when unset. Non-Anthropic models (deepseek-chat, gpt-4.1-nano, kimi-k2.6) do NOT use BYOK today β they use the system API key + credits. Pass null to revert to default.
fast_prompt_overridestring
Full fast-path prompt override. Placeholders substituted via .replace(): {message}, {history}, {rules}, {tools}, {output_contract}. agent.prompt_text is NOT injected into fast_prompt_override β include it yourself if you want it. Pass null to clear.
scriptstring
rule_based deterministic action (no LLM): Python run in the workbench sandbox on each matched event. Reads `inputs` (raw_data, message_id, from_name, β¦) and calls the agent's integrations via call_tool('ext<id>_<name>', {..}). Dedupe writes on inputs['message_id'] (retries re-run). Pass null to clear (falls back to per-trigger template).
voice_primary_modelstring
Primary LLM for voice turns (e.g. 'gpt-4.1-mini', 'claude-haiku-4-5-20251001'). gpt-4.1-nano is too weak for reliable turn tracking; mini is the recommended floor. Pass null to revert to default.
voice_max_tokensinteger
Max TTS tokens per voice reply (40-200, default 100). Lower = snappier, higher = more detail.
voice_max_tool_callsinteger
Max tool calls per voice turn (1-10, default 3). OMIT to leave unchanged.
voice_stt_modelstring
Speech-to-text model: 'flux' (alias for flux-general-en), 'flux-general-en' (English Flux, LLM-powered end-of-turn), 'flux-general-multi' (multilingual Flux), or 'nova-3' (silence-based fallback). Flux variants are more responsive; nova-3 is the fallback when your Deepgram plan lacks Flux. OMIT to leave the STT model unchanged.
voice_stt_languagestring
STT language hint. 'multi' (default) enables code-switching; singletons like 'en', 'ru', 'es' give higher accuracy when the caller language is known. Use 'multi' for bilingual callers. OMIT to leave the STT language unchanged.
voice_stt_keytermsarray
Domain-vocab bias for STT β names, product SKUs, etc. Passed verbatim as repeated `&keyterm=<w>` query params. Works on both Nova-3 and Flux. Prefer short phrases over full sentences. Empty list [] = no bias. Omit leaves unchanged.
TTS voice id β provider-specific (e.g. 'aura-2-thalia-en' for Deepgram, 'alloy' for OpenAI, 'alena' for Yandex, Cartesia voice UUID). Pass null to revert to provider default.
voice_tts_languagestring
TTS language code, BCP-47 lite e.g. 'en', 'es', 'pt-BR' (Cartesia only, default 'en').
voice_tts_speednumber
TTS playback speed multiplier (0.5-2.0, default 1.0). Yandex/OpenAI/Cartesia only β ignored for Deepgram.
voice_endpointing_min_delaynumber
Silence after end-of-utterance before agent replies (0.1-2.0s, default 0.3). Higher = fewer false interrupts; lower = snappier.
voice_interruption_min_durationnumber
Min caller speech duration to interrupt the agent (0.1-1.5s, default 0.25). Higher = ignore short fillers like 'uh-huh'.
voice_greetingstring
Opening line the agent speaks when the call connects. Pass an empty string "" to clear. Omit or null leaves unchanged.
voice_filler_enabledboolean
Emit 'thinking' filler audio while tools run so the caller hears life on the line (default true). OMIT to leave this flag unchanged.
voice_greeting_interruptibleboolean
Allow the caller to barge in during the opener TTS. Default true (trial-friendly β long greetings can be interrupted). Set false on outbound-call agents whose configured opener would otherwise get preempted by the caller's 'Hello?' triggering an off-script auto-turn. OMIT to leave this flag unchanged.
voice_preemptive_generationboolean
Speculatively start the LLM on STT partials so the agent begins responding before end-of-utterance. Matches LiveKit stock template. Default true. OMIT to leave this flag unchanged.
voice_thinking_textsarray
Pool of phrases spoken while the agent sets up the turn before calling the LLM (e.g. ['Hmm', 'So', 'One sec']). Pre-rendered to PCM at call start; one is picked at random per turn so the agent doesn't repeat the same word. Pass [] to clear. Omit or null leaves unchanged.
agents_delete
Permanently delete an AI agent.
WARNING: This cannot be undone. The agent and all its triggers will be removed.
Parameters (1)
agent_idintegerrequired
ID of the agent to delete
agents_ask
Send a message to an AI agent and get its response.
The agent runs with its configured prompt, tools, and knowledge.
Use this to test agents or have them process a task.
Returns: {status: 'replied'|'silent', response_text, messages[], full_reply, model_used, tokens_*, send_mode, execution_mode, tool_calls[]}. `tool_calls[]` is the per-tool trace in call order β each {tool, success, error, duration_ms} β so you can see which tool the agent ran and why it failed (e.g. a workbench script error) directly from this response, no trace lookup needed. `messages[]` carries each messages.send invocation the agent made (text, subject, reply_to_message_id, timestamp, message_id, attachments=[{file_id,name,mime}]). `full_reply` concatenates text only β attachment-only sends show up in `messages` but not `full_reply`. `status='silent'` iff both response_text is empty AND messages is empty.
Execution may take 10-60s depending on agent complexity.
Parameters (3)
agent_idintegerrequired
ID of the AI agent to ask
messagestringrequired
Message/goal to send to the agent
send_modestring
Send mode for the agent run: 'draft' = create drafts, 'auto' = send directly. Defaults to the agent's configured default_send_mode. Does NOT change execution_mode β that is fixed by the agent's config.
agents_trigger_create
Create a new trigger for an AI agent.
Triggers determine when the agent activates.
Trigger types:
- incoming_message: Activates on new incoming messages
- schedule: Activates on a schedule
- webhook: Activates on webhook events
- event: Activates on system events
Parameters (7)
agent_idintegerrequired
ID of the agent to create a trigger for
trigger_typestringrequired
Type of trigger: 'incoming_message', 'incoming_call', 'schedule', 'webhook', 'event', 'blockchain_event', 'job_completed', or 'calendar_event'
conditionsobject
Trigger conditions (JSON). Supported fields for incoming_message:
- keywords: ["pricing","demo"] β message must contain keyword(s) (free, no LLM cost)
- keyword_match: "any" (default, OR) or "all" (AND)
- channel_types: ["telegram","whatsapp","livechat_voice","twilio_voice","telegram_voice","voice",...] β filter by channel. For voice, use EITHER the three per-channel keys (scoped) OR "voice" alone (wildcard matching all three) β mixing them is redundant. Per-channel keys: "livechat_voice" (web widget), "twilio_voice" (PSTN inbound), "telegram_voice" (Telegram p2p calls)
- context_types: ["dm","group","channel","livechat"] β filter by chat type
- group_mode: "mentions_only" or "questions" β for group chats
- channel_account_ids: ["123"] β restrict to specific accounts
- folder_ids: [5,10] β restrict to threads in folders
- ai_tag_ids: [1,2] β restrict to threads with AI tags
- ai_filter_ids: [1,2] β semantic intent filters (message matched via embedding similarity, works in noisy groups)
- ai_filter_mode: "any" (default, OR) or "all" (AND) β how multiple AI filters combine
- ai_filters: [{id: 1}, {name: "...", description: "..."}] β shorthand: reference existing by id or create inline (calls Voyage embedding API). If a filter with the same name already exists, it is reused by id. Prefer referencing existing filters by id when available. Use ai_filters.create + ai_filters.test for fine-tuning before assigning.
- contact_states: ["active"] β filter by contact state
- cooldown_seconds: 30 β min gap between runs per thread
- max_runs_per_thread_per_hour: 5 β rate limit
Supported fields for job_completed (proactive callback when a delegated job finishes):
- source_agent_id: <int> β fire only when this agent's job completed
- source_agent_slug: <str> β alternate to source_agent_id
- job_type: "agentic_session" β match a specific job type (default: any)
- outcome: ["completed"] | ["escalated"] | ["completed","escalated"] β default ["completed"]
- min_duration_seconds: <int> β skip very-short jobs (noise filter)
- thread_filter: {thread_ids: [<int>...]} β restrict to specific threads
Supported fields for calendar_event (fires N minutes before a Google Calendar event starts):
- window_minutes_before: <int 1-1440> β REQUIRED, fire when an event starts within this window
- channel_account_ids: [<int>...] β restrict to specific calendar accounts (default: all)
- keywords: ["standup"] β word-boundary match on event title
- prepare_meet_join: true β pre-invite pool bots to the event (enables unattended Meet join)
Generic run-mode fields (incoming_message AND calendar_event):
- run_mode: "text" (default, normal agent run) or "voice" (deterministically join the meeting/call resolved from the event or message β requires send_mode=auto)
- voice: {speak_first: <bool β greet immediately vs stay silent until addressed>, vision_mode: "off"|"on_demand"|"continuous_0_3fps"}
thread_idsarray
Restrict this trigger to specific threads (chats) by their numeric thread IDs. When set, the trigger only fires for messages in these threads. Maps to conditions.thread_filter.thread_ids.
send_modestring
Send mode override for this trigger. OMIT to inherit from the agent.
enabledboolean
Whether the trigger is enabled. OMIT to use the default (true).
priorityinteger
Trigger priority β lower numbers run first (default: 100)
agents_trigger_update
Update an existing AI agent trigger.
All parameters are optional β only provided fields will be updated.
Parameters (8)
trigger_idintegerrequired
ID of the trigger to update
agent_idintegerrequired
ID of the agent that owns this trigger
trigger_typestring
New trigger type. OMIT to keep the existing type unchanged.
conditionsobject
New trigger conditions (replaces existing). Same fields as trigger_create:
keywords, keyword_match, channel_types, context_types, group_mode,
channel_account_ids, folder_ids, ai_tag_ids,
ai_filter_ids, ai_filter_mode,
ai_filters: [{id: 1}, {name: "...", description: "..."}] β shorthand: reference existing by id or create inline (calls Voyage embedding API). If a filter with the same name already exists, it is reused by id.
contact_states, cooldown_seconds, max_runs_per_thread_per_hour.
calendar_event: window_minutes_before (1-1440, required), channel_account_ids, keywords, prepare_meet_join.
Generic (incoming_message + calendar_event): run_mode "text"|"voice" (voice requires send_mode=auto), voice: {speak_first, vision_mode}
thread_idsarray
Restrict this trigger to specific threads (chats) by their numeric thread IDs. When set, merged into conditions.thread_filter.thread_ids. If conditions is also provided, thread_ids is merged into it.
send_modestring
New send mode override. OMIT to leave the send-mode unchanged.
enabledboolean
Enable or disable this trigger. OMIT to leave the enabled flag unchanged.
priorityinteger
Trigger priority β lower numbers run first
agents_trigger_delete
Delete a trigger from an AI agent.
WARNING: This cannot be undone.
Parameters (2)
trigger_idintegerrequired
ID of the trigger to delete
agent_idintegerrequired
ID of the agent that owns this trigger
agents_list_drafts
List pending agent drafts awaiting approval.
Shows drafts that have been generated by AI agents but not yet sent.
Each draft includes:
- Thread/conversation info
- Trigger message (what prompted the reply)
- Generated response text
- Creation time and expiration
Use this when user asks:
- 'Show pending agent drafts'
- 'What messages are waiting for approval?'
- 'List drafts to approve'
Parameters (2)
thread_idstring
Filter by specific thread ID (optional)
limitinteger
Maximum number of drafts to return
agents_approve_draft
Approve a pending agent draft and send the message.
The draft will be sent to the conversation it was generated for.
You can optionally edit the text before sending.
Use this when user says:
- 'Approve this draft'
- 'Send this reply'
- 'Approve and send'
- 'Looks good, send it'
IMPORTANT: This will send a message to a real person.
Parameters (2)
draft_idintegerrequired
ID of the draft to approve
edited_textstring
Optional edited response text (if user wants to modify before sending)
agents_reject_draft
Reject a pending agent draft without sending.
The draft will be marked as rejected and won't be sent.
Use this when the generated response isn't appropriate.
Use this when user says:
- 'Reject this draft'
- 'Don't send this'
- 'Cancel this reply'
- 'Delete this draft'
- 'This response is wrong'
Parameters (2)
draft_idintegerrequired
ID of the draft to reject
reasonstring
Optional reason for rejection (for logging/feedback)
agents_list_files
List files directly attached to this agent (agent-specific files, not shared collections).
Returns file_id, title, status, and chunk_count for each file.
chunk_count shows how many indexed chunks were created β 0 means the file is still processing.
Use agents.add_file to attach a new file, or agents.remove_file to detach one.
Parameters (1)
agent_idintegerrequired
ID of the agent whose files to list
agents_add_file
Attach a file to this agent's private knowledge (agent-specific files, not shared with other agents).
Workflow:
1. Upload the file with files_upload (pass source_url for remote files)
2. Index it with files_ingest (pass the file_id)
3. Call this tool with agent_id + file_id
Returns chunk_count β shows 0 while still processing. Call agents.list_files later to see the final chunk count once indexing completes.
Parameters (2)
agent_idintegerrequired
ID of the agent to attach the file to
file_idintegerrequired
file_id returned by files_upload or files_ingest
agents_remove_file
Remove a file from this agent's private knowledge.
The file itself is not deleted β it's just detached from this agent.
Use agents.list_files to find the file_id to remove.
Parameters (2)
agent_idintegerrequired
ID of the agent to remove the file from
file_idintegerrequired
ID of the file to detach (from agents.list_files)
agents_task_complete
Report that a Claude Code agent task has been completed. Call this when you finish processing an agent_task from DialogBrain.
Parameters (3)
trace_idstringrequired
Trace ID from the agent task event
successbooleanrequired
Whether the task completed successfully
summarystring
Brief summary of what was done
agent_handoff
Delegate a multi-step task (research, composing messages, booking, scheduling) to the full agentic planner. Use when a user ask needs more than a direct answer. The specialist runs synchronously β its response is already shown to the user in real-time. Summarize the OUTCOME in past tense (e.g. 'The Media Creator generated your video' or 'The Document Composer failed because...'). Do NOT say 'I will delegate' β the delegation already happened. If status is `timeout` or `error`, explain what went wrong and offer to retry.
Parameters (4)
task_descriptionstringrequired
Plain-language description of what the planner should accomplish. Include everything the planner needs: the user's goal, constraints, and any context already gathered in this voice call.
agent_idinteger
Optional ID of another agent in the same workspace to delegate the task to. When set, this becomes cross-agent delegation; the target agent runs with ITS OWN prompt, tools, and model. Use this for specialty tasks (see agents.list to discover specialists). Prefer the in-loop variant (no `agent_id`) for one-off escalations. Spawns a new trace linked back to this trace via parent_trace_id (visible in the admin lineage card).
modestring
Execution mode: 'sync' (wait for result, default) or 'async' (fire and forget, child runs in background). Async is only available in background/trigger context.
target_slugstring
Optional stable slug of a system-template specialist to delegate to (e.g. 'doc-composer' for the Document Composer). Env-portable alternative to agent_id β resolves the workspace's fork of that template (auto-forking on first use). Used by async handoffs that target a specialist without knowing its per-workspace id.
agent_silence
End this turn without sending any message. Use when the thread is owned by a human operator after job.escalate, when the guest is self-resolving, when the message is a duplicate, or for observation-only turns. Calling this tool is the ONLY correct way to stay silent β narrated silence text (e.g. '*(Staying silentβ¦)*', 'Internal:β¦') would be delivered to the guest verbatim.
Parameters (1)
reasonstringrequired
Free-form explanation for admin audit. Stored in trace_tool_executions.tool_params (ClickHouse String; reason filters are scan-only).
agents_traces_list
List recent execution traces for an agent β the same data as /admin/requests, scoped to one agent and readable by an LLM.
Use this when an agent call timed out, drafted the wrong response, or you want to know which tool/LLM call burned the latency. Pair with `agents.trace_get` for full detail on a specific trace.
Filters: `status`, `success`, `source` (single value or comma-separated: `agent,voice`), `date_from`/`date_to` (ISO-8601), pagination via `limit`/`offset`.
Returns `returned_count`, `dropped_on_page` (should be 0 β positive means the backend agent_id predicate let something through), and `has_more`. Edge case: a raw page of all-dedup-dropped rows yields `returned_count=0, has_more=true`; re-call with `offset += limit`.
Parameters (8)
agent_idintegerrequired
Agent ID to pull traces for (must belong to your workspace).
statusstring
Filter by status. OMIT to include all statuses.
successboolean
Filter to succeeded (true) or failed (false) runs only. OMIT to include both.
sourcestring
Filter by trace source. Single value or comma-separated, e.g. 'agent,voice'. Values: agent / auto_reply / agentic / outreach / voice. Note: source='agent' also matches voice traces today (known upstream bug).
limitinteger
Max rows per page (1β100).
offsetinteger
Rows to skip for pagination. OMIT to start at row 0 (default).
date_fromstring
ISO-8601 lower bound on created_at, e.g. '2026-04-10T00:00:00Z'.
date_tostring
ISO-8601 upper bound on created_at.
agents_trace_get
Fetch the full execution detail for a single trace β tool executions, events timeline, LLM call spans (with error_message on failures).
Use after `agents.traces_list` identifies a specific trace of interest (failed run, slow run, unexpected outcome).
By default LLM `system_prompt` and `prompt_messages` are stripped β set `include_llm_bodies=true` to fetch them when diagnosing prompt engineering issues (emits a WARNING audit log). Set `full=true` to disable all field truncation. `completion_text` on failed LLM calls is always returned (capped at 8 KB).
Parameters (4)
trace_idstringrequired
Trace identifier returned by agents.traces_list.
agent_idintegerrequired
Expected agent_id β used for scope validation. Mismatch returns not_found.
include_llm_bodiesboolean
Include system_prompt and prompt_messages in LLM spans. Audited at WARNING level. OMIT to keep them stripped (the default).
fullboolean
Disable all field truncation. Escape hatch for a human operator. OMIT for the standard truncated view.
agents_traces_stats
Aggregated trace statistics for one agent over the last N days β total runs, success rate, avg duration, error breakdown, top tools used, runs-per-day histogram.
Use this when you want a bird's-eye view of an agent's health before diving into individual traces with `agents.traces_list` / `agents.trace_get`. Scoped to the target agent (exact match, no substring bleed). `days` is capped at 30 β matches the ClickHouse request_traces TTL.
Parameters (2)
agent_idintegerrequired
Agent ID to compute stats for (must belong to your workspace).
daysinteger
Rolling window in days (1β30).
agents_activity
See what you β or another agent in your workspace β actually did over a time window: messages sent, documents created, calls made, plus a summary (run counts, per-day, top tools). Use this to answer 'what did I do today / yesterday / last week / in the last hour?' or 'what did <agent> do?' with real data instead of guessing.
Omit `agent` for your own activity, or pass another workspace agent's name, slug, or id. Pass `since`/`until` as ISO datetimes (e.g. '2026-06-03T09:00:00') for sub-day windows like the last hour, or plain dates ('2026-06-03') for whole days β compute them from the current date/time you were given. Defaults to the last 24h. Traces are retained 30 days.
Times are interpreted as UTC β if the current time you were given is in another timezone, convert to UTC before passing since/until.
Parameters (4)
agentstring
Target agent: name, slug, or numeric id. OMIT for yourself.
sincestring
Window start β ISO datetime or date. OMIT for last 24h.
untilstring
Window end β ISO datetime or date (exclusive day-end for a bare date). OMIT for now.
limitinteger
Max actions / recent runs to return.
agents_prompt_history
List past versions of an agent's `prompt_text`. Every edit to the agent's prompt is snapshotted to an append-only table β use this tool to browse history, find a prior known-good version, and copy it into `agents.prompt_restore`.
Parameters (3)
agent_idintegerrequired
ID of the agent
limitinteger
Max versions to return (1-200, default 50)
before_versioninteger
Cursor: return versions strictly below this version_number
agents_prompt_restore
Restore a past version of an agent's `prompt_text` by version_number. Creates a new version pointing at the restored content β history is preserved. Use `agents.prompt_history` first to find the version_number you want.
Parameters (3)
agent_idintegerrequired
ID of the agent
version_numberintegerrequired
The version_number to restore (get it from agents.prompt_history)
reasonstring
Optional: why this restore is happening (shows up in history UI)
agents_simulate_inbound
Replay an inbound message on a thread through the real trigger pipeline and return what would have happened. The router auto-picks the winning enabled agent + trigger by priority/specificity (same logic as production). By default send_mode='draft' so no real message is sent; pass send_mode='auto' on a test account to let the matched agent actually deliver (drafts get overwritten by the next draft, so 'auto' is the only way to verify Telegram/email delivery end-to-end).
Use to verify routing for a thread: which agent answers, which trigger wins, or β when nothing matches β the structured skip reason. Pass blockchain_tx_data instead of message_text to simulate a blockchain:transfer event on the thread.
Returns: {matched: true, matched_agent: {id, name, execution_mode}, matched_trigger: {id, trigger_type, conditions, specificity_score}, routing_reason, response_text, messages[], execution_mode, send_mode, model_used, tokens_input, tokens_output, latency_ms, rag_queries_made, rag_results_used} on a hit, or {matched: false, skip_reason, simulator_warnings} on a miss.
Parameters (6)
thread_idintegerrequired
Thread ID to route the simulated event from. Must belong to the API key's workspace.
message_textstring
Inbound message body to simulate. Defaults to '[MCP simulation test]' when omitted.
blockchain_tx_dataobject
When set, simulate a blockchain:transfer event instead of a channel:message:new event. Expected keys: chain, to_address / from_address, tx_hash.
attachment_file_idsarray
Optional list of workspace file IDs to attach to the simulated inbound message β same shape as a real Telegram message with image/document attachments. Use this to test agent behavior on incoming messages that carry images (e.g. logos for invoices) or documents the agent must reference. File IDs must belong to the API key's workspace.
send_modestring
How the matched agent should deliver its reply. 'draft' (default, safe) creates a draft only β no real send, no idempotency key. 'auto' lets the agent deliver through the channel adapter exactly as it would in production β use this on a test account to verify Telegram/email delivery end-to-end. Drafts get overwritten by the next draft on the thread, so 'auto' is required when you want to see the message persisted.
system_messageobject
Tag the simulated inbound as a system/service-message row (missed call, group join, pinned message, etc.) so the `excluded_system_message_kinds` trigger filter can be exercised end-to-end. Shape: {"category": <one of call_event | membership_change | contact_signup | pinned_message | chat_metadata_change | voice_chat_event | other_service>, "native_kind": <free-form upstream event class name, e.g. 'MessageActionPhoneCall'>}. The category is written into `message.meta.system_message` (mirroring the real Telegram ingest path) AND surfaced on the synthetic IncomingEvent so the trigger evaluator honors the block-list. Omit for a normal text-message simulation.
agents_update_from_template
Update a forked agent's instructions (prompt) to the latest version of the system template it was created from.
Use when the platform has improved a template and the user wants their forked agent to pick up the new prompt. This OVERWRITES the agent's prompt_text with the template's current prompt β any customizations to the prompt are replaced (recoverable via prompt history). Tool/model/execution settings are NOT changed. Only works on agents forked from a template (not from-scratch agents or templates themselves).
Parameters (1)
agent_idintegerrequired
ID of the forked agent to update from its template
agents_set_integration
Enable or disable a connected workspace integration on an AI agent β this controls which ext<id>_<name> integration tools the agent (and its sandboxed workbench runs) may call. Use integrations_list to get the workspace_integration_id.
When enabling with no explicit denied_tools, WRITE-class tools are auto-disabled by default (read tools stay on); pass denied_tools=[] to force-allow everything, or a list of ext slugs / bare tool names to block specific ones. Idempotent upsert β safe to call repeatedly.
Parameters (4)
agent_idintegerrequired
ID of the agent to configure
workspace_integration_idintegerrequired
ID of the connected integration (from integrations_list)
enabledboolean
True to enable the integration on this agent, False to disable
denied_toolsarray
Optional explicit block-list of tool names to deny (ext slugs or bare names). Omit to auto-deny WRITE-class tools on first enable; pass [] to allow all.
agents_list_integrations
List the workspace integrations enabled (or available) for an AI agent, with each one's workspace_integration_id, provider, enabled flag, and count of denied tools. Use this to see what an agent can call before toggling with agents_set_integration.
Parameters (1)
agent_idintegerrequired
ID of the agent to inspect
collections_list
List all knowledge collections in the workspace.
Collections are named groups of files used for RAG search. Auto-created collections (per-agent, per-prompt) are hidden by default.
Parameters (1)
include_inactiveboolean
Include inactive collections. OMIT to list only active collections (the default).
collections_create
Create a named knowledge collection.
Collections group files for RAG search. After creating, add files with collections.add_file and assign to agents with collections.assign_agent.
Parameters (2)
namestringrequired
Collection name (must be unique per user)
descriptionstring
Optional description of the collection
collections_delete
Delete a knowledge collection.
If the collection is assigned to agents, prompts, or channels, pass force=true to delete anyway. CASCADE removes all assignments automatically.
Parameters (2)
collection_idintegerrequired
ID of the collection to delete
forceboolean
Force delete even if collection is in use. OMIT for the safe default (refuse to delete in-use collections).
collections_add_file
Add a file to a knowledge collection.
The file must be uploaded and indexed first (files_upload + files_ingest). If the file was previously removed, it is re-enabled.
Parameters (2)
collection_idintegerrequired
ID of the collection
file_idintegerrequired
ID of the file to add (from files_upload)
collections_remove_file
Remove a file from a knowledge collection.
The file itself is not deleted β only the collection membership is removed.
Parameters (2)
collection_idintegerrequired
ID of the collection
file_idintegerrequired
ID of the file to remove
collections_list_files
List all files in a knowledge collection with their indexing status and chunk counts. Each returned file has a `file_id` (integer) that can be passed to messages.send as `attachments=[file_id]` to send the file to a contact, or to files.read to read its text content.
Parameters (1)
collection_idintegerrequired
ID of the collection
collections_assign_agent
Assign a knowledge collection to an AI agent.
Once assigned, the agent's knowledge.query will automatically scope RAG search to files in its assigned collections.
Parameters (2)
collection_idintegerrequired
ID of the collection to assign
agent_idintegerrequired
ID of the AI agent
collections_unassign_agent
Remove a knowledge collection from an AI agent.
The collection and its files are not deleted β only the agent assignment is removed.
Parameters (2)
collection_idintegerrequired
ID of the collection to unassign
agent_idintegerrequired
ID of the AI agent
prompts_list
List all prompt templates in this workspace.
Returns id + name + description + category so you know which prompt_id to use in prompts.get or prompts.update.
No parameters.
prompts_get
Get full content of a prompt template: system instructions (prompt_text) and auto-reply rules.
Run prompts.list first to find the prompt_id.
Parameters (1)
prompt_idintegerrequired
ID of the prompt template to fetch
prompts_update
Update a prompt template's name, system instructions, or auto-reply rules.
Changes affect every agent using this template, unless the agent has its own override (set via agents.update β prompt_text).
All parameters except prompt_id are optional β only provided fields are updated.
Parameters (5)
prompt_idintegerrequired
ID of the prompt template to update
namestring
New name for the prompt template
descriptionstring
New description for the prompt template
prompt_textstring
The AI system prompt: persona, tone, rules, behavior.
auto_reply_rulesstring
Pre-classifier rules that run BEFORE the main AI. Format: bullet list of conditions β actions (SKIP / SIMPLE_REPLY / SEARCH / CALENDAR). Pass null to clear.
prompts_prompt_history
List past versions of a prompt template's `prompt_text`. Every edit is snapshotted to an append-only table β use this to browse history and find a version_number for `prompts.prompt_restore`.
Parameters (3)
prompt_idintegerrequired
ID of the prompt template
limitinteger
Max versions to return (1-200, default 50)
before_versioninteger
Cursor: return versions strictly below this version_number
prompts_prompt_restore
Restore a past version of a prompt template by version_number. Creates a new version pointing at the restored content β history is preserved. Fans out to every agent using this template without a per-agent override; the response includes `affected_agents` as a receipt of the fan-out.
Parameters (3)
prompt_idintegerrequired
ID of the prompt template
version_numberintegerrequired
The version_number to restore (get it from prompts.prompt_history)
reasonstring
Optional: why this restore is happening (shows up in history UI)
widgets_list
List all livechat widgets.
Returns widgets with their configuration, embed code, and status.
Use this when user wants to see their widgets or chat widgets.
Parameters (1)
active_onlyboolean
Only return active widgets. OMIT to include inactive widgets too.
widgets_create
Create a new livechat widget for your website.
The widget will be created with default settings.
You can customize theme, auto-reply mode, and more.
Use this when user wants to add a chat widget to their site.
Parameters (7)
namestringrequired
Name for the widget (e.g., 'Website Chat', 'Support Widget')
auto_reply_modestring
Auto-reply mode: 'draft' (review before sending) or 'auto' (send immediately)
primary_colorstring
Primary color for widget theme (hex, e.g., '#2563eb')
positionstring
Widget position on screen
header_titlestring
Title shown in chat header
display_modestring
Visual mode of the widget. Pick exactly one:
- 'chat' (default): full chat panel + voice mic β use for support / sales / general.
- 'voice_only': mic-only bubble that launches a voice call directly β pick only when the user explicitly asks for a voice-only widget (e.g. 'just a voice button', 'no chat, just call').
- 'headless': no UI; customer drives via window.DialogBrain JS API β pick only when the user explicitly says 'embed in our own design' / 'no widget chrome'.
voice_button_labelstring
Localized aria-label and hover tooltip for the voice-only mic bubble (only used when display_mode='voice_only'). β€ 100 chars. Defaults to 'Talk to agent' if omitted.
widgets_update
Update an existing livechat widget configuration.
You can change name, theme, auto-reply mode, and other settings.
Only provided fields will be updated.
Use this when user wants to modify their chat widget settings.
Parameters (27)
widget_idintegerrequired
ID of the widget to update
namestring
New name for the widget
auto_reply_modestring
Auto-reply mode: 'draft' or 'auto'. OMIT to leave the auto-reply mode unchanged.
primary_colorstring
Primary color for widget theme (hex, e.g., '#2563eb')
positionstring
Widget position on screen. OMIT to leave the position unchanged.
header_titlestring
Title shown in chat header
header_subtitlestring
Subtitle shown in chat header
is_activeboolean
Enable or disable the widget. OMIT to leave the active flag unchanged.
allowed_domainsarray
List of allowed domains for the widget
calendly_urlstring
Booking URL for calendar action (e.g., 'https://calendly.com/yourname')
contact_form_fieldsarray
Fields to collect in contact form (e.g., ['name', 'email', 'phone'])
require_identificationboolean
Require visitor to identify before chatting. OMIT to leave the identification policy unchanged.
identification_fieldsarray
Fields to require for visitor identification (e.g., ['name', 'email'])
website_urlstring
Website URL for product/site search integration
enable_search_actionboolean
Enable or disable the search action button. OMIT to leave this flag unchanged.
enable_form_actionboolean
Enable or disable the contact form action button. OMIT to leave this flag unchanged.
enable_calendar_actionboolean
Enable or disable the calendar booking action button. OMIT to leave this flag unchanged.
greeting_textstring
Custom greeting message shown when visitor opens the chat (e.g., 'Hello! How can I help you today?')
returning_greeting_textstring
Greeting for returning visitors who already have chat history (e.g., 'Welcome back! How can I help you today?'). Falls back to greeting_text if not set.
greeting_enabledboolean
Enable or disable the proactive greeting. OMIT to leave this flag unchanged.
greeting_delay_secondsinteger
Delay in seconds before the proactive greeting appears (0β300). 0 = send immediately on page load. Default: 30.
greeting_behaviorstring
notification = show badge after delay; auto_open = open widget automatically after delay; on_open = greet only when visitor manually opens. OMIT to leave the greeting behavior unchanged.
color_schemestring
Widget color scheme. 'auto' follows the visitor's OS dark/light mode preference. OMIT to leave the color scheme unchanged.
show_visitor_historyboolean
Show full chat history to returning visitors. OMIT to leave this flag unchanged.
voice_greetingstring
Spoken opening line when a visitor starts a voice call through this widget. Played via TTS before the AI model runs. Empty string disables the greeting.
display_modestring
Visual mode of the widget. Pick exactly one:
- 'chat': full chat panel + voice mic β default for support / sales / general.
- 'voice_only': mic-only bubble that launches a voice call directly β pick only when the user explicitly asks for a voice-only widget.
- 'headless': no UI; customer drives via window.DialogBrain JS API β pick only when the user explicitly says 'embed in our own design'.
OMIT to leave the display mode unchanged.
voice_button_labelstring
Localized aria-label and hover tooltip for the voice-only mic bubble (only used when display_mode='voice_only'). β€ 100 chars. Defaults to 'Talk to agent' if not set.
widgets_delete
Delete a livechat widget permanently.
This will remove the widget and its embed code will stop working.
Existing chat history will be preserved.
Use this when user wants to remove a chat widget.
Parameters (1)
widget_idintegerrequired
ID of the widget to delete
widgets_get_embed_code
Get the embed code snippet for a livechat widget.
Returns HTML/JavaScript code to add to your website.
The code should be placed before the closing </body> tag.
Use this when user wants to install the chat widget on their site.
Parameters (1)
widget_idintegerrequired
ID of the widget to get embed code for
widgets_get
Get full configuration of a single livechat widget.
Returns all settings including theme, identification, actions, and more.
Use this when user wants to see or verify a specific widget's settings.
Parameters (1)
widget_idintegerrequired
ID of the widget to retrieve
linkedin_search
Search LinkedIn for people, companies, jobs, or posts. Supports filtering by keywords, location, industry, network distance, and more. Use linkedin.search_filters first to resolve filter keywords to LinkedIn parameter IDs.
Parameters (10)
categorystring
What to search for
keywordsstring
Search keywords
apistring
LinkedIn product to search with
locationarray
Location filter IDs (use linkedin.search_filters to resolve)
industryarray
Industry filter IDs
network_distancestring
Connection degree: F=1st, S=2nd, O=3rd+
has_job_offersboolean
Filter for people with job offers
rolestring
Role/title filter
urlstring
Direct LinkedIn search URL (alternative to keyword/filter search)
limitinteger
Maximum results to return
linkedin_search_filters
Get LinkedIn search filter parameter IDs. LinkedIn uses internal IDs instead of text for search filters (location, industry, etc.). Call this before linkedin.search to resolve filter keywords to their LinkedIn parameter IDs.
Parameters (3)
typestringrequired
Filter category to resolve (e.g. LOCATION, INDUSTRY, SKILL)
keywordsstringrequired
Keywords to resolve to parameter IDs (e.g. 'Thailand' for LOCATION)
limitinteger
Max results per filter category
linkedin_get_profile
Get a LinkedIn user profile by ID, public identifier (vanity name), or profile URL. Returns name, headline, location, and other profile information.
Parameters (1)
identifierstringrequired
LinkedIn member ID, public identifier (vanity name), or full profile URL
linkedin_get_company
Get a LinkedIn company profile by company ID or vanity name. Returns company name, description, industry, size, and other details.
Parameters (1)
identifierstringrequired
Company ID or vanity name
linkedin_update_profile
Update the authenticated user's own LinkedIn profile. Supports adding/editing experience entries (role, company, skills, dates). Also supports updating location. Headline, summary, education are NOT supported by the API.
Parameters (2)
locationobject
Location to set on profile (requires LinkedIn location ID)
experienceobject
Add or edit a professional experience entry
linkedin_invite
Send a connection invitation to a LinkedIn user. Optionally include a personalized message (max 300 characters). Rate limited: LinkedIn allows 80-100 invitations per day, max 200 per week.
Parameters (2)
provider_idstringrequired
LinkedIn provider ID of the person to invite (from search results or profile)
List your LinkedIn connections, sorted by most recently added.
Parameters (2)
limitinteger
Maximum connections to return
cursorstring
Pagination cursor from previous response
linkedin_list_invitations_sent
List your pending sent connection invitations on LinkedIn.
Parameters (2)
limitinteger
Maximum invitations to return
cursorstring
Pagination cursor from previous response
linkedin_list_reactions
List all reactions (likes, celebrates, etc.) on a specific LinkedIn post.
Parameters (2)
post_idstringrequired
LinkedIn post/activity ID
limitinteger
Maximum reactions to return
linkedin_add_comment
Add a comment to a LinkedIn post. Use post_id from search results or thread data.
Parameters (2)
post_idstringrequired
LinkedIn post/activity ID (from search results or thread metadata)
textstringrequired
Comment text to post
linkedin_raw_request
Send an arbitrary LinkedIn API request via Unipile's magic route. Only GET and POST methods are allowed. WARNING: This bypasses structured rate limiting and can perform destructive actions. Use this only when no other LinkedIn tool covers the needed functionality.
Parameters (4)
request_urlstringrequired
Target LinkedIn API endpoint URL
methodstring
HTTP method (only GET and POST allowed)
query_paramsobject
URL query parameters
bodyobject
Request body (for POST requests)
search_messages
Search message content across all chats β semantic + keyword. Use to find what was said: quotes, topics, info exchanged. For chats/threads themselves use search.threads; for files use search.files; for links use search.links.
Parameters (5)
querystring
What to search for in message content.
participant_namestring
Filter to messages involving this participant/contact name. OMIT to search across everyone (do NOT pass an empty string).
date_fromstring
ISO8601 date (YYYY-MM-DD) lower bound. OMIT to skip.
date_tostring
ISO8601 date (YYYY-MM-DD) upper bound. OMIT to skip.
limitinteger
Maximum messages to return.
search_threads
Find or list chat threads/conversations β by topic, participant, unread/unanswered status, or recency. Omit `query` to list threads by filter. For message content use search.messages; for files use search.files. `since` filters by recency and pairs with only_unread / only_unanswered.
Parameters (6)
querystring
Topic/keyword to search threads for. OMIT to list threads by filter.
participant_namestring
Filter to threads with this participant/contact. OMIT to include everyone (do NOT pass an empty string).
only_unreadboolean
Limit to threads with unread messages. OMIT to include read threads.
only_unansweredboolean
Limit to threads where the last message is incoming (you haven't replied). Covers 'threads I haven't replied to'. OMIT to include answered threads too.
sincestring
ISO date (YYYY-MM-DD). Only threads with any message activity since this date (recency filter, not 'unanswered'). OMIT to skip.
limitinteger
Maximum threads to return.
search_files
Search files and attachments across the workspace β by content, filename, document type, or origin. For message content use search.messages; for links use search.links.
Parameters (5)
querystring
What to search for (content or filename).
attachment_namestring
Exact filename filter. OMIT to skip (do NOT pass an empty string).
document_typestring
Filter by document category. OMIT unless the user explicitly mentions one β picking a value narrows the search and is a common cause of zero-result mistakes.
file_originstring
File origin: 'generated' (created by tools), 'received' (from messages), 'uploaded' (manual). Use 'generated' for files the user created/sent. OMIT to include all origins.
limitinteger
Maximum files to return.
search_links
Search links/URLs shared across the workspace β by type, owner, or associated contact. For files use search.files; for message content use search.messages.
Parameters (5)
querystring
What to search for in shared links.
link_kindstring
Filter links by type. OMIT to include all kinds β picking a value narrows the search and is a common cause of zero-result mistakes.
ownerstring
Link owner: 'self' (user's own) or 'contact' (from others). OMIT to include links regardless of owner.
contact_hintstring
Name hint to filter links for a specific contact. OMIT to skip.
limitinteger
Maximum links to return.
workspace_list
List every workspace the caller is a member of, with `is_current` marking the workspace this MCP key is currently routed to. Pair with `workspace.switch` to change the active workspace without reconnecting.
No parameters.
workspace_current
Return the workspace this MCP API key is currently routed to, with the caller's role inside it. Use this to confirm context before/after `workspace.switch`.
No parameters.
workspace_switch
Re-point the active MCP API key to a different workspace. Pass exactly one of `workspace_id` or `slug` (find them via `workspace.list`). Takes effect on the very next tool call β no MCP reconnect, no new API key. Sequential checkpoint: do not parallelize tool calls across a switch β calls already in flight when the switch commits will run against the previous workspace.
Parameters (2)
workspace_idinteger
Numeric workspace id to switch to. Mutually exclusive with `slug`.
slugstring
Workspace slug to switch to. Resolved within the caller's memberships, so cross-tenant slug collisions are not possible. Mutually exclusive with `workspace_id`.
integrations_list
List the workspace's external integrations (HTTP-API + MCP), each with its id, provider name, base_url, transport, status, and registered tool count. Use before integrations.add_endpoints to find the integration id / base_url.
No parameters.
integrations_get_endpoints
List every endpoint (operationId, method, path) registered on an HTTP-API integration. Identify it by `integration_id` or `base_url`. Use this to review what tools exist before integrations.remove_endpoints or add_endpoints.
Parameters (2)
integration_idinteger
Integration id (from integrations.list).
base_urlstring
Or the integration's base URL, e.g. https://api.boomnow.com
integrations_add_endpoints
Add one or more API endpoints to an HTTP-API integration as callable tools, merged additively into the integration for `base_url` (created if none exists). Each endpoint becomes a tool with params + request/response schemas inferred from the samples you pass. Supply `identity` (saved Browser Identity name/id) only when creating a brand-new integration; updates keep the existing auth. Returns the new tool count and names. Refresh the tools list afterwards to use them.
Parameters (5)
base_urlstringrequired
API base URL of the integration, e.g. https://api.boomnow.com
endpointsarrayrequired
Endpoints to add. Each: {method, path, query?(object), request_body?(object sample), response_body?(object/array sample)}. path is relative to base_url, e.g. /api/conversations/all.
identitystring
Saved Browser Identity name or numeric id β required only when creating a NEW integration (updates reuse existing auth).
namestring
Display name when creating a new integration (defaults to the host).
extractobject
Explicit browser_identity auth extract for a NEW integration when auto-detect can't find one, e.g. {kind:'cookie', name:'_session', value_format:'raw', header_name:'Cookie', header_template:'{{name}}={{value}}'}. Updates reuse existing auth, so omit then.
integrations_remove_endpoints
Remove endpoints (tools) from an HTTP-API integration β e.g. junk paths like static assets, /socket.io, or SPA routes that aren't real API calls. Identify the integration by `integration_id` or `base_url`, and the endpoints to drop by `operation_ids` (e.g. getSocketIo) and/or `paths` (e.g. /socket.io/). Re-registers the catalog so the removed tools disappear. Returns removed + remaining counts.
Parameters (4)
integration_idinteger
Integration id (from integrations.list).
base_urlstring
Or the integration's base URL.
operation_idsarray
operationIds to remove, e.g. ["getSocketIo","getPieScreensMenu"].
pathsarray
Exact spec paths to remove (all methods), e.g. ["/socket.io/"].
integrations_set_auth
Set or update the authentication on an HTTP-API integration, generically. Identify it by `integration_id` or `base_url`. Pass `auth` = {type: bearer|api_key|basic|custom_headers|browser_identity|none, ...}: bearer/basic β {token}; api_key β {token, header_name?}; custom_headers β {headers:{name:value,...}}; browser_identity β {identity_id|identity_name, extract}. Token values are encrypted; nothing is stored in cleartext. To only refresh a browser_identity session, OMIT `auth` and pass `cookies` (and/or `local_storage`) β they are merged into the bound identity without touching its config. (oauth2 / service_account use the REST settings flow.)
Parameters (5)
integration_idinteger
Integration id (from integrations.list).
base_urlstring
Or the integration's base URL, e.g. https://api.boomnow.com.
authobject
Auth to set: {type, token?, header_name?, headers?(object), identity_id?, identity_name?, extract?(object)}. Omit to only refresh cookies on an existing browser_identity integration.
cookiesarray
Cookies to merge into the bound browser identity. Each {name, value, domain?, path?, expires?}. Existing names are overwritten; new ones added.
local_storagearray
localStorage entries to merge. Each {origin, name, value}.
integrations_capture_session
Restore an expired integration session by capturing the LIVE auth of an open browser page β works for COOKIE sessions (browser_identity) AND TOKEN/HEADER sessions (bearer / api_key / custom_headers, e.g. Devise access-token/client/uid). First call browser_open(url, identity_name) for the integration's site (the page must be logged in AND have called its API), then pass that `page_id` here with `integration_id` or `base_url`. For cookie sessions it captures the full storage_state (incl httpOnly cookies page JS can't read) into the bound identity; for token sessions it captures the auth headers the page sends to the API host and binds them. Re-connects the integration. The captured secret never leaves the server (returns counts only). Generic β any site, any auth scheme, no local Playwright.
Parameters (3)
page_idstringrequired
page_id from a prior browser_open of the integration's site (logged in).
integration_idinteger
Integration id (from integrations.list).
base_urlstring
Or the integration's base URL, e.g. https://api.boomnow.com.
job_read_context
Read the current job context. Returns the full state of your active job including assignments, escalations, and any data you previously stored.
Parameters (1)
job_idinteger
The ID of the job to read
job_update_context
Update the job context by merging new data. Existing keys are preserved unless explicitly overwritten. Use this to record progress, update assignment statuses, or store intermediate results.
Parameters (2)
job_idinteger
The ID of the job to update
updatesobjectrequired
Key-value pairs to merge into job context
job_complete
Mark the job as completed. This sanitizes PII from the context and records a completion summary. Use when all tasks in the job are done.
Parameters (2)
job_idinteger
The ID of the job to complete
summarystring
Brief summary of what was accomplished
job_escalate
Escalate the job to a human. Use when you cannot resolve an issue, someone is not responding, or a situation requires human judgment.
Parameters (2)
job_idinteger
The ID of the job to escalate
reasonstringrequired
Why escalation is needed
notes_save
Save a fact or note into the agent's memory. Use scope to choose visibility: 'workspace' = visible to every agent in this workspace (use for shared facts, project conventions); 'agent' = private to this agent (use for personal working notes); 'thread' = scoped to one conversation (use for thread-specific reminders); 'person' = scoped to one contact (use for per-contact context). If a note with the same key+scope exists it will be updated. Do NOT use this tool for behavioral rules or corrections β use feedback.save for those.
Parameters (7)
target_agent_idinteger
Target notebook. In agent mode optional (defaults to your own); required from MCP. Agents cannot target other agents' notebooks. Ignored when scope='workspace' (workspace memory is shared).
keystringrequired
Short identifier for this note (must not start with '__' β reserved)
valuestringrequired
The note content
scopestringrequired
Scope of the note. 'workspace' = shared across all agents; 'agent' = private to this agent (was 'global' pre-PR1); 'thread' = per-conversation; 'person' = per-contact. 'global' is accepted as a deprecation alias for 'agent'.
scope_ref_idstring
Reference ID β thread_id (for scope=thread) or person_id (for scope=person). Required for thread/person scope. In MCP mode (no thread context), must be passed explicitly.
expires_in_hoursinteger
Auto-delete after N hours. Omit for permanent notes.
pinnedboolean
Pin this note so it's always loaded first. Default false.
notes_recall
Recall notes from your notebook. By default returns only your own notes (all scopes, newest first). Pass filter_agent_id=<int> to read another agent's notebook, or filter_agent_id="all" (or "*") to read across every agent in the workspace. Pass scope to narrow to global/thread/person. Each result includes agent_id and agent_name of the author.
Parameters (5)
filter_agent_idstring
Optional. Omit to read only your own notes. Pass a numeric agent_id as a string (e.g. "57") to read another agent's notebook (read-only). Pass "all" or "*" to read across all agents in the workspace.
scopestring
Optional filter: global | thread | person. Omit for all scopes.
scope_ref_idstring
Filter by specific thread_id or person_id
keystring
Recall a specific note by key
limitinteger
Max notes (default 20, max 50). Newest first.
notes_search
Full-text search in your notebook. By default searches only your own notes. Pass filter_agent_id=<int> to search another agent's notebook, or "all" (or "*") for workspace-wide. Or list all notes for a person/thread by scope_ref_id.
Parameters (5)
filter_agent_idstring
Optional. Omit to search only your own notes. Pass a numeric agent_id as a string (e.g. "57") to search another agent's notebook (read-only). Pass "all" or "*" to search across all agents in the workspace.
querystring
Text to search for in note keys and values. Optional if scope_ref_id is provided.
scopestring
Limit search to scope
scope_ref_idstring
Filter by specific thread_id or person_id. If provided without query, lists all notes for that ref.
limitinteger
Max results (default 10, max 50)
notes_delete
Delete a note by ID from the target notebook. Same identity rules as notes.save β agents can only delete from their own notebook.
Parameters (2)
target_agent_idinteger
Target notebook. In agent mode optional (defaults to your own); required from MCP. Agents cannot target other agents' notebooks.
note_idintegerrequired
ID of the note to delete
feedback_save
Save a behavioral rule, preference, or correction that should guide future agent behavior. Use this when the user gives explicit guidance like 'always reply in Russian', 'don't suggest meetings before 11am', or 'invoice link goes via email, not chat'. Structure the rule as: the rule itself, why it matters (if stated), and how to apply it. Scope: 'workspace' for org-wide rules, 'agent' for per-agent overrides, 'person' for per-contact preferences. Prefer feedback.save over notes.save for anything that's instructive rather than informational.
Parameters (7)
target_agent_idinteger
Target agent. In agent mode optional (defaults to self); required from MCP. Ignored when scope='workspace'.
keystringrequired
Short identifier for this rule (e.g. 'reply_language', 'meeting_hours'). Must not start with '__' (reserved).
rulestringrequired
The rule itself, in imperative form. Required.
whystring
Why this rule matters (optional but recommended for the distiller).
how_to_applystring
When/how to apply the rule (optional). Helpful for conditional rules like 'apply when speaking to Russian-speaking customers'.
scopestringrequired
Scope of the rule. 'workspace' for org-wide rules; 'agent' for per-agent overrides; 'thread' for conversation-specific guidance; 'person' for per-contact preferences. 'global' accepted as deprecation alias for 'agent'.
scope_ref_idstring
Required for scope='thread' (thread_id) and scope='person' (person_id).
tasks_create
Create a new task in your to-do list.
Parameters (9)
agent_idinteger
Agent ID whose tasks to access. Required when calling from MCP.
titlestringrequired
Task title
descriptionstring
Detailed description
prioritystring
Task priority (default: medium)
due_atstring
ISO datetime when task is due (e.g. '2026-03-31T15:00:00')
due_datestring
Date when task is due (e.g. '2026-03-31'). Use with due_time or alone.
due_timestring
Time when task is due (e.g. '15:00'). Used with due_date.
assigned_to_contact_idinteger
Contact ID if assigned to someone
thread_idinteger
Related thread ID
tasks_update
Update an existing task. Set status='done' to complete it, 'cancelled' to cancel. Use summary for completion notes.
Parameters (7)
agent_idinteger
Agent ID whose task to update. Required when calling from MCP.
task_idintegerrequired
ID of the task to update
statusstring
prioritystring
descriptionstring
due_atstring
ISO datetime
summarystring
Completion note (stored when marking done)
tasks_list
List your tasks, or another agent's tasks (read-only) using from_agent_id. Use filters to narrow results.
Parameters (7)
agent_idinteger
Agent ID whose tasks to list. Required when calling from MCP.
statusstring
overdueboolean
If true, only return tasks past due_at that are not done
thread_idinteger
Filter by related thread
assigned_to_contact_idinteger
Filter by assigned contact
limitinteger
Max results (default 20)
from_agent_idinteger
List tasks of another agent (read-only). Omit to list your own.
tasks_delete
Delete a task from your to-do list by its ID.
Parameters (2)
agent_idinteger
Agent ID whose task to delete. Required when calling from MCP.
task_idintegerrequired
ID of the task to delete
reminder_set
Schedule a reminder. One-time reminders fire at a specific datetime. Recurring reminders fire on a schedule (daily, weekly, every N days, or every N minutes). Optionally scope to a thread or target another agent.
Parameters (11)
reasonstringrequired
What this reminder is for (you'll see this when it fires)
schedule_typestringrequired
one_time = fires once at datetime. daily = fires daily at time. weekly = fires on specific days_of_week at time. every_n_days = fires every N days at time. interval = fires every N minutes.
datetimestring
ISO datetime for one_time (e.g. '2026-04-01T09:00:00+03:00'). Required for one_time.
timestring
Time of day HH:MM for daily/weekly/every_n_days (e.g. '09:00'). Required for daily/weekly/every_n_days.
timezonestring
IANA timezone (e.g. 'Europe/Moscow'). Defaults to UTC.
days_of_weekarray
Days for weekly: 0=Mon, 1=Tue, 2=Wed, 3=Thu, 4=Fri, 5=Sat, 6=Sun. Required for weekly.
interval_daysinteger
For every_n_days: fire every N days (min 2).
interval_minutesinteger
For interval: fire every N minutes (5-1440).
thread_idinteger
Optional thread ID to scope the reminder to. Omit for workspace-level reminders.
target_agent_slugstring
Optional: activate a different staff member instead of yourself when the reminder fires.
agent_idinteger
Agent ID (required when calling from MCP; ignored in agentic mode).
reminder_list
List your active reminders (both one-time and recurring).
Parameters (4)
include_firedboolean
Include already-fired one-time reminders (default false)
thread_idinteger
Filter by thread
limitinteger
Max results (default 20)
agent_idinteger
Agent ID (required when calling from MCP; ignored in agentic mode).
reminder_cancel
Cancel an active reminder by its trigger ID.
Parameters (2)
trigger_idintegerrequired
ID of the reminder to cancel
agent_idinteger
Agent ID (required when calling from MCP; ignored in agentic mode).
system_sleep
Pause execution for a given number of seconds (max 30). Use when you need to wait for an external process to complete before retrying β e.g. message sync, backfill, or API propagation. Total sleep per run is capped at 60 seconds.
Parameters (2)
secondsintegerrequired
Number of seconds to sleep (1-30)
reasonstring
Why you are waiting (logged for debugging)
calls_make
Place an outbound AUDIO/VOICE phone call via Twilio (PSTN) or Telegram (MTProto 1:1 call). Use this any time the user asks to 'call', 'ring', 'phone', 'dial', or have a spoken conversation. Do NOT use messages.send when the user asks to call someone β a call is real-time voice, not a text message. You conduct the conversation as the voice agent using the provided greeting and instructions.
Parameters (7)
channelstring
Voice transport: 'twilio' (phone via PSTN β requires phone_number in E.164) or 'telegram' (MTProto 1:1 call β requires telegram_user_id, NOT a phone number or thread_id). OMIT to use the current conversation's channel (e.g. a Telegram DM β a Telegram call to that contact).
phone_numberstring
Destination phone number in E.164 format (e.g., '+15551234567', '+66812345678'). Required when channel='twilio'.
telegram_user_idstring
Destination Telegram user ID (decimal int64 as string, e.g. '123456789'). Required when channel='telegram'. The caller account must have had prior interaction with this user β a cold contact cannot be reached via voice.
instructionsstring
What to do during the call β objective, questions, tone. The AI generates a natural opening and guides the conversation. Example: 'Call about invoice #1234. Ask if they received it and when payment is expected. Be friendly and professional.'
greetingstringrequired
The first sentence the agent speaks immediately when the call connects. ALWAYS provide a greeting β without it the caller hears silence. Keep it short and natural. Example: 'Hi, this is Diana calling from DialogBrain. Do you have a moment to chat?'
report_backstring
When to re-invoke you after the call ends. 'on_answer' (default) = only if the call was answered, 'always' = even on missed/failed calls, 'never' = fire and forget. Transcript is always stored regardless of this setting.
voice_agent_idinteger
ID of the agent that conducts the call (an `id` from agents.list). If omitted, uses the workspace's default voice-capable agent when one exists. Pass this when the call fails with 'No voice agent configured'.
calls_send_to_meet
Dispatch a workspace AI agent into an active Google Meet call. The agent joins as a participant β it can hear the conversation, respond via TTS, see the shared screen (when vision is enabled on the agent), and answer questions about what's on screen. Use when the operator wants to delegate live meeting attendance to an agent (notes, Q&A, summarization, real-time support). The Meet URL must be in canonical 3-4-3 form, e.g. https://meet.google.com/abc-defg-hij. Lookup-redirect URLs are not supported β operator must use the share-link form.
Parameters (8)
meet_urlstringrequired
Canonical Google Meet URL β must match https://meet.google.com/<3 letters>-<4 letters>-<3 letters>, e.g. https://meet.google.com/abc-defg-hij. lookup/ redirects are NOT supported.
agent_idintegerrequired
ID of an active agent in this workspace. Get it from agents.list. Any active agent can be dispatched β a voice trigger is NOT required (the runner attaches the agent you name directly).
vision_modestring
Screen-share capture mode. 'off' = no vision (default), 'on_demand' = the agent can call the vision_query tool for fine-detail reads, 'continuous_0_3fps' = the bot captures the screen at 1 fps with phash dedupe and the executor splices the latest scene-change into each agent turn as ambient low-detail context. OMIT to use 'off' (the default).
instructionsstring
What the agent should do once it joins β its task brief, e.g. 'greet everyone and present the overview deck' or 'take notes and answer questions about the roadmap'. Woven into the agent's system prompt for the session. OMIT for a generic listening agent.
start_immediatelyboolean
If true, the agent starts talking as soon as it joins β it greets everyone and begins the task in `instructions` without waiting for someone to say a wake-word. OMIT (default false) to stay silent until addressed.
translation_modeboolean
If true, pre-arm translator mode (auto-target language) on join with zero verbal trigger. Forces the original-speaker audio track to exist. Requires target_language. OMIT (default false) for normal dispatch.
target_languagestring
Target language for auto-arm translation when translation_mode=true (e.g. 'en', 'es', 'fr'). OMIT to not use translation.
comeback_phrasestring
Optional phrase to trigger return to original language during translation (e.g. 'Back to English'). Only used with translation_mode=true.
workbench_run_python
Run Python in an isolated sandbox to process LARGE or paginated tool results without pulling every row into the conversation. Inside the code, call your connected integration tools with `call_tool('ext<id>_<name>', {..})`. RETURN SHAPE: call_tool ALWAYS returns a dict with a boolean r['success']. On SUCCESS the API's JSON is under r['body'], e.g. {'success': True, 'status': 200, 'body': {'results': [{'title': ...}, ...]}} β so read r['body']['results']. On FAILURE r['success'] is False and r['error'] explains. If unsure of the shape, print(r) once and inspect before extracting. Aggregate/filter/paginate in the sandbox, then assign ONLY the small summary you want back to a variable named `result`. FIRST discover exact tool slugs with integrations_search_tools, THEN write code that calls them. pandas/numpy available.
Parameters (2)
codestringrequired
Python source to execute. call_tool('ext<id>_<name>', {..}) returns the integration's raw dict β HTTP success payload is under r['body'] (e.g. r['body']['results']); failure is {'success': False, 'error': ...}. Assign the small summary to `result`. pandas/numpy available.
agent_idinteger
Which agent's tool policy the sandbox runs under β this scopes which ext* integrations call_tool may reach (enabled + denied_tools for that agent). Only needed when calling this tool OUTSIDE a normal agent run (e.g. directly from an external MCP client); during an agent run the running agent is used and this is ignored. Without it, call_tool can reach no integrations.
calls_meet_browser
Attach to a Google Meet bot's live browser to diagnose and recover a bot that isn't visibly joining. Pass the meet session's call_id; returns a page_id. Then drive the bot's Meet page with the generic browser tools (browser.snapshot / browser.click / browser.take_screenshot / browser.evaluate / browser.console_messages / browser.network_requests) using that page_id β read the snapshot to see whether the bot is in the lobby, blocked, or admitted, and click guest-side controls to recover a stalled join. Note: host admission ('Admit') happens in the host's own browser and is not present on the bot's page.
Parameters (1)
call_idstringrequired
The meet session's call_id (UUID), e.g. from calls.send_to_meet's session_id or calls.list_active.
calls_set_translation_language
Change the target language of an active voice/Meet call's live translator on the fly β no hangup or re-dispatch (also arms translator mode if it isn't already on). Pass the call_id and an ISO language code, e.g. 'th' (Thai), 'ru' (Russian), 'es' (Spanish), 'en' (English). Takes effect within ~10ms β speak and the translation switches to the new language.
Parameters (2)
call_idstringrequired
The active call / Meet session call_id (UUID) β e.g. from calls.send_to_meet's session_id or calls.list_active.
languagestringrequired
Target language ISO code: 'th' (Thai), 'ru' (Russian), 'es' (Spanish), 'en' (English), etc.
present_tab
Share the agent's browser tab on the live call so everyone sees it as a real screen-share. Pass the page_id you got from browser.open. Only usable while the agent is in an active voice call. The shared tab stays the active share until you call present_tab with a different page_id, close the tab via browser.close, or the call ends.
Parameters (1)
page_idstringrequired
page_id returned by browser.open for the tab you want to share. Must be a tab still open in the agent's browser context.
calls_send_to_telegram_call
Dispatch a workspace AI agent into a live Telegram GROUP voice chat OR an encrypted call-link conference. FOUR ways to target the call: (1) chat_id β the group's numeric id, e.g. -1001234567890 (use for a private group with no @username); (2) target=@username or a t.me/<group> link; (3) omit both target and chat_id to use the CURRENT thread (when it's a Telegram group); (4) target=t.me/call/<slug> encrypted group-call link. start_if_none=true spawns a new voice chat if the group has none active. The agent joins via the workspace's Telegram account β hears the call, replies via TTS, and sees shared screens (when vision is enabled). NOTE: joining a regular in-group voice chat does NOT need a slug link β pass chat_id directly.
Parameters (7)
targetstring
Telegram call or group to join. Either: (1) encrypted group-call slug (https://t.me/call/<slug> URL or bare slug token, 12-64 chars), (2) group reference (@username or https://t.me/<group> URL), or (3) omit this (and chat_id) to use the current thread (must be a Telegram group chat). Max ~200 chars.
chat_idinteger
Telegram group chat id to join the voice chat of (e.g. -1001234567890 for a supergroup, -4766727451 for a basic group). Use this to target a PRIVATE group that has no @username and isn't the current thread. Overrides `target` when both are given. Group mode only (ignored for slug links).
agent_idintegerrequired
ID of an active agent in this workspace. Get it from agents.list. Any active agent can be dispatched β a voice trigger is NOT required (the runner attaches the agent you name directly).
channel_account_idinteger
Workspace Telegram channel account ID that joins as the bot. Optional β when the workspace has exactly one Telegram account, it's used by default. Required when multiple Telegram accounts exist.
vision_modestring
Screen-share capture mode. 'off' = no vision (default), 'on_demand' = the agent can call vision_query for fine-detail reads, 'continuous_0_3fps' = the bot captures the screen at 1 fps with phash dedupe and splices the latest scene-change into each agent turn. OMIT to use 'off' (the default).
instructionsstring
What the agent should do once it joins β its task brief, woven into the voice system prompt. e.g. 'present the overview deck' or 'greet everyone and summarize the discussion'. Optional.
start_if_noneboolean
When joining a group voice chat (not a slug-based encrypted call), spawn a new voice chat if none is active. Default false. Ignored when target is a call slug (a slug IS the call).
calls_list_active
List active voice calls in this workspace. Use before calls.make on a Telegram account (only one MTProto call per account at a time) to check whether the line is free.
Parameters (2)
channelstring
Filter by voice channel. OMIT to include both telegram and twilio.
channel_account_idinteger
Filter by channel_account.id (the calling Telegram account or Twilio number). Combine with channel for a per-line busy check.
calls_get_transcript
Get the structured transcript and final state of a voice call by call_id. Returns per-turn rows in chronological order, call status (active/completed/failed/abandoned), duration, and an `outcome` field telling whether the recipient picked up (answered/no_answer/busy/declined/failed/unknown). `answered_at` is non-null once the recipient picked up. Returns active turns if the call is still in progress.
Parameters (1)
call_idstringrequired
Call ID returned by calls.make in _meta.call_id.
calls_list_history
Search historical voice calls in this workspace by participant name, contact_id, thread, channel, source, and/or date range. Returns one row per call (NOT per turn) with call_id, duration_seconds, outcome, direction, started_at, source, channel_label, and parent_thread_id (the originating chat thread for Telegram-group / Twilio-outbound / Meet calls). Pair with calls.get_transcript(call_id) for the full per-turn transcript. Use this instead of messages.read_history for cross-thread call queries β group calls and Meet sessions live on per-call sub-threads, not on the parent chat thread.
Parameters (8)
participant_namestring
Filter to calls whose parent thread has a participant matching this name (substring match against entity.title). Resolves group calls via the parent group's roster, not the per-call thread's speaker list.
contact_idstring
Filter by exact entity_id (from contacts.find). Mutually exclusive with participant_name when both target the same person.
thread_idinteger
Restrict to calls on this thread OR with this thread as their originating parent (Telegram group β call sub-thread back-link, Twilio outbound source_thread_id back-link).
channelstring
Filter by message-level channel of the call thread: 'telegram' (1:1 voice or group call sub-thread), 'twilio_voice', 'meet_voice', 'livechat_voice'. OMIT to include all voice channels.
sourcestring
Filter by voice_sessions.source: 'telegram' (1:1 + group), 'twilio' (PSTN), 'meet' (Google Meet bot), 'livechat' (in-app voice). OMIT to include all sources.
sincestring
ISO date or datetime lower bound (inclusive). Default: 90 days ago. Naive timestamps are interpreted as UTC.
untilstring
ISO date or datetime upper bound (inclusive). Default: now.
limitinteger
Maximum calls to return (default 20, max 100).
calls_wait
Block until a voice call ends (status changes from 'active') or timeout elapses. Returns ended=true with final state when the call has ended; ended=false on timeout (re-issue to keep waiting). The returned state includes `outcome` so callers can branch on pickup vs. no-answer (answered/no_answer/busy/declined/failed/unknown). Default timeout 90s; cap 110s β bounded by nginx proxy_read_timeout 120s on /mcp.
Parameters (2)
call_idstringrequired
Call ID returned by calls.make in _meta.call_id.
timeout_secondsinteger
Max seconds to wait. Default 90, cap 110 (bounded below nginx 120s proxy_read_timeout). On expiry returns ended=False with status='active' so the caller can re-issue to keep waiting.
calls_hangup
Hang up an active voice call by call_id. Use after calls.make when the agent decides to terminate before the callee does, or to abort a stuck call. Idempotent: returns success if the call is already terminal.
Parameters (2)
call_idstringrequired
Call ID returned by calls.make in _meta.call_id.
reasonstring
Short internal reason for ending the call (e.g. 'campaign timeout'). Stored on voice_sessions.metadata.
browser_open
Open a URL in a remote browser. Saved login cookies are auto-attached when the URL domain matches a claimed browser identity. Pass identity_name to override auto-matching or force a specific identity.
Parameters (2)
urlstringrequired
identity_nameany
browser_snapshot
Return a YAML aria_snapshot of the page DOM. Each interactive node is tagged with `[ref=eN]` (e.g. `[ref=e7]`). Pass that exact token as the `ref` arg to browser.click / browser.fill / browser.type / browser.press_key. Do NOT pass the role name ('combobox', 'button') as ref β only the eN token. Truncated at 32KB.
Parameters (1)
page_idstringrequired
browser_click
Click an element. `ref` is either an aria-ref token from browser.snapshot ('e7') OR a CSS selector ('button.submit'). Prefer the aria-ref token.
Parameters (2)
page_idstringrequired
refstringrequired
browser_fill
Fill an input or textarea with the given value. `ref` is either an aria-ref token from browser.snapshot ('e7') OR a CSS selector ('input[name=email]'). Prefer the aria-ref token β it's stable and matches exactly what snapshot returned.
Parameters (3)
page_idstringrequired
refstringrequired
valuestringrequired
browser_wait_for
Wait for a selector to appear OR a navigation URL to match a glob pattern. Provide `ref` (selector) OR `url_pattern` (glob).
Parameters (4)
page_idstringrequired
refany
url_patternany
timeout_msinteger
browser_attach_identity
Switch the page's identity by loading saved cookies + storage. Use only when switching identity mid-page; for first navigation, pass `identity_name` to browser.open instead.
Parameters (2)
page_idstringrequired
identity_namestringrequired
browser_close
Close a page opened by browser.open.
Parameters (1)
page_idstringrequired
browser_hover
Hover the mouse over an element (reveals tooltips + hover menus). `ref` is a CSS selector.
Parameters (2)
page_idstringrequired
refstringrequired
browser_select_option
Pick option(s) in a native <select> dropdown. Pass `value` (matches the option's value attr) OR `label` (matches its visible text). Lists allowed for multi-select.
Parameters (4)
page_idstringrequired
refstringrequired
valueany
labelany
browser_press_key
Press a keyboard key (e.g., 'Enter', 'Tab', 'Escape', 'ArrowDown') or a single character. Optional `ref` focuses an element first β aria-ref token from browser.snapshot ('e7') or a CSS selector.
Parameters (3)
page_idstringrequired
keystringrequired
refany
browser_navigate_back
Navigate back in the page's history (browser back button). Returns the new URL + title.
Parameters (1)
page_idstringrequired
browser_take_screenshot
Capture a PNG screenshot of the page or a specific element. Returns base64-encoded image bytes AND a file_id (persisted in DialogBrain files storage). Pass file_id straight to messages.send(attachment_file_ids=[file_id]) β do NOT call files.upload again. Use sparingly β favor browser.snapshot for structured DOM understanding.
Parameters (4)
page_idstringrequired
refany
full_pageboolean
inline_bytesboolean
browser_tabs
Manage tabs within the same BrowserContext as `page_id`. `action` β {list, switch, close, new}. For list, returns all open tab metadata; for new, returns the new tab's page_id.
Parameters (4)
page_idstringrequired
actionstringrequired
tab_idany
urlany
browser_evaluate
Run JavaScript in the page context and return the result. Use for state not in the a11y tree, captcha iframe inspection, DOM events. Expression is either a plain JS value ('document.title') or a zero-arg IIFE ('(() => { β¦ })()'). Inline any runtime values into the expression itself. Result is JSON-serialized; non-serializable values become strings. 256KB cap on output.
Parameters (2)
page_idstringrequired
expressionstringrequired
browser_drag
Drag one element onto another. `source_ref` is the element to grab; `target_ref` is where to drop. Both are CSS selectors. Used for slider captchas, kanban, drag-and-drop uploads.
Parameters (3)
page_idstringrequired
source_refstringrequired
target_refstringrequired
browser_type
Type text into an element with per-keystroke delay (organic). Each character dispatches keydown/keypress/keyup, unlike browser.fill which replaces .value instantly. Use when the page listens to keystroke events or for typing-speed fingerprint checks. `ref` is an aria-ref token from browser.snapshot ('e7') or a CSS selector. `delay_ms` defaults to 50.
Parameters (4)
page_idstringrequired
refstringrequired
textstringrequired
delay_msany
browser_fill_form
Fill multiple form fields in one call. `fields` is a list of {ref, value} dicts. ref is a CSS selector; value is a string (text) or boolean (checkbox). Saves N round-trips vs calling browser.fill repeatedly.
Parameters (2)
page_idstringrequired
fieldsarrayrequired
browser_resize
Resize the page viewport. Useful when a site serves different HTML based on viewport width (mobile vs desktop) or when an anti-bot scores risk by viewport dimensions.
Parameters (3)
page_idstringrequired
widthintegerrequired
heightintegerrequired
browser_file_upload
Attach files to an <input type=file>. Pass either `local_paths` (absolute host paths) or `data` (list of {name, mime, base64} blobs written to /tmp). 25MB cap per file.
Parameters (4)
page_idstringrequired
refstringrequired
local_pathsany
dataany
browser_handle_dialog
Respond to a pending JS dialog (alert/confirm/prompt). Pass accept=true for OK or false for Cancel. For prompt() dialogs also pass prompt_text. Dialogs are queued at page-open time; returns {pending: false} if none is waiting.
Parameters (3)
page_idstringrequired
acceptbooleanrequired
prompt_textany
browser_console_messages
Return console.log/warn/error events captured since the last drain. Filter by level ('log'|'info'|'warning'|'error'|'debug') and/or pattern (regex). Buffer caps at 500 entries; oldest are dropped first. Set clear=false to peek without draining.
Parameters (4)
page_idstringrequired
levelany
patternany
clearboolean
browser_network_requests
List HTTP requests the page made since open or last drain. Optional filters: method (GET/POST/...), url_pattern (regex), status_min (e.g. 400 for errors). Captures up to 200 most recent requests per page.
Parameters (5)
page_idstringrequired
methodany
url_patternany
status_minany
clearboolean
browser_attach_meet
Attach to THIS meet's bot browser and return a page_id for its live Google Meet tab. Then use the normal browser.* tools (browser.snapshot to see the page, browser.click to press a control, browser.take_screenshot, browser.evaluate, browser.console_messages, browser.network_requests) with that page_id to inspect why the bot isn't visibly joining (lobby/blocked/admitted) and to recover a stalled join. Call with no arguments from inside a meet.
Remote MCP server that connects your AI agent to a unified inbox spanning WhatsApp, Telegram, Instagram, Email, Livechat, and Voice calls β plus a workspace knowledge graph and AI agent orchestration.
OAuth 2.0 with Dynamic Client Registration (RFC 7591). Your MCP client registers automatically and is granted an access token scoped to one DialogBrain workspace. Revoke at any time from Settings β Developer in app.dialogbrain.com.
Tool annotations
Every tool exposes accurate MCP hint annotations:
readOnlyHint β true for read tools (threads.list, messages.read_history, kg.find_entity, β¦)
destructiveHint β true for delete tools (messages.delete, widgets.delete, β¦)
openWorldHint β true for tools that touch third-party APIs (messages.send, web.search, contacts.sync, β¦)
idempotentHint β derived from read-only/delete-by-id semantics