Skip to content
WireCatLabsPublic

About

Zoom meetings and transcripts for your AI agent: local archive, source-backed search, read-only MCP. Part of WireCat.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

152 Commits

Folders and files

Zoom meetings and transcripts for your AI agent

zoom-cli

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

npm Node License: Apache 2.0

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 passage

Agent: 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.

Quick start

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 list

Check 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

What you can do

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

Built for AI agents

  • Command line + skill. zm skill install adds the packaged guide for Claude Code, Codex and Gemini CLI. Every command speaks --json or --jsonl, and zm commands --json describes them all.
  • MCP. zm serve --mcp is 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

Why zm

  • 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/118 point 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

What works today, and what does not yet

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-proposal only previews a task and creates nothing.
  • People are linked by hand. zm never guesses a person from a speaker name; person context covers participants already linked to a person, for example with meetings 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

Commands by task

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

Your Zoom app and login

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

Profiles and the local store

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

Pull, import and watch

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 foreground

The 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

Archive cloud recordings

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 --json

Sync 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

Search and evidence

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 person

search-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

Local transcription

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

MCP and agent setup

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

Manage Zoom meetings

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 --json

Creation, 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

Output, limits and deadlines

--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

Configuration

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

Security model

  • 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. --offline refuses 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

Troubleshooting

  • "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 login again.
  • Browser does not start: zm login --browser firefox, or paste the callback parameters.
  • Lock left after a crash: zm recordings archive locks, then recover with --yes.

More: troubleshooting · Zoom on wirecat.dev

Part of WireCat

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

Technical docs

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.

Development

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:bun

Fixtures 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

Licence

Apache License 2.0.

About

Zoom meetings and transcripts for your AI agent: local archive, source-backed search, read-only MCP. Part of WireCat.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages