# Messaging & Social

Use these tools to read and send email, post into chat systems, deliver SMS or WhatsApp messages, work with social platforms, and schedule or inspect meetings.

## What This Page Covers

This page documents the built-in tools in the `messaging-and-social` group. Use these tools when you need outbound communication, mailbox access, team-chat delivery, social/community lookups, or Zoom meeting management.

## Tools On This Page

- \[`gmail`\] - Gmail mailbox access and message composition through the shared Google OAuth integration.
- \[`slack`\] - Slack channel messaging, threaded replies, channel listing, and history reads.
- \[`discord`\] - Discord bot messaging, channel inspection, history reads, and message deletion.
- \[`telegram`\] - Telegram bot delivery to one configured chat.
- \[`whatsapp`\] - WhatsApp Business API text and template messaging.
- \[`twilio`\] - Twilio SMS delivery, call lookup, and recent message listing.
- \[`webex`\] - Webex room messaging and room listing.
- \[`resend`\] - Transactional email delivery through Resend.
- \[`email`\] - Simple SMTP email sending through Gmail SMTP.
- \[`x`\] - X posting, replying, DMs, profile lookup, timeline reads, and recent-post search.
- \[`reddit`\] - Reddit read access plus optional posting and replies with user auth.
- \[`zoom`\] - Zoom Server-to-Server OAuth meeting scheduling and management.

## Common Setup Notes

`gmail` is the only tool on this page with `auth_provider="google"`. It uses the shared Google Services integration instead of standalone per-tool credentials. `gmail` is also a shared-only integration, so it is supported only for unscoped agents or agents with `worker_scope: shared`. Like `google_calendar`, `google_sheets`, and `homeassistant`, `gmail` stays local even when other tools are routed through the sandbox proxy. MindRoom enforces that restriction both at config-validation time and again during tool construction. On this branch, `src/mindroom/api/integrations.py` only exposes Spotify routes, while Google OAuth lives in `src/mindroom/api/google_integration.py`, so the rest of the tools on this page rely on ordinary stored tool credentials or SDK environment variables rather than a dedicated MindRoom OAuth flow. Password fields should be stored through the dashboard or credential store instead of inline YAML. Several metadata fields on this page are marked `required: false`, but the installed SDKs still need the corresponding token or secret in practice. Useful environment fallbacks on this page include `SLACK_TOKEN`, `DISCORD_BOT_TOKEN`, `TELEGRAM_TOKEN`, `WHATSAPP_ACCESS_TOKEN`, `WHATSAPP_PHONE_NUMBER_ID`, `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, `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`. The generic-looking `email` tool is not a fully configurable SMTP client on this branch. Its installed upstream implementation is hard-wired to Gmail SMTP over `smtp.gmail.com:465` and does not expose SMTP host, port, or TLS configuration fields.

## \[`gmail`\]

`gmail` is the mailbox-oriented tool for reading, searching, drafting, sending, and labeling Gmail messages through the shared Google integration.

### What It Does

MindRoom wraps Agno's `GmailTools` with `ScopedGoogleOAuthMixin`, so Gmail credentials are loaded from MindRoom's unified Google credential store instead of a local `token.json` file. The wrapper refreshes stored Google tokens when needed and falls back to the upstream auth flow only when no stored credentials are available. The current installed Gmail toolkit exposes `get_latest_emails()`, `get_emails_from_user()`, `get_unread_emails()`, `get_starred_emails()`, `get_emails_by_context()`, `get_emails_by_date()`, `get_emails_by_thread()`, `search_emails()`, `create_draft_email()`, `send_email()`, `send_email_reply()`, `mark_email_as_read()`, `mark_email_as_unread()`, `list_custom_labels()`, `apply_label()`, `remove_label()`, and `delete_custom_label()`. Draft and send operations accept local file-system paths for attachments.

### Configuration

| Option                 | Type      | Required | Default | Notes                                                          |
| ---------------------- | --------- | -------- | ------- | -------------------------------------------------------------- |
| `get_latest_emails`    | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |
| `get_emails_from_user` | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |
| `get_unread_emails`    | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |
| `get_starred_emails`   | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |
| `search_emails`        | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |
| `create_draft_email`   | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |
| `send_email`           | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |
| `send_email_reply`     | `boolean` | `no`     | `true`  | Declared in MindRoom's registry metadata as a capability flag. |

### Example

```
agents:
  assistant:
    worker_scope: shared
    tools:
      - gmail
```

```
get_latest_emails(10)
search_emails("label:unread from:billing@example.com", 10)
send_email("alice@example.com", "Project update", "Here is the latest status.")
send_email_reply("thread_id", "message_id", "alice@example.com", "Re: Project update", "Thanks for the update.")
apply_label("is:unread category:promotions", "Needs Review", count=10)
```

### Notes

- Connect Google once through the shared Google Services integration rather than storing a Gmail-specific API key.
- The Google integration on this branch requests Gmail read, modify, and compose scopes alongside Calendar, Sheets, Drive, and profile scopes.
- `gmail` is both shared-only and local-only on this branch, so `worker_scope=user` and `worker_scope=user_agent` are unsupported and the tool is never proxied through sandbox workers.
- The current registry exposes the eight boolean fields above, but the installed `agno.tools.gmail.GmailTools` constructor does not consume those selector kwargs directly on this branch, so `- gmail` plus Google OAuth is the verified setup path.
- Attachment arguments are local file paths in the current runtime, not Matrix attachment IDs.

## \[`slack`\]

`slack` is the Slack bot toolkit for posting to channels, replying in threads, listing channels, and reading recent channel history.

### What It Does

The installed upstream tool exposes `send_message()`, `send_message_thread()`, `list_channels()`, and `get_channel_history()`. It uses Slack's `WebClient` from `slack_sdk`. `markdown` maps to the `mrkdwn` flag on `chat_postMessage()`. Channel-history responses are normalized into a smaller JSON structure instead of returning the full Slack API payload.

### Configuration

| Option                       | Type       | Required | Default | Notes                                                        |
| ---------------------------- | ---------- | -------- | ------- | ------------------------------------------------------------ |
| `token`                      | `password` | `no`     | `null`  | Slack bot token, or use `SLACK_TOKEN`. Required in practice. |
| `markdown`                   | `boolean`  | `no`     | `true`  | Enable Slack markdown rendering on sent messages.            |
| `enable_send_message`        | `boolean`  | `no`     | `true`  | Enable `send_message()`.                                     |
| `enable_send_message_thread` | `boolean`  | `no`     | `true`  | Enable `send_message_thread()`.                              |
| `enable_list_channels`       | `boolean`  | `no`     | `true`  | Enable `list_channels()`.                                    |
| `enable_get_channel_history` | `boolean`  | `no`     | `true`  | Enable `get_channel_history()`.                              |
| `all`                        | `boolean`  | `no`     | `false` | Enable the full upstream toolkit surface.                    |

### Example

```
agents:
  support:
    tools:
      - slack:
          markdown: true
          enable_get_channel_history: true
```

```
list_channels()
send_message("C0123456789", "Deployment finished.")
send_message_thread("C0123456789", "Following up in the same thread.", "1743112345.678900")
get_channel_history("C0123456789", limit=25)
```

### Notes

- Although `token` is marked optional in metadata, the installed Slack toolkit raises if no token or `SLACK_TOKEN` is present.
- Use channel IDs for the most reliable calls, especially for threaded replies and history reads.
- `get_channel_history()` returns a simplified JSON view rather than the raw Slack response.

## \[`discord`\]

`discord` is the Discord bot toolkit for channel messaging, channel metadata, channel history, server channel listing, and message deletion.

### What It Does

The installed upstream tool exposes `send_message()`, `get_channel_messages()`, `get_channel_info()`, `list_channels()`, and `delete_message()`. It talks directly to `https://discord.com/api/v10` with a bot token in the `Authorization` header. This is a raw REST wrapper rather than a gateway-connected real-time bot runtime. Most functions expect Discord IDs such as `channel_id`, `guild_id`, and `message_id`, not display names.

