# Zoom

Find, create, reschedule, and cancel the user's Zoom meetings through per-user OAuth.

- Repository: https://github.com/yc-software/qm (15597 stars)
- Category: Engineering
- License: MIT
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add yc-software/qm --skill zoom -g -a claude-code -y`
Codex: `npx skills add yc-software/qm --skill zoom -g -a codex -y`
Cursor: `npx skills add yc-software/qm --skill zoom -g -a cursor -y`
Gemini CLI: `npx skills add yc-software/qm --skill zoom -g -a gemini-cli -y`

## Description

Find, create, reschedule, and cancel the user's Zoom meetings through per-user OAuth.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# Zoom

Use this skill when the user asks for a Zoom meeting or link, wants to know what Zoom
meetings they have coming up, or wants to move or cancel one.

This is an OAuth connector. The resolved user's Zoom token already lives on your computer
as an environment variable (the way a logged-in CLI's cached credential would):

- `$VAULT_TOKEN_API_ZOOM_US`, for `api.zoom.us`

Pass it as `-H "Authorization: Bearer $VAULT_TOKEN_API_ZOOM_US"`. Never ask the user for a
token, log it, or use another principal's credential.

Per-user connector tokens are present in the user's own DM and personal scheduled tasks,
and in a shared room or channel automation only when the user has opened their connections
there. If the variable is empty in a shared room, ask them to DM you instead of telling
them to reconnect; empty in their DM means they haven't connected Zoom, point them to the
Connectors page.

Zoom error codes: `124` (invalid access token) means they need to reconnect Zoom. `4711`
("does not contain scopes") means their token lacks that scope, if the org's Zoom app
already has it they reconnect, otherwise an admin adds it to the app first. `3001` means the
meeting does not exist or is not theirs.

## Writes require approval

Creating, updating, or deleting a meeting is a write. Show the exact topic, start time with
timezone, and duration (or which meeting changes and how) and ask for approval before
running it. Reads need no approval. In a shared channel, don't post the passcode or full
`join_url` unless everyone there may join.

**Never share `start_url`.** It embeds a host token that lets anyone start the meeting as
the user. Responses that carry it go through `jq` below so it never reaches your output.

## Find meetings

Who the user is, and their default timezone:

```bash
curl -sS 'https://api.zoom.us/v2/users/me' \
  -H "Authorization: Bearer $VAULT_TOKEN_API_ZOOM_US" | jq '{id, email, timezone, code, message}'
```

The rest: https://github.com/yc-software/qm/blob/HEAD/skills-seed/zoom/SKILL.md
