Zoom Skill
Manage Zoom meetings and cloud recordings via the Zoom API.
Features
- •Meetings: List, create, update, delete scheduled meetings
- •Recordings: List cloud recordings with transcripts, summaries, and download links
Note: All times passed to create/update commands are interpreted as local time. The script auto-detects your timezone if not explicitly specified with --timezone.
Prerequisites
This skill uses two authentication methods:
| Feature | Auth Type | Credentials File |
|---|---|---|
| Meetings | Server-to-Server OAuth | ~/.zoom_credentials/credentials.json |
| Recordings | User OAuth (General App) | ~/.zoom_credentials/oauth_token.json |
Check status:
bash
python3 scripts/zoom_meetings.py setup
Setup
Part 1: Server-to-Server OAuth (for Meetings)
- •Go to marketplace.zoom.us → Develop → Build App
- •Select Server-to-Server OAuth
- •Name it (e.g., "Claude Zoom Meetings")
- •Copy Account ID, Client ID, Client Secret
- •Add scopes:
- •
meeting:read:meeting:admin - •
meeting:read:list_meetings:admin - •
meeting:write:meeting:admin - •
user:read:user:admin
- •
- •Activate the app
- •Save credentials:
bash
mkdir -p ~/.zoom_credentials
cat > ~/.zoom_credentials/credentials.json << 'EOF'
{
"account_id": "YOUR_ACCOUNT_ID",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
EOF
Part 2: General App OAuth (for Recordings)
Server-to-Server apps cannot access cloud recordings. You need a separate General App:
- •Go to marketplace.zoom.us → Develop → Build App
- •Select General App
- •Set redirect URL:
http://localhost:8888/callback - •Copy Client ID and Client Secret
- •Add scopes:
- •
cloud_recording:read:list_user_recordings - •
cloud_recording:read:list_recording_files
- •
- •Activate the app
- •Authorize (one-time browser flow):
bash
# Open this URL in browser (replace CLIENT_ID):
https://zoom.us/oauth/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=http://localhost:8888/callback
# After authorizing, you'll be redirected to:
# http://localhost:8888/callback?code=AUTHORIZATION_CODE
# Exchange the code for tokens (replace values):
python3 -c "
import requests, json
resp = requests.post('https://zoom.us/oauth/token',
auth=('CLIENT_ID', 'CLIENT_SECRET'),
data={'grant_type': 'authorization_code', 'code': 'AUTH_CODE', 'redirect_uri': 'http://localhost:8888/callback'})
data = resp.json()
data['client_id'] = 'CLIENT_ID'
data['client_secret'] = 'CLIENT_SECRET'
data['expires_at'] = __import__('time').time() + data.get('expires_in', 3600)
with open(__import__('pathlib').Path.home() / '.zoom_credentials/oauth_token.json', 'w') as f:
json.dump(data, f, indent=2)
print('Saved!')
"
Quick Start
bash
# Check setup python3 scripts/zoom_meetings.py setup # List upcoming meetings python3 scripts/zoom_meetings.py list # Create a meeting python3 scripts/zoom_meetings.py create "Team Standup" --start "2025-01-15T10:00:00" --duration 30 # List recordings python3 scripts/zoom_meetings.py recordings --start 2025-01-01
Commands
Meetings
bash
# List meetings python3 scripts/zoom_meetings.py list # upcoming python3 scripts/zoom_meetings.py list --type previous # past python3 scripts/zoom_meetings.py list --limit 10 --json # Get meeting details python3 scripts/zoom_meetings.py get MEETING_ID # Create meeting (times are treated as LOCAL time) python3 scripts/zoom_meetings.py create "Topic" # instant python3 scripts/zoom_meetings.py create "Topic" --start "2025-01-15T14:00:00" # scheduled (local time) python3 scripts/zoom_meetings.py create "Topic" --duration 60 --timezone "Europe/Berlin" python3 scripts/zoom_meetings.py create "Topic" --agenda "Discussion points" --waiting-room python3 scripts/zoom_meetings.py create "Topic" --invite "user@example.com" # send invite python3 scripts/zoom_meetings.py create "Topic" --invite "a@x.com" --invite "b@x.com" # multiple # Update meeting python3 scripts/zoom_meetings.py update MEETING_ID --topic "New Topic" python3 scripts/zoom_meetings.py update MEETING_ID --start "2025-01-16T10:00:00" # Delete meeting (requires meeting:delete:meeting:admin scope) python3 scripts/zoom_meetings.py delete MEETING_ID
Recordings
bash
# List all recordings (default: last 30 days) python3 scripts/zoom_meetings.py recordings # With date range python3 scripts/zoom_meetings.py recordings --start 2025-01-01 --end 2025-01-31 # Show download URLs python3 scripts/zoom_meetings.py recordings --show-downloads # Get specific meeting's recordings python3 scripts/zoom_meetings.py recording MEETING_ID # JSON output python3 scripts/zoom_meetings.py recordings --json
Output Formats
Markdown (default)
markdown
# Zoom Meetings (3 upcoming) ## Weekly Team Sync **ID:** 123456789 **Start:** 2025-01-15 14:00:00 UTC **Duration:** 60 minutes **Join URL:** https://zoom.us/j/123456789
JSON
Add --json for structured output suitable for piping to other tools.
Recording File Types
| Type | Description |
|---|---|
| MP4 | Video recording |
| M4A | Audio only |
| TRANSCRIPT | Text transcript (VTT) |
| CHAT | Chat messages |
| TIMELINE | Speaker timeline |
| SUMMARY | AI meeting summary |
Example User Requests
| User says | Command |
|---|---|
| "List my Zoom meetings" | list |
| "Show past meetings" | list --type previous |
| "Create a meeting for tomorrow at 2pm" | create "Meeting" --start "2025-01-15T14:00:00" |
| "Show my Zoom recordings" | recordings --start 2025-01-01 |
| "Get the recording for meeting X" | recording MEETING_ID |
Dependencies
bash
pip install requests
Files
| File | Purpose |
|---|---|
~/.zoom_credentials/credentials.json | S2S OAuth credentials |
~/.zoom_credentials/token.json | S2S cached token |
~/.zoom_credentials/oauth_token.json | User OAuth tokens (auto-refreshes) |