### Configuration

| Option                        | Type       | Required | Default | Notes                                                                |
| ----------------------------- | ---------- | -------- | ------- | -------------------------------------------------------------------- |
| `bot_token`                   | `password` | `no`     | `null`  | Discord bot token, or use `DISCORD_BOT_TOKEN`. Required in practice. |
| `enable_send_message`         | `boolean`  | `no`     | `true`  | Enable `send_message()`.                                             |
| `enable_get_channel_messages` | `boolean`  | `no`     | `true`  | Enable `get_channel_messages()`.                                     |
| `enable_get_channel_info`     | `boolean`  | `no`     | `true`  | Enable `get_channel_info()`.                                         |
| `enable_list_channels`        | `boolean`  | `no`     | `true`  | Enable `list_channels()`.                                            |
| `enable_delete_message`       | `boolean`  | `no`     | `true`  | Enable `delete_message()`.                                           |
| `all`                         | `boolean`  | `no`     | `false` | Enable the full upstream toolkit surface.                            |

### Example

```
agents:
  community:
    tools:
      - discord:
          enable_delete_message: false
```

```
list_channels("123456789012345678")
get_channel_info("123456789012345678")
get_channel_messages("123456789012345678", limit=25)
send_message("123456789012345678", "Hello from MindRoom.")
```

### Notes

- `bot_token` is effectively required even though the metadata marks it optional.
- This tool uses ordinary Discord REST calls and does not manage slash commands, presence, or gateway subscriptions.
- Deletion is enabled by default, so disable `enable_delete_message` if you only want read and send access.

## \[`telegram`\]

`telegram` is the simplest chat-delivery tool on this page, with one configured destination and one send function.

### What It Does

The installed upstream tool exposes only `send_message()`. It posts to Telegram Bot API `sendMessage` for the configured `chat_id`. The tool instance is bound to one chat destination, so callers do not pass a chat ID per request. Responses are returned as the raw Telegram API response text.

### Configuration

| Option                | Type       | Required | Default | Notes                                                              |
| --------------------- | ---------- | -------- | ------- | ------------------------------------------------------------------ |
| `chat_id`             | `text`     | `yes`    | `null`  | Telegram chat or channel ID that this tool instance will target.   |
| `token`               | `password` | `no`     | `null`  | Telegram bot token, or use `TELEGRAM_TOKEN`. Required in practice. |
| `enable_send_message` | `boolean`  | `no`     | `true`  | Enable `send_message()`.                                           |
| `all`                 | `boolean`  | `no`     | `false` | Enable the full upstream toolkit surface.                          |

### Example

```
agents:
  notifier:
    tools:
      - telegram:
          chat_id: "-1001234567890"
```

```
send_message("Nightly backup completed.")
```

### Notes

- Set both `chat_id` and `token` for a usable configuration.
- Because the destination chat is fixed in config, this tool is best for one bot-to-room delivery path rather than general multi-room Telegram automation.
- If you need different Telegram destinations, configure different agents or different tool credentials per scope.

## \[`whatsapp`\]

`whatsapp` is the WhatsApp Business API toolkit for text messages and template messages through Meta's Graph API.

### What It Does

The installed upstream tool can expose either `send_text_message_sync()` and `send_template_message_sync()` or their async variants, depending on `async_mode`. It posts to `https://graph.facebook.com/<version>/<phone_number_id>/messages`. `recipient_waid` sets a default recipient so callers can omit the `recipient` argument. If no default recipient is configured, every send call must provide one.

### Configuration

| Option            | Type       | Required | Default | Notes                                                                                       |
| ----------------- | ---------- | -------- | ------- | ------------------------------------------------------------------------------------------- |
| `access_token`    | `password` | `no`     | `null`  | WhatsApp Business API token, or use `WHATSAPP_ACCESS_TOKEN`. Required in practice.          |
| `phone_number_id` | `text`     | `no`     | `null`  | WhatsApp Business phone number ID, or use `WHATSAPP_PHONE_NUMBER_ID`. Required in practice. |
| `version`         | `text`     | `no`     | `v22.0` | Graph API version prefix.                                                                   |
| `recipient_waid`  | `text`     | `no`     | `null`  | Default recipient phone number or WhatsApp ID.                                              |
| `async_mode`      | `boolean`  | `no`     | `false` | Register async send functions instead of sync send functions.                               |

### Example

```
agents:
  pager:
    tools:
      - whatsapp:
          version: v22.0
          recipient_waid: "+15551234567"
          async_mode: false
```

```
send_text_message_sync("The deployment finished.")
send_template_message_sync(template_name="deployment_notice", language_code="en_US")
```

### Notes

- Set both `access_token` and `phone_number_id` even though the metadata marks them optional.
- `async_mode: true` changes the registered function names to the async variants, which matters if you are debugging tool traces or reading model-generated tool calls.
- Template sends expect a preapproved WhatsApp template name and, optionally, template `components`.

## \[`twilio`\]

`twilio` is the telecom-oriented toolkit for SMS sends, call lookups, and recent message history.

### What It Does

The installed upstream tool exposes `send_sms()`, `get_call_details()`, and `list_messages()`. It supports two auth modes: `account_sid` plus `auth_token`, or `account_sid` plus `api_key` and `api_secret`. Optional `region` and `edge` are passed into the Twilio client for regional routing. `send_sms()` validates that both `to` and `from_` are in E.164 format before sending.

### Configuration

| Option                    | Type       | Required | Default | Notes                                                                  |
| ------------------------- | ---------- | -------- | ------- | ---------------------------------------------------------------------- |
| `account_sid`             | `text`     | `no`     | `null`  | Twilio account SID, or use `TWILIO_ACCOUNT_SID`. Required in practice. |
| `auth_token`              | `password` | `no`     | `null`  | Twilio auth token for the simpler auth mode.                           |
| `api_key`                 | `password` | `no`     | `null`  | Twilio API key for key-and-secret auth.                                |
| `api_secret`              | `password` | `no`     | `null`  | Twilio API secret for key-and-secret auth.                             |
| `region`                  | `text`     | `no`     | `null`  | Optional Twilio region such as `au1`.                                  |
| `edge`                    | `text`     | `no`     | `null`  | Optional Twilio edge such as `sydney`.                                 |
| `debug`                   | `boolean`  | `no`     | `false` | Enable Twilio HTTP client logging.                                     |
| `enable_send_sms`         | `boolean`  | `no`     | `true`  | Enable `send_sms()`.                                                   |
| `enable_get_call_details` | `boolean`  | `no`     | `true`  | Enable `get_call_details()`.                                           |
| `enable_list_messages`    | `boolean`  | `no`     | `true`  | Enable `list_messages()`.                                              |
| `all`                     | `boolean`  | `no`     | `false` | Enable the full upstream toolkit surface.                              |

### Example

```
agents:
  phone_ops:
    tools:
      - twilio:
          region: au1
          edge: sydney
          enable_list_messages: true
```

```
send_sms("+15551234567", "+15557654321", "Build passed.")
get_call_details("CA1234567890abcdef")
list_messages(limit=10)
```

### Notes

- `account_sid` is required in both supported auth modes.
- Use either `auth_token` or the `api_key` plus `api_secret` pair, not both as separate independent auth methods.
- `send_sms()` rejects non-E.164 numbers before it reaches Twilio's API.

## \[`webex`\]

`webex` is the Cisco Webex toolkit for room messaging and room listing.

### What It Does

