- Add defensive String(value ?? '') wrapper to trim() calls in channel.ts - Show both webhook and OAuth redirect URLs after credential entry - Update docs with clear URL configuration (removed confusing :3001 port) - Match Slack's URL pattern with gateway-host placeholder - Clarify local dev (ngrok) vs production (reverse proxy) setup
6.5 KiB
| summary | read_when | ||
|---|---|---|---|
| Zoom Team Chat plugin support status, capabilities, and configuration |
|
Zoom Team Chat
Status: production-ready plugin for Zoom Team Chat direct messages via Team Chat Bot API and webhooks.
Quick setup
- Create a 'General App' in Zoom App Marketplace
- Enable the Team Chat surface and note your credentials (Client ID, Client Secret, Bot JID, Webhook Secret Token)
- Install the plugin:
pnpm install(the zoom extension is included in the workspace) - Configure URLs (see URL Configuration below):
- Webhook URL:
https://gateway-host/webhooks/zoom - OAuth Redirect URL:
https://gateway-host/api/zoomapp/auth
- Webhook URL:
- Set credentials in config:
{ channels: { zoom: { enabled: true, clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET", botJid: "YOUR_BOT_JID@xmppdev.zoom.us", secretToken: "YOUR_SECRET_TOKEN", dm: { policy: "open" } } } } - Start the gateway
- 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 Team Chat App
- Go to Zoom App Marketplace
- Click "Create" and select "Team Chat App"
- Enable the Bot feature
- Note your credentials from the app settings:
- Client ID
- Client Secret
- Bot JID (e.g.,
bot@xmppdev.zoom.us) - Secret Token (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
3. Install App to Your Account
- In app settings, click "Install"
- Authorize the app
- The bot will appear in your Zoom Team Chat
4. Configure Moltbot
Add to moltbot.yaml:
channels:
zoom:
enabled: true
clientId: YOUR_CLIENT_ID
clientSecret: YOUR_CLIENT_SECRET
botJid: YOUR_BOT_JID@xmppdev.zoom.us
secretToken: YOUR_SECRET_TOKEN
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 | closed | allowlist
5. Start Gateway
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):
dm:
policy: open
Anyone can message the bot.
Closed:
dm:
policy: closed
Bot rejects all DMs.
Allowlist:
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):
channels:
zoom:
apiHost: https://zoomdev.us
oauthHost: https://zoomdev.us
botJid: bot@xmppdev.zoom.us
Production (zoom.us):
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
- Check tunnel is running (if using FRP or similar)
- Verify webhook URL in Zoom app settings matches your tunnel/domain
- Check gateway logs for errors
- Verify
secretTokenmatches your app configuration
Bot Not Responding
- Verify credentials in
moltbot.yamlare correct - Check Anthropic API key is valid
- Ensure
botJidmatches your app's Bot JID exactly - Confirm app is installed to your Zoom account
- Check gateway logs for authentication errors
OAuth Issues
If you see authentication errors:
- Verify
clientIdandclientSecretare correct - Check
oauthHostmatches 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.
Security
Never commit credentials!
Store sensitive values in moltbot.yaml (gitignored) and use moltbot-example.yaml for documentation templates.
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