openclaw/docs/channels/zoom.md
Pranav Katariya 2310030f5f zoom: add redirectUri config for OAuth
Add redirectUri prompt in onboarding and update docs.
Fixes OAuth token exchange by ensuring redirect_uri matches Zoom app settings.
2026-01-28 02:39:15 -08:00

302 lines
7.9 KiB
Markdown

---
summary: "Zoom Team Chat plugin support status, capabilities, and configuration"
read_when:
- Working on Zoom Team Chat integration
- Setting up Zoom bot webhooks
---
# Zoom Team Chat
Status: production-ready plugin for Zoom Team Chat direct messages via Team Chat Bot API and webhooks.
## Quick setup
1) Create a 'General App' in [Zoom App Marketplace](https://marketplace.zoom.us/develop/create)
2) Production tab: Add OAuth Redirect URL (`https://gateway-host/api/zoomapp/auth`)
3) Features tab → Surfaces → Team Chat: Toggle on Team Chat Subscription, add Bot endpoint URL (`https://gateway-host/webhooks/zoom`) and Welcome Message
4) Note your credentials: Client ID, Client Secret, Bot JID, Secret Token
5) Install the plugin: `pnpm install` (the zoom extension is included in the workspace)
6) Set credentials in config:
```json5
{
channels: {
zoom: {
enabled: true,
clientId: "YOUR_CLIENT_ID",
clientSecret: "YOUR_CLIENT_SECRET",
botJid: "YOUR_BOT_JID@xmppdev.zoom.us",
secretToken: "YOUR_SECRET_TOKEN",
redirectUri: "https://yourdomain.com/api/zoomapp/auth",
dm: { policy: "open" }
}
}
}
```
6) Start the gateway
7) Message the bot in Zoom Team Chat
## What it is
- A Zoom Team Chat channel plugin that receives messages via webhooks
- Direct message support (groups not currently supported)
- Webhook server runs on port 3001 (Gateway Control UI uses 3000)
- OAuth 2.0 client credentials flow for API authentication
## Setup (detailed)
### 1. Create Zoom App
1) Go to [Zoom App Marketplace](https://marketplace.zoom.us/develop/create)
2) Click "Create" and select "**General App**"
3) Fill in basic app information (name, description, etc.)
4) Go to the **Production** tab:
- Add **OAuth Redirect URL**: `https://gateway-host/api/zoomapp/auth`
5) Go to the **Features** tab:
- Under **Surfaces**, select "**Team Chat**"
- Toggle on "**Team Chat Subscription**"
- Add **Bot endpoint URL**: `https://gateway-host/webhooks/zoom`
- Set **Welcome Message** for the bot (e.g., "Hello! I'm your AI assistant.")
6) Note your credentials from the app settings:
- **Client ID** (from App Credentials)
- **Client Secret** (from App Credentials)
- **Bot JID** (from Team Chat section, e.g., `bot@xmppdev.zoom.us`)
- **Secret Token** (from Team Chat section, for webhook verification)
### 2. Configure URLs
Configure these URLs in your Zoom app settings:
**Webhook URL** (for receiving messages):
```
https://gateway-host/webhooks/zoom
```
**OAuth Redirect URL** (for app installation):
```
https://gateway-host/api/zoomapp/auth
```
Replace `gateway-host` with:
- **Local development**: Use ngrok (`ngrok http 3001`) or another tunnel service to expose port 3001
- **Production**: Your server's public domain (configure reverse proxy to forward to port 3001)
Subscribe to these event types:
- `bot_notification` - Required for receiving messages
**Important**: The `redirectUri` in your Moltbot config must EXACTLY match the OAuth Redirect URL configured in your Zoom app. OAuth will fail if these don't match.
Examples:
- Local dev: `https://abc123.ngrok.io/api/zoomapp/auth`
- Production: `https://yourdomain.com/api/zoomapp/auth`
### 3. Install App to Your Account
1) In app settings, click "Install"
2) Authorize the app
3) The bot will appear in your Zoom Team Chat
### 4. Configure Moltbot
Add to `~/.clawdbot/moltbot.json`:
```json5
{
channels: {
zoom: {
enabled: true,
clientId: "YOUR_CLIENT_ID",
clientSecret: "YOUR_CLIENT_SECRET",
botJid: "YOUR_BOT_JID@xmppdev.zoom.us",
secretToken: "YOUR_SECRET_TOKEN",
redirectUri: "https://yourdomain.com/api/zoomapp/auth", // Must match Zoom app OAuth Redirect URL
apiHost: "https://zoomdev.us", // Use https://api.zoom.us for production
oauthHost: "https://zoomdev.us", // Use https://zoom.us for production
dm: {
policy: "open" // open | allowlist | pairing
}
}
}
}
```
### 5. Start Gateway
```bash
moltbot gateway run
```
The webhook server will start on port 3001.
### 6. Test
Send a direct message to your bot in Zoom Team Chat. The bot should respond with context-aware replies.
## Configuration Options
### DM Policies
**Open** (default):
```json5
{
channels: {
zoom: {
dm: {
policy: "open"
}
}
}
}
```
Anyone can message the bot.
**Closed**:
```json5
{
channels: {
zoom: {
dm: {
policy: "closed"
}
}
}
}
```
Bot rejects all DMs.
**Allowlist**:
```json5
{
channels: {
zoom: {
dm: {
policy: "allowlist",
allowFrom: [
"user1@xmppdev.zoom.us",
"user2@xmppdev.zoom.us"
]
}
}
}
}
```
Only specified users can message the bot.
### Development vs Production
**Development (zoomdev.us):**
```json5
{
channels: {
zoom: {
apiHost: "https://zoomdev.us",
oauthHost: "https://zoomdev.us",
botJid: "bot@xmppdev.zoom.us"
}
}
}
```
**Production (zoom.us):**
```json5
{
channels: {
zoom: {
apiHost: "https://api.zoom.us",
oauthHost: "https://zoom.us",
botJid: "bot@xmpp.zoom.us"
}
}
}
```
## Features
- **Direct Messages**: One-on-one conversations
- **Conversation History**: Full context retention across messages
- **Streaming Responses**: Real-time message updates
- **Tool Execution**: All standard Moltbot tools are available
- **Session Management**: Persistent sessions per user
## Session Keys
Session keys follow the format:
```
zoom:default:user@xmppdev.zoom.us
```
Sessions are stored at:
```
~/.moltbot/agents/{agentId}/sessions/{session-id}.jsonl
```
## Capabilities
- **Chat types**: Direct messages only (groups not supported)
- **Reactions**: Not supported
- **Threads**: Not supported
- **Media**: Not currently supported
- **Streaming**: Supported (coalesced with 1500 char minimum, 1000ms idle)
## Troubleshooting
### Port 3000 Conflict
If you see "port 3000 already in use":
- Gateway Control UI runs on port 3000
- Zoom webhook server uses port 3001
- This is expected and correct
### Webhook Not Receiving Messages
1. Check tunnel is running (if using FRP or similar)
2. Verify webhook URL in Zoom app settings matches your tunnel/domain
3. Check gateway logs for errors
4. Verify `secretToken` matches your app configuration
### Bot Not Responding
1. Verify credentials in `~/.clawdbot/moltbot.json` are correct
2. Check LLM provider API key is configured (see `moltbot login`)
3. Ensure `botJid` matches your app's Bot JID exactly
4. Confirm app is installed to your Zoom account
5. Check gateway logs for authentication errors
### OAuth Issues
If you see authentication errors:
- Verify `clientId` and `clientSecret` are correct
- Check `oauthHost` matches your environment (dev vs prod)
- Review gateway logs for OAuth token errors
## Architecture
The Zoom plugin follows Moltbot's standard channel plugin architecture:
- **Extension**: `extensions/zoom/` - Plugin registration and metadata
- **Core**: `src/zoom/` - Webhook server, message handling, API client
- **Monitor**: Starts Express server on port 3001, handles webhook events
- **Message Handler**: Integrates with `dispatchInboundMessage()` for AI routing
For implementation details, see the [plugin source code](https://github.com/moltbot/moltbot/tree/main/extensions/zoom).
## Security
**Never commit credentials!**
Store sensitive values in `~/.clawdbot/moltbot.json` (user's home directory, not in repo).
Webhook events are verified using the `secretToken` from your Zoom app configuration.
## Limitations
- Groups are not currently supported
- Media uploads not yet implemented
- Reactions not supported
- Thread support not available
## See Also
- [Channels Overview](/channels)
- [Gateway Configuration](/gateway/configuration)
- [Security Policies](/gateway/security)
- [Zoom App Marketplace](https://marketplace.zoom.us/)