The installed upstream tool exposes `send_message()` and `list_rooms()`. It authenticates with `webexpythonsdk.WebexAPI` using one access token. Despite the broader description in the registry, the current tool surface is messaging-centric and does not manage meetings. Responses are returned as JSON strings built from the SDK result objects.

### Configuration

| Option                | Type       | Required | Default | Notes                                                                  |
| --------------------- | ---------- | -------- | ------- | ---------------------------------------------------------------------- |
| `enable_send_message` | `boolean`  | `no`     | `true`  | Enable `send_message()`.                                               |
| `enable_list_rooms`   | `boolean`  | `no`     | `true`  | Enable `list_rooms()`.                                                 |
| `all`                 | `boolean`  | `no`     | `false` | Enable the full upstream toolkit surface.                              |
| `access_token`        | `password` | `no`     | `null`  | Webex access token, or use `WEBEX_ACCESS_TOKEN`. Required in practice. |

### Example

```
agents:
  meetings:
    tools:
      - webex:
          enable_list_rooms: true
```

```
list_rooms()
send_message("Y2lzY29zcGFyazovL3VzL1JPT00v...", "Agenda is ready.")
```

### Notes

- Set `access_token` even though metadata marks it optional.
- The current tool surface is room messaging and room discovery only.
- Use room IDs, not room titles, when sending messages.

## \[`resend`\]

`resend` is the transactional-email API toolkit for HTML email delivery through Resend.

### What It Does

The installed upstream tool exposes one function, `send_email()`. It sets `resend.api_key` on each call and sends email through `resend.Emails.send()`. The current implementation passes the message body as HTML, not plain text. `from_email` is stored on the tool instance and reused for every call.

### Configuration

| Option              | Type       | Required | Default | Notes                                                                              |
| ------------------- | ---------- | -------- | ------- | ---------------------------------------------------------------------------------- |
| `api_key`           | `password` | `no`     | `null`  | Resend API key, or use `RESEND_API_KEY`. Required in practice.                     |
| `from_email`        | `text`     | `no`     | `null`  | Sender identity used for every call. Usually required by the provider in practice. |
| `enable_send_email` | `boolean`  | `no`     | `true`  | Enable `send_email()`.                                                             |
| `all`               | `boolean`  | `no`     | `false` | Enable the full upstream toolkit surface.                                          |

### Example

```
agents:
  mailer:
    tools:
      - resend:
          from_email: no-reply@example.com
```

```
send_email("alice@example.com", "Welcome", "<p>Your account is ready.</p>")
```

### Notes

- `from_email` is not marked required in metadata, but most Resend setups need a verified sender.
- The `body` argument is sent as HTML.
- Use `resend` when you want provider-managed transactional delivery rather than Gmail mailbox access.

## \[`email`\]

`email` is the simplest SMTP mailer on this page, but on this branch it is specifically wired for Gmail SMTP rather than generic SMTP.

### What It Does

The installed upstream tool exposes one function, `email_user()`. It builds an `EmailMessage`, then logs in with `smtplib.SMTP_SSL("smtp.gmail.com", 465)`. That means the sender account must be a Gmail account or a Google Workspace account compatible with Gmail SMTP. The current implementation sends plain-text bodies only.

### Configuration

| Option              | Type       | Required | Default | Notes                                                                |
| ------------------- | ---------- | -------- | ------- | -------------------------------------------------------------------- |
| `receiver_email`    | `text`     | `no`     | `null`  | Default recipient for all `email_user()` calls.                      |
| `sender_name`       | `text`     | `no`     | `null`  | Display name shown in the `From` header.                             |
| `sender_email`      | `text`     | `no`     | `null`  | Gmail sender address used for SMTP login.                            |
| `sender_passkey`    | `password` | `no`     | `null`  | Gmail app password or equivalent SMTP passkey. Required in practice. |
| `enable_email_user` | `boolean`  | `no`     | `true`  | Enable `email_user()`.                                               |
| `all`               | `boolean`  | `no`     | `false` | Enable the full upstream toolkit surface.                            |

