The first Zoom CLI that joins your local desktop app, your on-disk recordings, and your cloud account into one agent-native surface.
Start and join meetings via the desktop URL scheme (no browser interstitial), search every transcript you've ever recorded locally or in the cloud with one query, drive mute/unmute/video/leave from the command line on macOS, and run the full Zoom REST API (users, meetings, webinars, recordings, reports, dashboards) when your Server-to-Server OAuth credentials are configured. SQLite-backed; --json, --select, --dry-run on every command; works offline for the local surface and on-disk recordings.
Learn more at Zoom.
Created by @Holajack (Jacken).
The recommended path installs both the zoom-pp-cli binary and the pp-zoom agent skill (Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, and other agents supported by the upstream skills CLI) in one shot:
npx -y @mvanhorn/printing-press-library install zoomFor CLI only (no skill):
npx -y @mvanhorn/printing-press-library install zoom --cli-onlyFor skill only — installs the skill into the same agents as the default command above, but skips the CLI binary (use this to update or reinstall just the skill):
npx -y @mvanhorn/printing-press-library install zoom --skill-onlyTo constrain the skill install to one or more specific agents (repeatable — agent names match the skills CLI):
npx -y @mvanhorn/printing-press-library install zoom --agent claude-code
npx -y @mvanhorn/printing-press-library install zoom --agent claude-code --agent codexIf npx isn't available (no Node, offline), install the CLI directly via Go (requires Go 1.26.3 or newer):
go install github.com/mvanhorn/printing-press-library/library/productivity/zoom/cmd/zoom-pp-cli@latestThis installs the CLI only — no skill.
Download a pre-built binary for your platform from the latest release. On macOS, clear the Gatekeeper quarantine: xattr -d com.apple.quarantine <binary>. On Unix, mark it executable: chmod +x <binary>.
Install the CLI binary first. The installer writes binaries to a per-user managed bin directory by default: $HOME/.local/bin on macOS/Linux and %LOCALAPPDATA%\Programs\PrintingPress\bin on Windows.
npx -y @mvanhorn/printing-press-library install zoom --cli-onlyThen install the focused Hermes skill.
From the Hermes CLI:
hermes skills install mvanhorn/printing-press-library/cli-skills/pp-zoom --forceInside a Hermes chat session:
/skills install mvanhorn/printing-press-library/cli-skills/pp-zoom --forceRestart the Hermes session or gateway if the newly installed skill is not visible immediately.
Install both the CLI binary and the focused OpenClaw skill. The installer defaults binaries to a per-user bin directory ($HOME/.local/bin on macOS/Linux, %LOCALAPPDATA%\Programs\PrintingPress\bin on Windows):
npx -y @mvanhorn/printing-press-library install zoom --agent openclawRestart the OpenClaw session or gateway if the newly installed skill is not visible immediately.
This CLI ships an MCPB bundle — Claude Desktop's standard format for one-click MCP extension installs (no JSON config required).
To install:
- Download the
.mcpbfor your platform from the latest release. - Double-click the
.mcpbfile. Claude Desktop opens and walks you through the install.
Requires Claude Desktop 1.0.0 or later. Pre-built bundles ship for macOS Apple Silicon (darwin-arm64) and Windows (amd64, arm64); for other platforms, use the manual config below.
Manual JSON config (advanced)
If you can't use the MCPB bundle (older Claude Desktop, unsupported platform), install the MCP binary and configure it manually.
Install the MCP binary from this CLI's published public-library entry or pre-built release.
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"zoom": {
"command": "zoom-pp-mcp"
}
}
}Local commands (start, join, mute, leave, recordings local, search) require no Zoom account — just the Zoom desktop app installed. Cloud commands (meetings, users, webinars, recordings cloud, reports, metrics) need Server-to-Server OAuth credentials. Run zoom-pp-cli auth set-token to provide ZOOM_S2S_ACCOUNT_ID, ZOOM_S2S_CLIENT_ID, ZOOM_S2S_CLIENT_SECRET — the CLI caches the access token and auto-refreshes on 401.
# Confirms the Zoom app is installed, the URL handler is registered, ~/Documents/Zoom exists, and surfaces macOS accessibility-permission gaps before they bite.
zoom-pp-cli doctor
# Walks ~/Documents/Zoom/, parses every VTT transcript into a local FTS5 index — usually a few seconds.
zoom-pp-cli recordings local sync
# The killer command: searches every local and cloud transcript at once with speaker filter and clickable timestamps.
zoom-pp-cli find "q2 pricing" --source both --json
# Composes your cloud calendar, saved bookmarks, and today's local recordings into one view with conflict detection.
zoom-pp-cli today --with-recordings --json
# Pastes any Zoom URL, opens it directly in the desktop app — no browser interstitial. --dry-run prints the zoommtg:// URL it would launch.
zoom-pp-cli join "https://zoom.us/j/85123456789?pwd=abc" --dry-run
# macOS only — flips mute via the running Zoom app's Meeting menu. Safe no-op if not in a meeting.
zoom-pp-cli mute toggle
# The My Notes pipeline: drop in an exported PDF/DOCX from zoom.us/notes, then extract action items across the last week.
zoom-pp-cli notes ingest ~/Downloads/zoom-notes-2026-05-12.pdf && zoom-pp-cli notes todos --since 7d --json
These capabilities aren't available in any other tool for this API.
-
find— Search every locally-recorded and cloud-recorded Zoom transcript at once, with speaker filter, context windows, and a clickable deep link back to the exact second.When you need to recover a specific commitment or decision from a meeting, you don't know in advance whether it was recorded locally or to the cloud. One search box.
zoom-pp-cli find "q2 pricing" --source both --speaker "Maya" --after 30 --json
-
storage— Group everything under ~/Documents/Zoom/ by month, topic, or partial-conversion status; cross-check against the cloud recordings list to flag duplicates safe to delete locally.When the Documents folder is the biggest thing on the laptop, agents need to surface which gigabytes are safely reclaimable.
zoom-pp-cli storage --by month --also-in-cloud --json
-
recordings drift— Set-difference between local and cloud recordings; flags cloud recordings approaching the org retention deadline and local double_click_to_convert partials whose cloud version is already complete.Cloud retention silently deletes recordings. Local partials silently fail. The agent needs to surface both before they bite.
zoom-pp-cli recordings drift --retention-days 90 --json
-
recordings analyze— Per-speaker total talk-seconds, longest monologue, and cue-overlap interruption count, computed from VTT cue timestamps and speaker labels.When the agent is asked 'who dominated the meeting' or 'did everyone get a chance to speak,' it needs the answer without an LLM transcription pass.
zoom-pp-cli recordings analyze meeting-2026-05-12-1400 --json --select per_speaker.name,per_speaker.talk_seconds,per_speaker.longest_monologue_sec
-
today— One screen: every meeting on your calendar today, every saved bookmark scheduled for today, every recording made today, and any overlapping intervals flagged as conflicts.When the agent is asked 'what's on my plate today and is anything double-booked,' it needs the answer in one call.
zoom-pp-cli today --with-recordings --json --select topic,start_time,join_url,conflict_with
-
saved add-from-url— Paste any Zoom URL shape (https://zoom.us/j/?pwd=, zoommtg://, calendar-invite formats) and the CLI extracts ID + unencrypted password into a named saved bookmark in one step.URLs land in Slack/email constantly. Closing the parse-it-yourself gap turns 'save this for later' into one command.
zoom-pp-cli saved add-from-url team-standup "https://us02web.zoom.us/j/85123456789?pwd=abc" --json
-
schedule— Create a cloud meeting (POST /users/me/meetings) and immediately persist the resulting ID + password into local saved_meetings, so futurezoom saved join <name>works offline.Scheduling and joining are usually two separate tools. Pairing them lets agents create-then-recall meetings without re-querying the cloud.
zoom-pp-cli schedule "Q3 Planning" --when "2026-08-12T14:00:00Z" --duration 60 --save-as q3-planning --json
-
recordings export— Resolve a recording ID against local first, fall back to cloud (downloading if needed); package mp4 + vtt + chat.txt + a generated INDEX.md with timestamped table of contents into one folder.When the agent is asked to 'pull together everything we have on Tuesday's planning call,' it needs one verb that doesn't care whether the source is local or cloud.
zoom-pp-cli recordings export meeting-2026-05-12-1400 --with-transcript --with-chat --out ~/Drive/q2-planning --json
-
notes web— Open https://zoom.us/notes (optionally scoped to a meeting) in the user's default browser — the only path to the live Notes UI since Zoom has no public REST endpoint for the My Notes feature.When an agent needs to send the user to their notes, this is the single command that always works regardless of auth state.
zoom-pp-cli notes web --json --dry-run
-
notes summary— Fetches Zoom AI Companion's auto-generated meeting summary for a meeting UUID via the documented/meetings/{uuid}/meeting_summaryendpoint (S2S OAuth gated).When an agent needs the canonical post-meeting recap without manually exporting a PDF.
zoom-pp-cli notes summary abc123== --json --select summary_title,summary_overview,summary_details
-
notes transcript— Fetches the AI Companion full transcript for a meeting UUID via the documented/meetings/{uuid}/transcriptendpoint (S2S OAuth gated).Agents that need to verify a summary or quote can pull verbatim transcript without opening the web portal.
zoom-pp-cli notes transcript abc123== --json
-
notes ingest— Parses a Notes PDF or DOCX exported from the Zoom web portal, extracts text + meeting metadata + headings, indexes them in a local SQLitenotestable (FTS5 enabled).Lets agents build a searchable, persistent corpus of the user's meeting notes from manual exports.
zoom-pp-cli notes ingest ~/Downloads/zoom-notes-2026-05-12.pdf --json --select meeting_topic,note_count,word_count -
notes search— FTS5 query across every Notes file that has been ingested, returnsmeeting_topic + note_excerpt + source_file + match_offsetwith optional--since/--meeting-idfilters.Agents asked 'what did I write down about X' can answer instantly from the ingested corpus.
zoom-pp-cli notes search "q2 launch plan" --since 30d --json --select meeting_topic,start_time,note_excerpt,source_file -
notes todos— Scans ingested notes for action-item patterns (TODO:,Action:,[ ],- [ ],Action Item:,Next:,Follow up:,Owner:) and emits a structured to-do list with source meeting topic + date + checkbox state.Turns the My Notes archive into a queryable backlog — the killer feature for agents that need to surface 'what do I still owe people from last week's meetings.'
zoom-pp-cli notes todos --since 7d --json --select text,meeting_topic,start_time,owner,checked
Run zoom-pp-cli --help for the full command reference and flag list.
Account operations
zoom-pp-cli accounts account- Retrieve a sub account under the master account. Your account must be a master account and have this privilege to read sub accounts. Zoom only assigns this privilege to trusted partners.zoom-pp-cli accounts accounts- List all the sub accounts under the master accountzoom-pp-cli accounts create- Create a sub account under the master account. Your account must be a master account and have this privilege to create sub account. Zoom only assigns this privilege to trusted partners. The created user will not receive a confirmation email..zoom-pp-cli accounts disassociate- Disassociate a sub account from the master account. This will leave the account intact but the sub account will not longer be associated with the master account.
Group operations
zoom-pp-cli groups create- Create a group under your accountzoom-pp-cli groups delete- Delete a group under your accountzoom-pp-cli groups group- Retrieve a group under your accountzoom-pp-cli groups groups- List groups under your accountzoom-pp-cli groups update- Update a group under your account
Manage h323
zoom-pp-cli h323 device-create- Create a H.323/SIP Device on your Zoom accountzoom-pp-cli h323 device-delete- Delete a H.323/SIP Device on your Zoom accountzoom-pp-cli h323 device-list- List H.323/SIP Devices on your Zoom account.zoom-pp-cli h323 device-update- Update a H.323/SIP Device on your Zoom account
Manage im
zoom-pp-cli im chat-messages- Retrieve IM Chat messages for a specified period This API only supports oauth2.zoom-pp-cli im chat-sessions- Retrieve IM Chat sessions for a specified period This API only supports oauth2.zoom-pp-cli im group- Retrieve an IM Group under your accountzoom-pp-cli im group-create- Create a IM Group under your accountzoom-pp-cli im group-delete- Delete an IM Group under your accountzoom-pp-cli im group-members- List an IM Group's members under your accountzoom-pp-cli im group-members-create- Add members to an IM Group under your accountzoom-pp-cli im group-members-delete- Delete a member from an IM Group under your accountzoom-pp-cli im group-update- Update an IM Group under your accountzoom-pp-cli im groups- List IM groups under your account
Meeting operations
zoom-pp-cli meetings delete- Delete a meetingzoom-pp-cli meetings meeting- Retrieve a meeting's detailszoom-pp-cli meetings update- Update a meeting's details
Manage metrics
zoom-pp-cli metrics dashboard-crc- Get CRC Port usage hour by hour for a specified time period We will report a maximum of one month. For example, if "from" is set to "2017-08-05" and "to" is "2017-10-10" we will adjust "from" to "2017-09-10".zoom-pp-cli metrics dashboard-im- Retrieve metrics of Zoom IMzoom-pp-cli metrics dashboard-meeting-detail- Retrieve live or past meetings detailzoom-pp-cli metrics dashboard-meeting-participant-qos- Retrieve live or past meetings participant quality of servicezoom-pp-cli metrics dashboard-meeting-participant-share- Retrieve sharing/recording details of live or past meetings participantzoom-pp-cli metrics dashboard-meeting-participants- Retrieve live or past meetings participantszoom-pp-cli metrics dashboard-meeting-participants-qos- Retrieve list of live or past meetings participants quality of servicezoom-pp-cli metrics dashboard-meetings- List live meetings or past meetings for a specified periodzoom-pp-cli metrics dashboard-webinar-detail- Retrieve live or past webinars detailzoom-pp-cli metrics dashboard-webinar-participant-qos- Retrieve live or past webinar participant quality of servicezoom-pp-cli metrics dashboard-webinar-participant-share- Retrieve sharing/recording details of live or past webinar participantzoom-pp-cli metrics dashboard-webinar-participants- Retrieve live or past webinar participantszoom-pp-cli metrics dashboard-webinar-participants-qos- Retrieve list of live or past webinar participants quality of servicezoom-pp-cli metrics dashboard-webinars- List live webinars or past webinars for a specified periodzoom-pp-cli metrics dashboard-zoom-room- Retrieve zoom room on accountzoom-pp-cli metrics dashboard-zoom-rooms- List all zoom rooms on account
Manage past meetings
zoom-pp-cli past-meetings <meetingUUID>- Retrieve ended meeting details
Manage past webinars
Report operations
zoom-pp-cli report cloud-recording- Retrieve cloud recording usage report for a specified period. You can only get cloud recording reports for the most recent period of 6 months. The date gap between from and to dates should be smaller or equal to 30 days.zoom-pp-cli report daily- Retrieve daily report for one month, can only get daily report for recent 6 monthszoom-pp-cli report meeting-details- Retrieve ended meeting details reportzoom-pp-cli report meeting-participants- Retrieve ended meeting participants reportzoom-pp-cli report meeting-polls- Retrieve ended meeting polls reportzoom-pp-cli report meetings- Retrieve ended meetings report for a specified periodzoom-pp-cli report telephone- Retrieve telephone report for a specified period Toll Report option would be removed..zoom-pp-cli report users- Retrieve active or inactive hosts report for a specified periodzoom-pp-cli report webinar-details- Retrieve ended webinar details reportzoom-pp-cli report webinar-participants- Retrieve ended webinar participants reportzoom-pp-cli report webinar-polls- Retrieve ended webinar polls reportzoom-pp-cli report webinar-qa- Retrieve ended webinar Q&A report
Tracking Field operations
zoom-pp-cli tracking-fields create- Create a Tracking Field on your Zoom accountzoom-pp-cli tracking-fields delete- Delete a Tracking Field on your Zoom accountzoom-pp-cli tracking-fields get- Retrieve a tracking fieldzoom-pp-cli tracking-fields list- List Tracking Fields on your Zoom account.zoom-pp-cli tracking-fields update- Update a Tracking Field on your Zoom account
TSP operations
zoom-pp-cli tsp tsp- Retrieve TSP information on account levelzoom-pp-cli tsp update- Update TSP information on account level
User operations
zoom-pp-cli users create- Create a user on your accountzoom-pp-cli users delete- Delete a user on your accountzoom-pp-cli users email- Check if the user email existszoom-pp-cli users update- Update a user on your accountzoom-pp-cli users user- Retrieve a user on your accountzoom-pp-cli users users- List users on your accountzoom-pp-cli users vanity-name- Check if the user's personal meeting room name existszoom-pp-cli users zpk- Check if the zpk is expired. The zpk is used to authenticate a user.
Webhook operations
zoom-pp-cli webhooks create- Create a webhook for a accountzoom-pp-cli webhooks delete- Delete a webhookzoom-pp-cli webhooks switch- Switch webhook versionzoom-pp-cli webhooks update- Update a webhookzoom-pp-cli webhooks webhook- Retrieve a webhookzoom-pp-cli webhooks webhooks- List webhooks for a account
Webinar operations
zoom-pp-cli webinars delete- Delete a webinarzoom-pp-cli webinars update- Update a webinarzoom-pp-cli webinars webinar- Retrieve a webinar
# Human-readable table (default in terminal, JSON when piped)
zoom-pp-cli tracking-fields list
# JSON for scripting and agents
zoom-pp-cli tracking-fields list --json
# Filter to specific fields
zoom-pp-cli tracking-fields list --json --select id,name,status
# Dry run — show the request without sending
zoom-pp-cli tracking-fields list --dry-run
# Agent mode — JSON + compact + no prompts in one flag
zoom-pp-cli tracking-fields list --agentThis CLI is designed for AI agent consumption:
- Non-interactive - never prompts, every input is a flag
- Pipeable -
--jsonoutput to stdout, errors to stderr - Filterable -
--select id,namereturns only fields you need - Previewable -
--dry-runshows the request without sending - Explicit retries - add
--idempotentto create retries and--ignore-missingto delete retries when a no-op success is acceptable - Confirmable -
--yesfor explicit confirmation of destructive actions - Piped input - write commands can accept structured input when their help lists
--stdin - Offline-friendly - sync/search commands can use the local SQLite store when available
- Agent-safe by default - no colors or formatting unless
--human-friendlyis set
Exit codes: 0 success, 2 usage error, 3 not found, 5 API error, 7 rate limited, 10 config error.
zoom-pp-cli doctorVerifies configuration and connectivity to the API.
Config file: ~/.config/zoom-pp-cli/config.toml
Static request headers can be configured under headers; per-command header overrides take precedence.
Not found errors (exit code 3)
- Check the resource ID is correct
- Run the
listcommand to see available items
open: zoommtg://...: No application knows how to open URL— Runzoom-pp-cli doctor— it tells you whether the URL handler is registered. Reinstalling the Zoom desktop app re-registers it.mute/unmutereturnsosascript: not supported on this platform— These commands are macOS-only. On Linux/Windows, use the Zoom client's keyboard shortcuts directly.mute/unmuteexits 0 but nothing happens — Grant accessibility permission to your terminal: System Settings → Privacy & Security → Accessibility → add Terminal/iTerm.zoom-pp-cli doctorchecks this.- Cloud commands return
auth: ZOOM_S2S_* not set— Runzoom-pp-cli auth set-tokenor exportZOOM_S2S_ACCOUNT_ID,ZOOM_S2S_CLIENT_ID,ZOOM_S2S_CLIENT_SECRET. Get them from your Zoom App Marketplace Server-to-Server OAuth app. - Cloud requests return 429 — The CLI honors
Retry-After; if you're hitting daily caps, narrow--from/--towindows or use the local cache (--data-source local). recordings local syncskips files — Skipped files are usuallydouble_click_to_convertpartials. Runzoom-pp-cli recordings local list --partial-onlyto see them; double-click in Finder to trigger Zoom's conversion.
This CLI was built by studying these projects and resources:
- echelon-ai-labs/zoom-mcp — Python (26 stars)
- n44h/Cloe — Python (2 stars)
- zoom/zoom-plugin — TypeScript
- forayconsulting/zoom_transcript_mcp — Python
- mattcoatsworth/zoom-mcp-server — TypeScript
- prschmid/zoomus — Python
- licht1stein/pyzoom — Python
- tmonfre/zoom-cli — Python
Generated by CLI Printing Press