Messaging & Social
This page covers the built-in tools that read and send email, post into team chats, send SMS and WhatsApp messages, work with X and Reddit, and manage Zoom meetings. Use it to pick a tool, configure its credentials, and understand why a tool is unavailable or a send failed.
Choosing a Tool
| Tool | Use it for | Setup |
|---|---|---|
gmail |
Reading, searching, drafting, sending, and labeling mail in a Gmail mailbox | Google Gmail OAuth |
slack |
Slack messages, threaded replies, channel and user lookups, history, search, and files | Bot or user token |
discord |
Discord channel messages, channel info and history, and message deletion | Bot token |
telegram |
Text and media sent by a Telegram bot to one fixed chat | Bot token and chat ID |
whatsapp |
WhatsApp Business text, template, interactive, and media messages | Access token and phone number ID |
twilio |
SMS sends, call lookups, and recent message listing | Account SID plus auth token or API key |
webex |
Webex room messages and room listing | Access token |
resend |
Transactional HTML email through Resend | API key and sender |
email |
Plain-text mail to one fixed recipient through Gmail SMTP | Gmail address and app password |
x |
X posts, replies, DMs, profile lookups, home timeline, and recent-post search | Bearer token or OAuth user credentials |
reddit |
Reddit user and subreddit reads, plus optional posts and replies | App client ID and secret |
zoom |
Scheduling, listing, inspecting, and deleting Zoom meetings and reading recordings | Server-to-Server OAuth app |
For Amazon SES email, see aws_ses in Automation & Platforms.
Credentials
Set fields of type password through the dashboard or credential store; see Security Restrictions.
Many credential fields below are optional in the dashboard but required in practice, and the tool fails to load or errors on its first call without them.
Instead of stored fields, these tools also read the environment variables SLACK_TOKEN, SLACK_USER_TOKEN, DISCORD_BOT_TOKEN, TELEGRAM_TOKEN, WHATSAPP_ACCESS_TOKEN, WHATSAPP_PHONE_NUMBER_ID, TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_API_KEY, TWILIO_API_SECRET, WEBEX_ACCESS_TOKEN, RESEND_API_KEY, X_BEARER_TOKEN, X_CONSUMER_KEY, X_CONSUMER_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET, REDDIT_CLIENT_ID, REDDIT_CLIENT_SECRET, REDDIT_USERNAME, REDDIT_PASSWORD, ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, and ZOOM_CLIENT_SECRET.
gmail instead connects through Google OAuth; see Google Services OAuth For Local Installs or Google Services OAuth for custom and hosted setups.
Most tools enable or disable individual functions with enable_<function> flags, and all: true enables every function; include_tools and exclude_tools filter further, as described in Filtering Toolkit Functions.
[gmail]
gmail reads, searches, drafts, sends, replies to, stars, and labels mail in the connected Gmail account.
Connect the account through the google_gmail OAuth provider; when no usable connection exists, the tool replies with a link to connect.
To use a Google Workspace service account instead, set GOOGLE_SERVICE_ACCOUNT_FILE to the key file path and GOOGLE_DELEGATED_USER to the mailbox to impersonate through domain-wide delegation.
gmail always runs in the primary MindRoom runtime, even for agents whose other tools run in a worker, so workers never receive Google credentials.
Its functions are apply_label(), create_draft_email(), delete_custom_label(), get_draft(), get_emails_by_context(), get_emails_by_date(), get_emails_by_thread(), get_emails_from_user(), get_latest_emails(), get_message(), get_starred_emails(), get_thread(), get_unread_emails(), list_custom_labels(), list_drafts(), mark_email_as_read(), mark_email_as_unread(), remove_label(), search_emails(), search_threads(), send_email(), send_email_reply(), send_email_to_self(), star_email(), unstar_email(), and update_draft().
Archiving, trashing, attachment downloads, and sending existing drafts are not available.
send_email_to_self(subject, body) always sends to the connected account's own address, so an approval rule can allow it while still requiring approval for send_email; see Tool Approval.
Draft and send functions accept attachment file paths, not Matrix attachment IDs.
Allowed paths follow the agent's file_access setting: with the default workspace, attachments must be files inside the agent workspace, and an agent without a workspace cannot attach files.
With unrestricted, any file MindRoom can read is allowed.
Relative paths resolve from the workspace root, or from the MindRoom working directory when an unrestricted agent has no workspace.
Attachments may total at most 25 MiB per message; larger sets fail with Gmail attachments exceed the 25 MiB limit.
Each option below defaults to true, and setting it to false removes the matching function.
| Option | Type | Default | Controls |
|---|---|---|---|
get_latest_emails |
boolean |
true |
get_latest_emails() |
get_emails_from_user |
boolean |
true |
get_emails_from_user() |
get_unread_emails |
boolean |
true |
get_unread_emails() |
get_starred_emails |
boolean |
true |
get_starred_emails() |
search_emails |
boolean |
true |
search_emails() |
create_draft_email |
boolean |
true |
create_draft_email() |
send_email |
boolean |
true |
send_email() |
send_email_reply |
boolean |
true |
send_email_reply() |
Use exclude_tools to remove other functions, such as delete_custom_label.
[slack]
slack sends messages and threaded replies, lists channels and users, reads channel history and threads, searches messages, and uploads or downloads files.
Use channel IDs rather than names, especially for threaded replies and history reads.
get_channel_history() returns only top-level messages; to read a thread's replies, enable get_thread() and pass the parent message's timestamp.
slack always runs in the primary runtime, and its file uploads and downloads are not confined by the agent's file_access, so enable it only for agents trusted with what the MindRoom process can reach; see File access.
To search messages, set enable_search_messages: true and store a user token with the search:read scope in user_token; a bot token alone cannot search.
A user token stored as the primary token also works for search.
search_workspace() works only when Slack itself invokes the agent and supplies an action token, so it fails in ordinary Matrix conversations; use search_messages() there.
| Option | Type | Default | Notes |
|---|---|---|---|
token |
password |
null |
Bot or user token, or SLACK_TOKEN; required. |
user_token |
password |
null |
User token for search_messages(), or SLACK_USER_TOKEN. |
markdown |
boolean |
true |
Render Slack markdown in sent messages. |
output_directory |
text |
null |
Directory for saved downloads; setting it also enables saving. |
save_downloads |
boolean |
false |
Save downloads to disk instead of returning their content; without output_directory, files go to the current working directory. |
enable_send_message |
boolean |
true |
Enable send_message(). |
enable_send_message_thread |
boolean |
true |
Enable send_message_thread(). |
enable_list_channels |
boolean |
true |
Enable list_channels(). |
enable_get_channel_history |
boolean |
true |
Enable get_channel_history(). |
enable_upload_file |
boolean |
true |
Enable upload_file(). |
enable_download_file |
boolean |
true |
Enable download_file(). |
enable_search_messages |
boolean |
false |
Enable search_messages(); needs a user token. |
enable_search_workspace |
boolean |
false |
Enable search_workspace(). |
enable_get_thread |
boolean |
false |
Enable get_thread(). |
enable_list_users |
boolean |
false |
Enable list_users(). |
enable_get_user_info |
boolean |
false |
Enable get_user_info(). |
enable_get_channel_info |
boolean |
false |
Enable get_channel_info(). |
all |
boolean |
false |
Enable every function. |
max_file_size |
number |
1073741824 |
Maximum upload or download size in bytes. |
thread_message_limit |
number |
20 |
Maximum messages returned by get_thread(). |
[discord]
discord sends messages, reads channel messages and info, lists a server's channels, and deletes messages through the Discord REST API with a bot token.
It does not run a live Discord bot, so it cannot receive messages, handle slash commands, or set presence.
Functions take Discord IDs such as channel, server, and message IDs, not names.
Deletion is enabled by default; set enable_delete_message: false for read and send access only.
| Option | Type | Default | Notes |
|---|---|---|---|
bot_token |
password |
null |
Discord bot token, or DISCORD_BOT_TOKEN; required. |
enable_send_message |
boolean |
true |
Enable send_message(). |
enable_get_channel_messages |
boolean |
true |
Enable get_channel_messages(). |
enable_get_channel_info |
boolean |
true |
Enable get_channel_info(). |
enable_list_channels |
boolean |
true |
Enable list_channels(). |
enable_delete_message |
boolean |
true |
Enable delete_message(). |
all |
boolean |
false |
Enable every function. |
[telegram]
telegram sends messages from a Telegram bot to the one chat or channel set in chat_id or TELEGRAM_CHAT_ID, so calls never choose a destination.
For several Telegram destinations, configure the tool separately per agent or credential scope.
Only send_message() is enabled by default.
Optional functions send photos, documents, video, audio, animations, and stickers, edit, delete, and pin messages, react with emoji, read chat details with get_chat(), and download files with get_file().
get_file() returns file content unless save_downloads or output_directory is set, in which case it saves the file and returns its path.
| Option | Type | Required | Default | Notes |
|---|---|---|---|---|
chat_id |
text |
yes | null |
Chat or channel ID every call targets, or TELEGRAM_CHAT_ID. |
token |
password |
no | null |
Bot token, or TELEGRAM_TOKEN; required in practice. |
output_directory |
text |
no | null |
Directory for downloaded files; setting it also enables saving. |
save_downloads |
boolean |
no | false |
Save downloads to disk; without output_directory, files go to the current working directory. |
enable_send_message |
boolean |
no | true |
Enable send_message(). |
enable_send_photo |
boolean |
no | false |
Enable send_photo(). |
enable_send_document |
boolean |
no | false |
Enable send_document(). |
enable_send_video |
boolean |
no | false |
Enable send_video(). |
enable_send_audio |
boolean |
no | false |
Enable send_audio(). |
enable_send_animation |
boolean |
no | false |
Enable send_animation(). |
enable_send_sticker |
boolean |
no | false |
Enable send_sticker(). |
enable_edit_message |
boolean |
no | false |
Enable edit_message(). |
enable_delete_message |
boolean |
no | false |
Enable delete_message(). |
enable_react_with_emoji |
boolean |
no | false |
Enable react_with_emoji(). |
enable_pin_message |
boolean |
no | false |
Enable pin_message(). |
enable_get_chat |
boolean |
no | false |
Enable get_chat(). |
enable_get_file |
boolean |
no | false |
Enable get_file(). |
all |
boolean |
no | false |
Enable every function. |
[whatsapp]
whatsapp sends messages through the WhatsApp Business (Meta Graph) API.
Text and template messages are enabled by default; reply buttons, list messages, images, documents, locations, and reactions are opt-in.
Template sends need a template name approved in WhatsApp Business.
Set recipient_waid or WHATSAPP_RECIPIENT_WAID to give calls a default recipient; otherwise, every call must name one.
| Option | Type | Default | Notes |
|---|---|---|---|
access_token |
password |
null |
Business API access token, or WHATSAPP_ACCESS_TOKEN; required. |
phone_number_id |
text |
null |
Business phone number ID, or WHATSAPP_PHONE_NUMBER_ID; required. |
version |
text |
v22.0 |
Graph API version, or WHATSAPP_VERSION. |
recipient_waid |
text |
null |
Default recipient phone number or WhatsApp ID. |
timeout |
number |
30 |
Per-request HTTP timeout in seconds. |
enable_send_text_message |
boolean |
true |
Enable send_text_message(). |
enable_send_template_message |
boolean |
true |
Enable send_template_message(). |
enable_send_reply_buttons |
boolean |
false |
Enable send_reply_buttons(). |
enable_send_list_message |
boolean |
false |
Enable send_list_message(). |
enable_send_image |
boolean |
false |
Enable send_image(). |
enable_send_document |
boolean |
false |
Enable send_document(). |
enable_send_location |
boolean |
false |
Enable send_location(). |
enable_send_reaction |
boolean |
false |
Enable send_reaction(). |
all |
boolean |
false |
Enable every function. |
[twilio]
twilio sends SMS with send_sms(), looks up calls with get_call_details(), and lists recent messages with list_messages().
Authenticate with account_sid plus either auth_token or the api_key and api_secret pair.
send_sms() rejects sender and recipient numbers that are not in E.164 format, such as +15551234567, and the sender must be a number on the Twilio account.
| Option | Type | Default | Notes |
|---|---|---|---|
account_sid |
text |
null |
Account SID, or TWILIO_ACCOUNT_SID; required. |
auth_token |
password |
null |
Auth token, or TWILIO_AUTH_TOKEN. |
api_key |
password |
null |
API key, or TWILIO_API_KEY; used with api_secret. |
api_secret |
password |
null |
API secret, or TWILIO_API_SECRET; used with api_key. |
region |
text |
null |
Twilio region, such as au1. |
edge |
text |
null |
Twilio edge location, such as sydney. |
debug |
boolean |
false |
Log Twilio HTTP requests. |
enable_send_sms |
boolean |
true |
Enable send_sms(). |
enable_get_call_details |
boolean |
true |
Enable get_call_details(). |
enable_list_messages |
boolean |
true |
Enable list_messages(). |
all |
boolean |
false |
Enable every function. |
[webex]
webex sends messages to Webex rooms with send_message() and lists rooms with list_rooms().
It does not manage meetings.
Send to room IDs, not room titles.
| Option | Type | Default | Notes |
|---|---|---|---|
access_token |
password |
null |
Webex access token, or WEBEX_ACCESS_TOKEN; required. |
enable_send_message |
boolean |
true |
Enable send_message(). |
enable_list_rooms |
boolean |
true |
Enable list_rooms(). |
all |
boolean |
false |
Enable every function. |
[resend]
resend sends transactional email through Resend with send_email(), using the message body as HTML.
Every message comes from from_email, which usually must be a sender verified in Resend.
Use gmail instead when the agent needs to read or reply within a mailbox.
| Option | Type | Default | Notes |
|---|---|---|---|
api_key |
password |
null |
Resend API key, or RESEND_API_KEY; required. |
from_email |
text |
null |
Sender address for every message. |
enable_send_email |
boolean |
true |
Enable send_email(). |
all |
boolean |
false |
Enable every function. |
[email]
email sends plain-text mail with email_user(subject, body) to the single address in receiver_email; calls cannot choose another recipient.
It always signs in to Gmail SMTP (smtp.gmail.com:465), so the sender must be a Gmail or Google Workspace account, usually with an app password, and other SMTP servers cannot be configured.
All four fields are required; a missing one makes the call return an error such as error: No receiver email provided.
Use gmail for mailbox access or resend for HTML transactional mail.
| Option | Type | Default | Notes |
|---|---|---|---|
receiver_email |
text |
null |
Recipient of every message. |
sender_name |
text |
null |
Display name in the From header. |
sender_email |
text |
null |
Gmail address used to sign in and send. |
sender_passkey |
password |
null |
Gmail app password. |
enable_email_user |
boolean |
true |
Enable email_user(). |
all |
boolean |
false |
Enable every function. |
agents:
alerts:
tools:
- email:
receiver_email: oncall@example.com
sender_name: MindRoom Alerts
sender_email: alerts@gmail.com
[x]
x creates posts, replies to posts, sends DMs, looks up users, reads the home timeline, and searches recent posts.
A bearer token is enough for search and lookups, but posting, replying, DMs, and the home timeline generally need the four OAuth user credentials.
search_posts() accepts a result limit of 10 to 100, and may return fewer matches.
| Option | Type | Default | Notes |
|---|---|---|---|
bearer_token |
password |
null |
Bearer token, or X_BEARER_TOKEN. |
consumer_key |
password |
null |
OAuth consumer key, or X_CONSUMER_KEY. |
consumer_secret |
password |
null |
OAuth consumer secret, or X_CONSUMER_SECRET. |
access_token |
password |
null |
OAuth access token, or X_ACCESS_TOKEN. |
access_token_secret |
password |
null |
OAuth access token secret, or X_ACCESS_TOKEN_SECRET. |
include_post_metrics |
boolean |
false |
Add reply, repost, like, and quote counts to search results. |
wait_on_rate_limit |
boolean |
false |
Wait out rate limits instead of failing. |
[reddit]
reddit reads user profiles, top posts, subreddit info and stats, and trending subreddits, and can create posts and reply to posts and comments.
client_id and client_secret are enough for reads; posting and replying also need username and password.
A nonempty allowed_subreddits list limits posts and replies to those subreddits, named without r/ and matched case-insensitively; reads are unaffected.
| Option | Type | Default | Notes |
|---|---|---|---|
client_id |
text |
null |
Reddit app client ID, or REDDIT_CLIENT_ID; required. |
client_secret |
password |
null |
Reddit app client secret, or REDDIT_CLIENT_SECRET; required. |
user_agent |
text |
null |
Custom user agent, or REDDIT_USER_AGENT; defaults to RedditTools v1.0. |
username |
text |
null |
Reddit username for posts and replies. |
password |
password |
null |
Reddit password for posts and replies. |
allowed_subreddits |
string[] |
null |
Subreddits permitted for posts and replies; null or [] allows all. |
reddit_instance |
text |
null |
Programmatic only: an existing PRAW Reddit client, not settable from YAML. |
agents:
community:
tools:
- reddit:
user_agent: MindRoomCommunityBot/1.0
allowed_subreddits: [matrixdotorg]
[zoom]
zoom schedules, lists, inspects, and deletes Zoom meetings and reads meeting recordings.
It uses the credentials of a Zoom Server-to-Server OAuth app, so there is no browser connect step.
Meetings are scheduled for the app account's own user with fixed settings: automatic recording is off, and participants cannot join before the host.
| Option | Type | Default | Notes |
|---|---|---|---|
account_id |
text |
null |
Account ID of the Server-to-Server OAuth app, or ZOOM_ACCOUNT_ID; required. |
client_id |
text |
null |
Client ID, or ZOOM_CLIENT_ID; required. |
client_secret |
password |
null |
Client secret, or ZOOM_CLIENT_SECRET; required. |
timeout |
number |
30 |
Per-request HTTP timeout in seconds. |
Related Docs
- Tools Overview
- Automation & Platforms -
aws_sesfor Amazon SES email.