### Example

```
agents:
  alerts:
    tools:
      - email:
          receiver_email: oncall@example.com
          sender_name: MindRoom Alerts
          sender_email: alerts@gmail.com
```

```
email_user("Nightly report", "The report finished successfully.")
```

### Notes

- Despite the generic tool name, there are no host, port, TLS, or auth-mechanism overrides in the current implementation.
- This tool is best for simple Gmail-based outbound mail, not arbitrary SMTP providers.
- If you need mailbox reads, drafts, replies, or labels, use `gmail` instead.
- If you need provider-managed transactional delivery with HTML bodies, use `resend` instead.

## \[`x`\]

`x` is the X or Twitter toolkit for recent-post search, user lookup, timeline access, posting, replying, and DMs.

### What It Does

The installed upstream tool exposes `create_post()`, `reply_to_post()`, `send_dm()`, `get_user_info()`, `get_home_timeline()`, and `search_posts()`. It uses `tweepy.Client` and passes through `wait_on_rate_limit`. `search_posts()` calls `search_recent_tweets()` and, when `include_post_metrics` is enabled, augments each returned post with reply, retweet, like, and quote counts. The implementation clamps `max_results` for search to the Twitter API's supported `10` to `100` range.

### Configuration

| Option                 | Type       | Required | Default | Notes                                                           |
| ---------------------- | ---------- | -------- | ------- | --------------------------------------------------------------- |
| `bearer_token`         | `password` | `no`     | `null`  | Bearer token, or use `X_BEARER_TOKEN`.                          |
| `consumer_key`         | `password` | `no`     | `null`  | OAuth consumer key, or use `X_CONSUMER_KEY`.                    |
| `consumer_secret`      | `password` | `no`     | `null`  | OAuth consumer secret, or use `X_CONSUMER_SECRET`.              |
| `access_token`         | `password` | `no`     | `null`  | OAuth access token, or use `X_ACCESS_TOKEN`.                    |
| `access_token_secret`  | `password` | `no`     | `null`  | OAuth access token secret, or use `X_ACCESS_TOKEN_SECRET`.      |
| `include_post_metrics` | `boolean`  | `no`     | `false` | Include public metrics in `search_posts()` output.              |
| `wait_on_rate_limit`   | `boolean`  | `no`     | `false` | Let Tweepy wait for rate limits instead of failing immediately. |

### Example

```
agents:
  social:
    tools:
      - x:
          include_post_metrics: true
          wait_on_rate_limit: true
```

```
search_posts("mindroom matrix", max_results=10)
get_user_info("mindroom_ai")
create_post("MindRoom now supports another release.")
reply_to_post("1890123456789012345", "Thanks for the feedback.")
```

### Notes

- A bearer token can support read-style endpoints such as search, but posting, replying, DMs, and home-timeline access generally need full OAuth user credentials.
- The toolkit also defines `get_my_info()`, but MindRoom's current registered tool list on this branch does not advertise a separate config flag for it.
- `reply_to_post()` builds a `twitter.com` URL in its response, while `create_post()` builds an `x.com` URL, so response formatting is currently inconsistent upstream.

## \[`reddit`\]

`reddit` is the Reddit toolkit for reading user and subreddit data, listing trending communities, and optionally posting or replying with user credentials.

### What It Does

The installed upstream tool exposes `get_user_info()`, `get_top_posts()`, `get_subreddit_info()`, `get_trending_subreddits()`, `get_subreddit_stats()`, `create_post()`, `reply_to_post()`, and `reply_to_comment()`. With only `client_id` and `client_secret`, the tool initializes a read-only `praw.Reddit` client. If `username` and `password` are also configured, the tool enables posting and replying with authenticated user actions. `reddit_instance` is an advanced programmatic injection point for an existing `praw.Reddit` object rather than a normal YAML value.

