Use Case: AI-Powered Team Chat Bot with LLM Integration
Build an intelligent Zoom Team Chat bot that uses Claude/GPT for natural language understanding and can be chained with other Zoom skills.
Build an intelligent Zoom Team Chat bot that uses Claude/GPT for natural language understanding and can be chained with other Zoom skills.
Build an intelligent Zoom Team Chat bot that uses Claude/GPT for natural language understanding and can be chained with other Zoom skills.
Create a chatbot that:
User sends message → Team Chat Bot receives webhook
↓
Call LLM (Claude/GPT)
↓
Parse LLM response for intent
↓
┌──────────────────┼──────────────────┐
│ │ │
Create Meeting Get User Info Send Response
(REST API) (REST API) (Team Chat)**Skill**: `zoom-team-chat`
// Handle bot notification
case 'bot_notification': {
const { toJid, cmd, accountId } = payload;
// Call LLM
const llmResponse = await callClaude(cmd);
// Check for intents
const intent = parseIntent(llmResponse);
if (intent.type === 'create_meeting') {
await handleCreateMeeting(toJid, accountId, intent);
} else {
await sendTextMessage(toJid, accountId, llmResponse);
}
}**Skills**: `zoom-team-chat` + `zoom-rest-api`
async function handleCreateMeeting(toJid, accountId, intent) {
// Extract meeting details from LLM response
const { topic, start_time, duration } = intent.details;
// Create meeting using REST API
const meeting = await fetch('https://api.zoom.us/v2/users/me/meetings', {
method: 'POST',
headers: {
'Authorization': `Bearer ${userAccessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
topic,
type: 2, // Scheduled meeting
start_time,
duration
})
});
const meetingData = await meeting.json();
// Send meeting details back to Team Chat
await sendChatbotMessage(toJid, accountId, {
head: { text: 'Meeting Created' },
body: [
{ type: 'message', text: `Meeting "${topic}" created successfully!` },
{
type: 'fields',
items: [
{ key: 'Start Time', value: start_time },
{ key: 'Duration', value: `${duration} minutes` },
{ key: 'Join URL', value: meetingData.join_url }
]
},
{
type: 'actions',
items: [
{ text: 'Join Meeting', value: `join_${meetingData.id}`, style: 'Primary' },
{ text: 'Share Link', value: `share_${meetingData.id}`, style: 'Default' }
]
}
]
});
}**Skill**: `zoom-team-chat`
const Anthropic = require('@anthropic-ai/sdk');
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
async function callClaude(userMessage) {
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
system: `You are a Zoom assistant bot. You can help users with:
- Creating meetings
- Finding user information
- Answering questions about Zoom
- General assistance
When a user wants to create a meeting, respond with JSON:
{
"intent": "create_meeting",
"details": {
"topic": "Meeting topic",
"start_time": "ISO 8601 format",
"duration": 60
}
}
Otherwise, provide a helpful text response.`,
messages: [{ role: 'user', content: userMessage }]
});
return response.content[0].text;
}
function parseIntent(llmResponse) {
try {
// Check if response is JSON
if (llmResponse.trim().startsWith('{')) {
const intent = JSON.parse(llmResponse);
return intent;
}
} catch (e) {
// Not JSON, regular text response
}
return { type: 'text_response', message: llmResponse };
}**User**: `/bot schedule a team standup tomorrow at 10am for 30 minutes`
**Flow**:
**User**: `/bot who is John Doe?`
**Flow**:
**User**: `/bot find messages about project alpha`
**Flow**:
# Team Chat (from zoom-team-chat skill)
ZOOM_CLIENT_ID=
ZOOM_CLIENT_SECRET=
ZOOM_BOT_JID=
ZOOM_VERIFICATION_TOKEN=
ZOOM_ACCOUNT_ID=
# LLM Integration
ANTHROPIC_API_KEY= # or OPENAI_API_KEY
# Server
PORT=4000Subscribe to meeting events and notify in Team Chat:
// Webhook handler for meeting events
app.post('/meeting-webhook', (req, res) => {
const { event, payload } = req.body;
if (event === 'meeting.started') {
// Notify in Team Chat
await sendChatbotMessage(channelJid, accountId, {
body: [
{ type: 'message', text: `Meeting "${payload.object.topic}" has started!` },
{
type: 'actions',
items: [
{ text: 'Join Now', value: `join_${payload.object.id}`, style: 'Primary' }
]
}
]
});
}
res.status(200).send();
});