Zoom meetings and transcripts for your AI agent. Know the context before the call. Remember the commitments after it.
zm keeps your Zoom meetings, transcripts and AI summaries in a local database and gives them to
Claude Code, Codex, Gemini CLI or any MCP client. Ask what you discussed with someone last time, or
what you promised in yesterday's call, and get the answer with a reference to the exact passage.
Documentation · Commands · WireCat
Example — invented people, illustrative output:
You: I have a call with Bob Sample at three. What did we agree last time, and what do I owe him?
zm remote-meetings list --json # your upcoming meetings
zm meetings people "Bob Sample" --json # him among past participants
zm meetings search "quote" --since 2026-09-01 --json
zm meetings evidence meeting:1/42/57/118 --json # the exact passageAgent: You last spoke on 2 October in "Pricing review". You promised Bob a revised quote by Friday (
meeting:1/42/57/118), and he asked whether the annual plan includes onboarding (meeting:1/42/57/131). Neither comes up in a later meeting.
You need Node 22.16+ (22.x) or 24+, a system keyring and a configured user-managed Zoom app. Reuse one you already created or one your team has made available to your user; otherwise create your own. Use its Public Client ID, not its regular Client ID or secret. The installation guide walks through app settings, browser approval and callback completion.
npm install -g @wirecat/zoom-cli
zm config set zoom.clientId <public-client-id>
zm login # approve in your browser; the token goes to the keyring
zm config set account.profile personal # a label for your stored meetings
zm pull --lookback-days 7
zm meetings listCheck Zoom's transcript generation and retention settings first: the API reads available hosted
meeting text, and permission does not create a transcript. For an attended meeting, obtain a VTT
file from the host or download one if allowed, then run zm import <folder>. Full guide:
installation.
More: installation · your Zoom app · Zoom on wirecat.dev
Prepare for a call. "I meet Bob Sample tomorrow. What did we talk about last time?"
remote-meetings list shows upcoming meetings; meetings people, meetings search-page (word
search that also matches English, Spanish and Russian word forms) and meetings context person:<id>
bring back past meetings with the same people.
Follow up after it. "What did I promise in today's call?" The agent reads
meetings transcript and meetings summary, cites passages with meetings evidence, and
meetings task-proposal --kind promise previews a follow-up task tied to that passage.
Keep the whole history. "Back up every recording since January."
recordings sync --from 2026-01-01 --to 2026-10-10 --destination ./zoom-archive --jsonl downloads
video, audio, transcripts and chat with SHA-256 manifests; recordings schedule runs it daily.
More: the local archive · search and evidence · Zoom on wirecat.dev
- Command line + skill.
zm skill installadds the packaged guide for Claude Code, Codex and Gemini CLI. Every command speaks--jsonor--jsonl, andzm commands --jsondescribes them all. - MCP.
zm serve --mcpis a read-only stdio server for Claude Desktop, Cursor and other MCP clients: meetings, transcripts, summaries, exports and search. Connecting a client.
Your agent. Your meetings. Your rules.
More: MCP and skills · connect your AI agent
- Context, not one transcript. Every meeting you hosted, transcripts you imported and recordings you archived, searchable together.
- Local-first. Meetings live in a SQLite database on your machine. Archived transcripts can be read and searched offline, without login.
- Every answer has a source. References such as
meeting:1/42/57/118point to one passage of one transcript revision, and corrected transcripts keep their history. - Made for agents. JSON output, bounded reads with explicit completeness, a skill and an MCP server.
- Safe by default. Your own Zoom app, tokens only in the keyring, a read-only MCP server, and every
change to Zoom previewed until you add
--yes.
More: security · Zoom on wirecat.dev
zm is at version 0.x; commands may still change. Today it reads hosted meetings, participants,
transcripts and AI summaries (Pro plan or higher) through Zoom's official API, imports downloaded
WebVTT files, archives cloud recordings, transcribes local audio with an installed speech model,
links meetings to events and people, and creates, changes or cancels simple meetings.
- It does not find commitments on its own. Your agent finds them in transcripts;
task-proposalonly previews a task and creates nothing. - People are linked by hand.
zmnever guesses a person from a speaker name; person context covers participants already linked to a person, for example withmeetings link-person. - Local transcription takes PCM16 WAV only (16 or 48 kHz) and an already installed speech model; video files are not decoded, and speakers stay unknown.
- Attended meetings need a manual download from your Zoom portal, then
zm import. - A company-managed Zoom account may need an admin to approve your app.
- Daily archive jobs install only on Linux. Other platforms can preview them.
- Zoom only, for now. Google Meet and Microsoft Teams are on the roadmap.
More: what is planned · Zoom on wirecat.dev
| Task | Commands |
|---|---|
| Set up and log in | config show, config set <key> <value>, login [--browser <program>], session status [--check], doctor |
| Bring meetings in | pull [--since <date>] [--lookback-days <days>], import <folder>, watch [folder] --source api|files --jsonl |
| Read stored meetings | meetings list, meetings show <meeting>, meetings transcript <meeting>, meetings summary <meeting>, meetings export <meeting> --format markdown|vtt, events list |
| Search | meetings search-page <query>, meetings search-index, meetings search <query>, meetings people <query>, search all <query> |
| Evidence and people | meetings evidence <reference>, meetings context <person>, meetings link-person <reference>, meetings link-event <reference>, meetings task-proposal <reference> --kind <kind> |
| Search by meaning | meetings embeddings --model <id>, meetings semantic <query> --model <id> |
| Local transcription | meetings transcribe <meeting> <file> --model <model> |
| Cloud recordings | recordings list, recordings show <meeting>, recordings download <meeting> --destination <directory>, recordings sync --from <date> --to <date> --destination <directory> --jsonl, recordings schedule create|list|show|run|disable |
| Local archive | recordings archive inspect|verify|locks|recover <directory>, recordings archive transcript|search|import <directory> |
| Zoom meetings | remote-meetings list|show|invitation, remote-meetings create|update|cancel |
| Agents | serve --mcp, skill show, skill install [--for claude|agents|all], commands --json, complete -- <words...> |
Zoom meeting changes, links, search indexing, transcription, schedules, embeddings and lock recovery
preview by default and run once with --yes; --dry-run always keeps the preview.
More: usage · every command and option · Zoom on wirecat.dev
zm reads your meetings through Zoom's official API, as you, so it uses your own Zoom app with
Public Client OAuth. Create it once from the supplied manifest: it asks for read-only access to
meetings, participants, transcripts and AI summaries. Recording archives and meeting management need
extra scopes, which you add only if you want those features. The app has no client secret.
zm login opens Zoom's consent page. Zoom redirects to the static page
https://wirecat.dev/zoom-callback, which passes the answer to a listener on your machine; if it
cannot, paste the code=…&state=… parameters it shows. Login checks the state and PKCE verifier and
stores tokens only in the system keyring. Browser login needs an interactive terminal; piped or JSON
login also needs --interactive. zm session status reads the cached state without refreshing it;
--check asks Zoom.
More: your Zoom app · login and sessions · Zoom on wirecat.dev
account.profile is a label (1–64 letters, digits, dots, underscores or hyphens) that groups the
meetings you store; use separate labels for data you want kept apart. Import and pull register the
profile; read commands never do, so pull or import first.
Meetings live in the shared WireCat database wirecat.db, next to data from other WireCat tools.
MESSAGING_STORE selects another path. Opening the default path deletes the legacy unencrypted
messages.db and its sidecars without migrating them, unless another path is set or another process
holds it open. Metadata, help, configuration and login never open the database.
More: profiles · where meetings are stored · Zoom on wirecat.dev
zm pull --lookback-days 7 # hosted meetings, revisiting late transcripts
zm import ./downloaded-transcripts # .vtt files from your Zoom portal
zm watch --source api --lookback-days 7 --jsonl # keep pulling in the foregroundThe cursor alone does not revisit transcripts that appear late; use --lookback-days or an older
--since. A failed occurrence leaves the cursor unchanged for the next pull. Imported files follow
the exporter's YYYY-MM-DD_HHMM_topic-slug.vtt names; set files.timezone to the zone they were
written in (UTC by default). Participants of imported files stay unknown, and speaker names are
never turned into identities.
More: the local archive · Zoom on wirecat.dev
zm recordings sync --from 2026-01-01 --to 2026-10-10 --destination ./zoom-archive --jsonl
zm recordings archive verify ./zoom-archive --offline --json
zm recordings archive search ./zoom-archive "example plan" --offline --jsonSync covers up to ten years in monthly requests and downloads serially, streaming to disk. Each
occurrence gets a manifest with sizes and SHA-256 checksums, never signed URLs or tokens. Existing
files are never overwritten; repeated runs skip verified files. With a profile, interrupted downloads
resume safely. recordings archive transcript|search read verified WebVTT offline without a
database; recordings archive import appends them to your stored meetings. recordings schedule create --yes installs a daily systemd user timer (Linux only).
What you can download depends on Zoom permissions, retention and your plan. Recordings of meetings you only attended are not necessarily available through your API.
More: archive cloud recordings · daily backups · Zoom on wirecat.dev
zm meetings search-index --limit 100 --yes --json # index queued meetings, one batch
zm meetings search-page "example plan" --limit 20 --json # word search with continuation
zm meetings evidence meeting:3/15/20/0 --cues 100 --json # the exact passage
zm meetings context person:7 --meetings 10 --json # meetings linked to a personsearch-page matches every word by prefix or by stored English, Spanish and Russian word forms, and
pages with an opaque --after cursor. References have the form
meeting:<account>/<meeting>[/<transcript>[/<cue-position>]], stay inside the selected account and
keep pointing at the same revision after a correction. Every bounded read reports whether it is
complete. search all --only meetings,notes adds store-wide notes. meetings embeddings and
meetings semantic search by meaning with a model you name; nothing is downloaded for you.
More: search and evidence · topic search · Zoom on wirecat.dev
No Zoom transcript? zm meetings transcribe 1 ./call.wav --model <model> --yes recognizes a PCM16 WAV
file (mono or stereo, 16 or 48 kHz) with an already installed local speech model and appends it as a
separate transcript. The preview checks the file without loading the model. Timestamps cover windows
of up to 30 seconds and speakers stay unknown.
More: transcribe local audio · Zoom on wirecat.dev
zm skill install writes the packaged guide to ~/.claude/skills/zoom-cli/ (Claude Code) and
~/.agents/skills/zoom-cli/ (Codex, Gemini CLI); --for picks one. MCP clients start the server
with ["serve", "--mcp"]:
{ "mcpServers": { "zoom": { "command": "zm", "args": ["serve", "--mcp"] } } }The server has seven read-only tools: meeting list and show, transcripts, summaries, exports, text
search and participant search. --meeting-context, --unified-search and --semantic --model <id>
add evidence, shared search and meaning search. It reads only the selected profile, and never exposes
file exports, Zoom changes, embedding generation or task creation. A desktop app may need the full
path from which zm, and the same ZM_CONFIG_DIR or MESSAGING_STORE in the entry's env.
More: MCP and skills · MCP and skills on wirecat.dev · connect your AI agent
zm remote-meetings create --topic "Example planning" --start-time 2026-10-20T10:00:00Z --duration-minutes 30 --json
zm remote-meetings cancel 123456789 --dry-run --jsonCreation, updates and cancellation preview until you add --yes, and are never retried
automatically. An uncertain outcome exits with code 14: check Zoom before repeating. Remote ids are
Zoom's numeric ids; stored meetings commands use local ids.
More: managing Zoom meetings · Zoom on wirecat.dev
--json prints one value and --jsonl one item per line; piped output defaults to JSON and errors
go to stderr. --fields id,title trims results, --offline refuses the network, and output is
capped at 4 MiB unless --max-output-bytes says otherwise. Default deadlines are 30 seconds for
reads, five minutes for login and one hour for downloads, sync and verification; --timeout 5m
changes them. Watching and MCP serving run until stopped.
More: usage · Zoom on wirecat.dev
| Setting | Meaning |
|---|---|
zoom.clientId |
your Zoom app's Public Client ID |
account.profile |
the local profile label |
source |
api or files for pull and watch |
files.folder, files.timezone |
the transcript folder and the zone of its filenames |
ZM_CONFIG_DIR |
another configuration directory (also changes the keyring entry) |
MESSAGING_STORE |
another shared database path |
OPENAI_API_KEY |
only for an OpenAI embedding endpoint you select |
More: configuration · Zoom on wirecat.dev
- Your own Zoom app with PKCE; no client secret exists.
- Tokens only in the system keyring, never in a config file; a missing keyring is an error.
- Network: Zoom's API, plus an embedding endpoint only when you name one.
--offlinerefuses both. - Manifests and saved jobs never hold signed URLs, tokens or credentials; diagnostics omit raw provider error text.
- The MCP server is read-only and fixed to the selected profile; changes to Zoom preview until
--yes.
More: security · security on wirecat.dev
- "Invalid redirect" from Zoom: the manifest import left the redirect URL or Public Client OAuth unset; fill them in by hand.
- No transcripts: turn on Allow hosts to retain transcripts; attended meetings need
zm import. - Missing-scope error: add the named scope in your app, then
zm loginagain. - Browser does not start:
zm login --browser firefox, or paste the callback parameters. - Lock left after a crash:
zm recordings archive locks, thenrecoverwith--yes.
More: troubleshooting · Zoom on wirecat.dev
zm is part of WireCat, an open-source, local-first context layer for AI
agents. Meetings land in the same local store as your Telegram, MAX and memo data, and
zm search all "<query>" --only meetings,notes searches them together with your memo notes.
Start with Zoom. Add more context when you need it. Your context. Any agent.
More: wirecat.dev · connect your AI agent
| Page | What it covers |
|---|---|
| Overview | what zm is and the one-minute start |
| Installation | requirements, first run, where files go, completion |
| Your Zoom app | creating the app, scopes, company accounts |
| Login, sessions and profiles | OAuth login, keyring, local profiles |
| Usage | every command group, output, deadlines |
| The local archive | pull, import, watch, recordings, backups, transcription |
| Search and evidence | word search, evidence, people, links, memo |
| Topic search | search by meaning with a model you choose |
| MCP and skills | the skill, the MCP server, optional tools |
| Managing Zoom meetings | upcoming meetings, create, update, cancel |
| Commands | every command, option and exit code (generated) |
| Configuration | settings and environment variables |
| Troubleshooting | by symptom |
| Security | what reaches the disk and the network |
| Architecture · Testing · Releasing | for contributors |
The WireCat portal at wirecat.dev/en/docs/zoom is being prepared; until then these pages are the reference.
Node 22.16 or newer within 22.x, or Node 24 or newer:
pnpm install
pnpm lint && pnpm typecheck && pnpm test:coverage && pnpm docs:check
pnpm build && pnpm smoke:bunFixtures use invented people and meetings. Tests use an injected keyring, scripted HTTP responses,
temporary config folders and the memory meeting store. pnpm generate:check checks the generated
command reference; pnpm test:matrix measures command and option coverage.
More: development setup · test matrix