### Configuration

| Option            | Type       | Required | Default | Notes                                                                          |
| ----------------- | ---------- | -------- | ------- | ------------------------------------------------------------------------------ |
| `reddit_instance` | `text`     | `no`     | `null`  | Advanced programmatic Reddit client injection, not normal YAML authoring.      |
| `client_id`       | `text`     | `no`     | `null`  | Reddit app client ID, or use `REDDIT_CLIENT_ID`. Required in practice.         |
| `client_secret`   | `password` | `no`     | `null`  | Reddit app client secret, or use `REDDIT_CLIENT_SECRET`. Required in practice. |
| `user_agent`      | `text`     | `no`     | `null`  | Optional custom user agent, with `RedditTools v1.0` as the upstream fallback.  |
| `username`        | `text`     | `no`     | `null`  | Reddit username for posting and replying.                                      |
| `password`        | `password` | `no`     | `null`  | Reddit password for posting and replying.                                      |

### Example

```
agents:
  research:
    tools:
      - reddit:
          user_agent: MindRoomResearchBot/1.0
```

```
get_top_posts("matrixdotorg", time_filter="week", limit=10)
get_subreddit_info("python")
get_trending_subreddits()
get_user_info("spez")
```

### Notes

- `client_id` and `client_secret` are enough for read-only operations.
- `create_post()`, `reply_to_post()`, and `reply_to_comment()` additionally require `username` and `password`.
- The current MindRoom metadata treats `reddit_instance` as text, but the upstream constructor expects an already constructed `praw.Reddit` object.

## \[`zoom`\]

`zoom` is the Zoom meeting-management toolkit for scheduling, listing, inspecting, deleting, and reading recordings through Zoom's Server-to-Server OAuth flow.

### What It Does

The installed upstream tool exposes `get_access_token()`, `schedule_meeting()`, `get_upcoming_meetings()`, `list_meetings()`, `get_meeting_recordings()`, `delete_meeting()`, and `get_meeting()`. It exchanges `account_id`, `client_id`, and `client_secret` against `https://zoom.us/oauth/token` with `grant_type=account_credentials`. The generated access token is cached in process until shortly before expiry. Meeting creation always targets `users/me/meetings` and applies a fixed set of default meeting settings in the upstream implementation.

### Configuration

| Option          | Type       | Required | Default | Notes                                                                                              |
| --------------- | ---------- | -------- | ------- | -------------------------------------------------------------------------------------------------- |
| `account_id`    | `text`     | `no`     | `null`  | Zoom account ID from a Server-to-Server OAuth app, or use `ZOOM_ACCOUNT_ID`. Required in practice. |
| `client_id`     | `text`     | `no`     | `null`  | Zoom client ID, or use `ZOOM_CLIENT_ID`. Required in practice.                                     |
| `client_secret` | `password` | `no`     | `null`  | Zoom client secret, or use `ZOOM_CLIENT_SECRET`. Required in practice.                             |

### Example

```
agents:
  coordinator:
    tools:
      - zoom:
          account_id: your_account_id
          client_id: your_client_id
```

```
schedule_meeting("Weekly sync", "2026-04-02T16:00:00Z", 30, timezone="America/Los_Angeles")
get_upcoming_meetings()
list_meetings(type="scheduled")
get_meeting("81234567890")
```

### Notes

- Although MindRoom marks `zoom` as `setup_type: oauth`, the current implementation is not an interactive browser OAuth flow.
- The installed tool expects Server-to-Server OAuth credentials and exchanges them directly for an access token on demand.
- `get_meeting_recordings()` can request a download token and TTL per call, but those are call arguments rather than config fields.

## Related Docs

- [Tools Overview](https://docs.mindroom.chat/tools/index.md)
- [Automation & Platforms](https://docs.mindroom.chat/tools/automation-and-platforms/index.md) - For `aws_ses` when you want an alternative outbound-email provider.
