You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add --with-zoom / --regenerate-zoom / --remove-zoom to gog calendar create and gog calendar update, with the same ergonomics as the existing --with-meet family (#538, #576). Plus an optional gog zoom meeting * standalone surface for cases where the agent needs to manage Zoom independently of a Calendar event.
Motivation
gog has excellent first-party Google Meet conferencing today via --with-meet. The most common gap I've heard from agent-facing users is Zoom, because many external clients explicitly request Zoom over Meet — particularly in consulting / client-services contexts.
Concrete use case: we run a fleet of OpenClaw agents that schedule meetings on behalf of principal users. Today an agent can attach Google Meet links via gog in one tool call. When a client requests Zoom, the agent has no programmatic surface — the Zoom for Google Workspace add-on is UI-only and can't be triggered via the Calendar API's conferenceData.createRequest (or at least, not reliably across third-party add-ons).
Ecosystem state — confirmed there's no existing solution
I scrubbed before opening this:
gogcli: 0 issues, 0 PRs mention zoom or conference. README lists Meet but not Zoom. internal/cmd/calendar_build.go has buildConferenceData(withMeet bool) hardcoded to Type: "hangoutsMeet" with no other path.
openclaw org: 0 Zoom-related plugins.
Wider OC community: two adjacent-but-non-overlapping plugins exist:
The "agent schedules a Zoom meeting and attaches it to a Google Calendar event" niche is uncovered.
Concrete target shape (captured from real Calendar event)
To make this implementable rather than abstract, I installed the Zoom for Google Workspace add-on on a test Google account (authenticated against a Pro-tier Zoom account), created a meeting via the Calendar UI's "Zoom Meeting" ADD-ON picker, and dumped the result via gog calendar raw. Sanitized:
Surprising findings from this dump (worth highlighting)
conferenceSolution.key.type is literally "addOn" — the generic legacy string, not a Zoom-specific registered identifier. Good news: gog doesn't need to know any Zoom-specific magic strings to populate this field. Just "addOn" plus the human-facing name / iconUri.
Rich text lives in conferenceData.notes (HTML allowed), not in the event description field. The event has no description set at all in the dump. Implementations should populate notes, not description.
parameters.addOnParameters.parameters contains add-on-internal Apps Script state (scriptId, creatorUserId, meetingUuid, etc.). It's currently unclear whether Google validates this server-side when a non-add-on caller writes key.type = "addOn" — see open question feat(calendar): add respond, search, colors, time, conflicts commands #3 below.
No signature field — Google doesn't sign third-party conference data here.
extendedProperties.shared contains add-on internal bookkeeping. Probably not required for a third-party tool to populate, but worth a test.
Proposed surface
Tier 1 — Core (mirror --with-meet ergonomics)
# Create event + Zoom meeting in one call (default flow)
gog calendar create <calId> --summary "..." --from "..." --to "..." \
--with-zoom --attendees "alice@x.com,bob@y.com"# Idempotent attach Zoom to existing event (matches v0.16.0 --with-meet idempotency)
gog calendar update <calId><eventId> --with-zoom
# Explicit replace (matches --regenerate-meet semantics; also cancels old Zoom meeting on Zoom side)
gog calendar update <calId><eventId> --regenerate-zoom
# Remove Zoom from event + cancel on Zoom side
gog calendar update <calId><eventId> --remove-zoom
Optional flags worth considering:
--zoom-no-notes — skip the conferenceData.notes HTML block (some users only want the structured conference card, not the duplicated link block).
--zoom-host <email> — schedule under a specific Zoom user (if the gog Zoom credentials have access to multiple users, e.g., in a Zoom Workspace plan).
Incidental gap noticed: there's currently no --remove-meet either. If you'd like Meet/Zoom parity, the same PR could add --remove-meet for symmetry.
Tier 2 — Standalone Zoom surface (nice-to-have; could be follow-up PR)
Recording configuration, waiting room, alternative hosts, breakout rooms, registration
Other conferencing providers (Webex, Teams) — pattern generalizes but solve Zoom first
Auth model
Zoom Server-to-Server OAuth (the modern path; replaces deprecated JWT; requires Zoom Pro tier or higher on the account that owns the OAuth app). Suggested layout mirroring existing gog auth:
user:read:admin (resolve user IDs, for --zoom-host and list operations)
Open questions for you
Concrete vs. generic flags. Prefer --with-zoom / --regenerate-zoom (specific, discoverable, mirrors --with-meet) OR --conference-provider zoom / --regenerate-conference (extensible to Webex/Teams later, slightly less discoverable)? My soft preference is concrete-specific based on the --with-meet precedent, but you may have a stronger view on extensibility.
Implementation architecture. Two viable paths to attach Zoom conferenceData:
(a) Direct Zoom API write. gog has its own Zoom OAuth credentials → creates the meeting via Zoom API → writes the resulting data to conferenceData.entryPoints + conferenceSolution.key.type = "addOn" + name = "Zoom Meeting" + iconUri. No dependency on the Zoom add-on being installed in the user's Calendar.
(b) Calendar API createRequest passthrough. gog asks the Calendar API to invoke the Zoom add-on via conferenceData.createRequest. Simpler in code but requires (i) Zoom add-on installed and authenticated in the user's Calendar account, (ii) the add-on implementing the necessary createConference callback per Google's Conference Add-on spec — and many third-party add-ons don't.
My read: (a) is the safer bet because it works regardless of whether the user has the add-on installed, and gives us control over the auth and meeting settings. But you may know more about (b) viability than I do.
addOnParameters server-side validation. As called out above, the Zoom add-on populates conferenceData.parameters.addOnParameters.parameters with Apps Script-side state (scriptId, creatorUserId, meetingUuid, etc.). Whether Google's Calendar API requires these fields when a non-add-on caller writes key.type = "addOn" conferenceData is the one unknown that'll need testing during implementation. Possible fallbacks if Google rejects:
Populate plausible / NULL values
Use a different key.type (no documented alternative cleanly fits Zoom)
Accept degraded rendering (no Zoom branding on the event card)
Happy to test a release candidate against our OpenClaw agent fleet — real-world use case (agents scheduling Zoom on behalf of principals) means we'll exercise the auth refresh path, error handling, and edge cases quickly. Also happy to provide the full unsanitized conferenceData JSON via DM if useful for implementation.
Summary
Add
--with-zoom/--regenerate-zoom/--remove-zoomtogog calendar createandgog calendar update, with the same ergonomics as the existing--with-meetfamily (#538, #576). Plus an optionalgog zoom meeting *standalone surface for cases where the agent needs to manage Zoom independently of a Calendar event.Motivation
gog has excellent first-party Google Meet conferencing today via
--with-meet. The most common gap I've heard from agent-facing users is Zoom, because many external clients explicitly request Zoom over Meet — particularly in consulting / client-services contexts.Concrete use case: we run a fleet of OpenClaw agents that schedule meetings on behalf of principal users. Today an agent can attach Google Meet links via gog in one tool call. When a client requests Zoom, the agent has no programmatic surface — the Zoom for Google Workspace add-on is UI-only and can't be triggered via the Calendar API's
conferenceData.createRequest(or at least, not reliably across third-party add-ons).Ecosystem state — confirmed there's no existing solution
I scrubbed before opening this:
internal/cmd/calendar_build.gohasbuildConferenceData(withMeet bool)hardcoded toType: "hangoutsMeet"with no other path.agent-plex/openclaw-zoom— Zoom Team Chat (different Zoom product, not meetings).AIGC-Hackers/openclaw-zoom-agent— voice agent that joins existing meetings; doesn't create or schedule them.The "agent schedules a Zoom meeting and attaches it to a Google Calendar event" niche is uncovered.
Concrete target shape (captured from real Calendar event)
To make this implementable rather than abstract, I installed the Zoom for Google Workspace add-on on a test Google account (authenticated against a Pro-tier Zoom account), created a meeting via the Calendar UI's "Zoom Meeting" ADD-ON picker, and dumped the result via
gog calendar raw. Sanitized:{ "conferenceData": { "conferenceId": "1234567890", "conferenceSolution": { "iconUri": "https://lh3.googleusercontent.com/pw/AM-JKLU.../s128-no", "key": { "type": "addOn" }, "name": "Zoom Meeting" }, "entryPoints": [ { "entryPointType": "video", "label": "us06web.zoom.us/j/1234567890?pwd=REDACTED_PWD_TOKEN&jst=2", "meetingCode": "1234567890", "passcode": "000000", "uri": "https://us06web.zoom.us/j/1234567890?pwd=REDACTED_PWD_TOKEN&jst=2" }, { "entryPointType": "phone", "label": "+1 312-626-6799", "passcode": "000000", "regionCode": "US", "uri": "tel:+13126266799,,1234567890#" }, { "entryPointType": "sip", "label": "1234567890@zoomcrc.com", "passcode": "000000", "uri": "sip:1234567890@zoomcrc.com" }, { "entryPointType": "more", "uri": "https://www.google.com/url?q=https://applications.zoom.us/addon/invitation/detail?..." } ], "notes": "Meeting host: <a href=\"mailto:host@example.com\">host@example.com</a><br /><br />Join Zoom Meeting: <br /><a href=\"https://us06web.zoom.us/j/1234567890?pwd=REDACTED_PWD_TOKEN&jst=2\">https://us06web.zoom.us/j/1234567890?pwd=REDACTED_PWD_TOKEN&jst=2</a><br /><br />Meeting agenda: <br /><a href=\"https://docs.zoom.us/agenda/doc/REDACTED?from=gsuite\">...</a><br /><br />Chat with Everyone: <br /><a href=\"https://us06web.zoom.us/launch/jc/1234567890\">...</a>", "parameters": { "addOnParameters": { "parameters": { "creatorUserId": "REDACTED_ZOOM_USER_ID", "meetingType": "2", "meetingUuid": "REDACTED_UUID==", "originalEventId": "REDACTED_EVENT_ID", "realMeetingId": "1234567890", "scriptId": "REDACTED_APPS_SCRIPT_ID" } } } }, "extendedProperties": { "shared": { "meetingId": "1234567890", "meetingParams": "{\"topic\":\"...\",\"type\":2,\"start_time\":\"...\",\"duration\":60,\"timezone\":\"America/Chicago\",\"invitees_hash\":\"1B2M2Y8AsgTpgAmY7PhCfg==\",\"all_day\":false}", "zmMeetingNum": "1234567890" } } }Surprising findings from this dump (worth highlighting)
conferenceSolution.key.typeis literally"addOn"— the generic legacy string, not a Zoom-specific registered identifier. Good news: gog doesn't need to know any Zoom-specific magic strings to populate this field. Just"addOn"plus the human-facingname/iconUri.conferenceData.notes(HTML allowed), not in the eventdescriptionfield. The event has nodescriptionset at all in the dump. Implementations should populatenotes, notdescription.parameters.addOnParameters.parameterscontains add-on-internal Apps Script state (scriptId,creatorUserId,meetingUuid, etc.). It's currently unclear whether Google validates this server-side when a non-add-on caller writeskey.type = "addOn"— see open question feat(calendar): add respond, search, colors, time, conflicts commands #3 below.signaturefield — Google doesn't sign third-party conference data here.extendedProperties.sharedcontains add-on internal bookkeeping. Probably not required for a third-party tool to populate, but worth a test.Proposed surface
Tier 1 — Core (mirror
--with-meetergonomics)Optional flags worth considering:
--zoom-no-notes— skip theconferenceData.notesHTML block (some users only want the structured conference card, not the duplicated link block).--zoom-host <email>— schedule under a specific Zoom user (if the gog Zoom credentials have access to multiple users, e.g., in a Zoom Workspace plan).Incidental gap noticed: there's currently no
--remove-meeteither. If you'd like Meet/Zoom parity, the same PR could add--remove-meetfor symmetry.Tier 2 — Standalone Zoom surface (nice-to-have; could be follow-up PR)
Useful when the calendar event was created by someone else (or doesn't exist yet) and an agent needs to manage just the Zoom side.
Tier 3 — Explicit out-of-scope (setting expectations)
Auth model
Zoom Server-to-Server OAuth (the modern path; replaces deprecated JWT; requires Zoom Pro tier or higher on the account that owns the OAuth app). Suggested layout mirroring existing
gog auth:gog zoom auth setup/gog zoom auth doctor/gog zoom auth tokens~/.config/gogcli/zoom/parallel to Google OAuth keyring--accountergonomicsGOGCLI_ZOOM_ACCOUNT_IDGOGCLI_ZOOM_CLIENT_IDGOGCLI_ZOOM_CLIENT_SECRETRequired Zoom OAuth scopes for the surface above:
meeting:write:admin(create/update/delete meetings)meeting:read:admin(get meeting info)user:read:admin(resolve user IDs, for--zoom-hostand list operations)Open questions for you
Concrete vs. generic flags. Prefer
--with-zoom/--regenerate-zoom(specific, discoverable, mirrors--with-meet) OR--conference-provider zoom/--regenerate-conference(extensible to Webex/Teams later, slightly less discoverable)? My soft preference is concrete-specific based on the--with-meetprecedent, but you may have a stronger view on extensibility.Implementation architecture. Two viable paths to attach Zoom conferenceData:
conferenceData.entryPoints+conferenceSolution.key.type = "addOn"+name = "Zoom Meeting"+iconUri. No dependency on the Zoom add-on being installed in the user's Calendar.createRequestpassthrough. gog asks the Calendar API to invoke the Zoom add-on viaconferenceData.createRequest. Simpler in code but requires (i) Zoom add-on installed and authenticated in the user's Calendar account, (ii) the add-on implementing the necessarycreateConferencecallback per Google's Conference Add-on spec — and many third-party add-ons don't.My read: (a) is the safer bet because it works regardless of whether the user has the add-on installed, and gives us control over the auth and meeting settings. But you may know more about (b) viability than I do.
addOnParametersserver-side validation. As called out above, the Zoom add-on populatesconferenceData.parameters.addOnParameters.parameterswith Apps Script-side state (scriptId,creatorUserId,meetingUuid, etc.). Whether Google's Calendar API requires these fields when a non-add-on caller writeskey.type = "addOn"conferenceData is the one unknown that'll need testing during implementation. Possible fallbacks if Google rejects:key.type(no documented alternative cleanly fits Zoom)Pattern precedent
References for design / scope alignment:
--with-meetfeature request: Feature request: add--with-meettocalendar update(parity withcalendar create) #538--with-meetidempotency: gog calendar update --with-meet should be idempotent (currently replaces existing Meet link) #576--signature-from("extend an existing flag family" precedent): gmail send: Add --signature flag to append Gmail signature #180Help offered
Happy to test a release candidate against our OpenClaw agent fleet — real-world use case (agents scheduling Zoom on behalf of principals) means we'll exercise the auth refresh path, error handling, and edge cases quickly. Also happy to provide the full unsanitized conferenceData JSON via DM if useful for implementation.
Thanks for considering!