← Back to Plugins
Channels

Zoom

agent-plex By agent-plex 👁 1 views ▲ 0 votes

Zoom Team Chat channel plugin for OpenClaw โ€” WebSocket mode, no public URL required ๐Ÿฆž

GitHub

Install

npm install @plexlabs/openclaw-zoom

Configuration Example

{
  "channels": {
    "zoom": {
      "clientId": "your_zoom_client_id",
      "clientSecret": "your_zoom_client_secret",
      "botJid": "[email protected]",
      "subscriptionId": "your_subscription_id",
      "dmPolicy": "open",
      "groupPolicy": "allowlist",
      "groupAllowFrom": ["allowed_channel_jid"]
    }
  }
}

README

# @plexlabs/openclaw-zoom

**Zoom Team Chat channel plugin for OpenClaw** โ€” WebSocket mode, no public URL required.

This is the **first Zoom Team Chat plugin** for the OpenClaw ecosystem, enabling AI agents to send and receive messages via Zoom Team Chat using WebSocket delivery.

Built with โšก by [Plex Labs](https://plexlabs.ai)

---

## Features

- โœ… **WebSocket-based** โ€” No webhooks, no public URL needed
- โœ… **Works behind NAT** โ€” Perfect for local development and private networks
- โœ… **Auto-reconnect** โ€” Exponential backoff on connection failures
- โœ… **Proactive token refresh** โ€” Refreshes OAuth tokens before expiry
- โœ… **Security policies** โ€” DM and group allowlists
- โœ… **Markdown support** โ€” Send formatted messages
- โœ… **TypeScript** โ€” Fully typed for better DX

---

## Prerequisites

- **OpenClaw** >= 2026.3.0
- **Node.js** >= 18.0.0
- **Zoom account** with Team Chat enabled
- **Zoom App** created on marketplace.zoom.us

### Zoom Plan Requirements

Zoom Team Chat is available on:
- Zoom Pro, Business, or Enterprise plans
- Team Chat must be enabled in your account settings

---

## Installation

```bash
npm install @plexlabs/openclaw-zoom
```

---

## Setup

### 1. Create a Zoom App

1. Go to [Zoom Marketplace](https://marketplace.zoom.us/)
2. Click **Develop** โ†’ **Build App**
3. Choose **Team Chat App**
4. Fill in basic information:
   - **App Name**: OpenClaw Bot (or your preferred name)
   - **Description**: AI-powered chatbot for Zoom Team Chat
   - **Company Name**: Your company/organization

### 2. Configure App Scopes

Navigate to **Scopes** and add:
- `imchat:bot` โ€” Required for sending/receiving messages

### 3. Enable Features

Go to **Features** โ†’ **Team Chat**:
- Enable **Chatbot**
- Note down the **Bot JID** (looks like `[email protected]`)

### 4. Set Up Event Subscriptions

1. Go to **Features** โ†’ **Event Subscriptions**
2. Select **Use WebSocket**
3. Copy the **Subscription ID**
4. Subscribe to event types:
   - `chat_message.sent` โ€” Receive messages sent to the bot

### 5. Get Credentials

Navigate to **App Credentials**:
- Copy **Client ID**
- Copy **Client Secret**

### 6. Activate the App

1. Go to **Activation**
2. Install the app to your Zoom account
3. Authorize the requested permissions

---

## Configuration

Add the Zoom configuration to your `openclaw.json`:

```json
{
  "channels": {
    "zoom": {
      "clientId": "your_zoom_client_id",
      "clientSecret": "your_zoom_client_secret",
      "botJid": "[email protected]",
      "subscriptionId": "your_subscription_id",
      "dmPolicy": "open",
      "groupPolicy": "allowlist",
      "groupAllowFrom": ["allowed_channel_jid"]
    }
  }
}
```

### Configuration Options

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `clientId` | string | โœ… | Zoom App Client ID |
| `clientSecret` | string | โœ… | Zoom App Client Secret |
| `botJid` | string | โœ… | Bot JID from Features page |
| `subscriptionId` | string | โœ… | Event Subscription ID |
| `dmPolicy` | string | โŒ | DM security: `open`, `allowlist`, `pairing` (default: `open`) |
| `allowFrom` | string[] | โŒ | Allowed user JIDs for DMs (when `dmPolicy: "allowlist"`) |
| `groupPolicy` | string | โŒ | Group security: `open`, `allowlist` (default: `open`) |
| `groupAllowFrom` | string[] | โŒ | Allowed channel JIDs for groups |

### Security Policies

**DM Policy** (`dmPolicy`):
- `open` โ€” Accept DMs from anyone
- `allowlist` โ€” Only accept DMs from users in `allowFrom` list
- `pairing` โ€” Require device pairing (not yet implemented)

**Group Policy** (`groupPolicy`):
- `open` โ€” Respond in all channels where the bot is added
- `allowlist` โ€” Only respond in channels listed in `groupAllowFrom`

---

## Usage

### Starting OpenClaw

Once configured, start OpenClaw:

```bash
openclaw gateway start
```

The Zoom plugin will:
1. Fetch an OAuth token using client credentials
2. Connect to Zoom WebSocket
3. Start receiving messages
4. Send heartbeats every 30 seconds
5. Auto-reconnect on disconnection
6. Proactively refresh tokens before expiry

### Sending Messages

Messages sent from OpenClaw to Zoom will be delivered via the REST API with markdown support.

### Finding JIDs

To find user or channel JIDs for allowlists:
- User JIDs are typically visible in message payloads
- You can enable temporary `open` policy and check logs for JIDs
- Zoom support: [Chatbot Development Guide](https://developers.zoom.us/docs/team-chat-apps/chatbots/)

---

## Architecture

### WebSocket Connection

```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         OAuth Token          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚             โ”‚ โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚             โ”‚
โ”‚  OpenClaw   โ”‚                               โ”‚    Zoom     โ”‚
โ”‚             โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    WebSocket (wss://)         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                                             โ”‚
       โ”‚          Inbound: bot_notification          โ”‚
       โ”‚ โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚
       โ”‚                                             โ”‚
       โ”‚          Outbound: REST API                 โ”‚
       โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚
       โ”‚         POST /v2/im/chat/messages           โ”‚
```

### Components

- **`ZoomClient`** โ€” OAuth token management and REST API calls
- **`ZoomWebSocketManager`** โ€” WebSocket connection, heartbeat, reconnection
- **`zoomChannelPlugin`** โ€” OpenClaw channel adapter (config, security, outbound)

### Token Lifecycle

1. Fetch token with `grant_type=client_credentials`
2. Token expires in 60 minutes
3. **Proactive refresh** at 55 minutes
4. Token used for WebSocket connection and API calls

### Reconnection Strategy

- Initial backoff: 1 second
- Exponential backoff: doubles each attempt
- Max backoff: 60 seconds
- Resets on successful connection

---

## Development

### Build

```bash
npm run build
```

### Watch Mode

```bash
npm run watch
```

### Testing

```bash
npm test
```

---

## Troubleshooting

### WebSocket Won't Connect

**Symptom**: `[Zoom WS] Connection failed`

**Solutions**:
1. Verify `subscriptionId` is correct
2. Check that OAuth token is valid (`clientId` and `clientSecret`)
3. Ensure event subscriptions are enabled in Zoom App settings
4. Check network firewall allows WebSocket connections to `wss://ws.zoom.us`

### Token Refresh Failures

**Symptom**: `Zoom OAuth failed: 401`

**Solutions**:
1. Verify `clientId` and `clientSecret` are correct
2. Ensure app is activated in Zoom Marketplace
3. Check app hasn't been deauthorized

### Messages Not Received

**Symptom**: Bot doesn't respond to messages

**Solutions**:
1. Check `dmPolicy` and `groupPolicy` settings
2. Verify sender's JID is in `allowFrom` (if using `allowlist`)
3. Ensure bot is added to the channel (for group messages)
4. Check OpenClaw logs for errors

### Messages Not Sent

**Symptom**: `Send failed`

**Solutions**:
1. Verify `botJid` is correct
2. Check recipient JID format (should be `[email protected]` or channel JID)
3. Ensure bot has `imchat:bot` scope
4. Check Zoom API rate limits

---

## Limitations

- **Single account only** โ€” Multi-account support not yet implemented
- **No threading** โ€” Zoom Team Chat doesn't expose thread/reply IDs via API
- **No reactions** โ€” Not supported by Zoom API
- **No message editing/deletion** โ€” Not supported by current Zoom API
- **No attachments** โ€” Not yet implemented (Zoom supports it)

---

## Roadmap

- [ ] Pairing policy implementation
- [ ] Multi-account support
- [ ] Attachment support (images, files)
- [ ] Rich message formatting (cards, buttons)
- [ ] Slash commands
- [ ] Interactive setup wizard
- [ ] Rate limit handling with backoff

---

## Contributing

Contributions welcome! Please:
1. Fork the repository
2. Create a feature branch
3. Write tests for new functionality
4. Submit a pull request

---

## License

MIT โ€” see [LICENSE](./LICENSE)

---

## Credits

Built by **Plex Labs** โ€” [plexlabs.ai](https://plexlabs.ai)

Part of the [OpenClaw](https://github.com/openclaw/openclaw) ecosystem.

---

## Support

- **Issues**: [GitHub Issues](https://github.com/agent-plex/openclaw-zoom/issues)
- **Discussions**: [GitHub Discussions](https://github.com/agent-plex/openclaw-zoom/discussions)
- **Zoom Docs**: [Team Chat Apps](https://developers.zoom.us/docs/team-chat-apps/)
- **OpenClaw Docs**: [openclaw.dev](https://openclaw.dev)

---

**Made with โšก by Plex Labs**
channels

Comments

Sign in to leave a comment

Loading comments...