Install
openclaw skills install gog-restrictedGoogle Workspace CLI for Gmail, Calendar, and Auth (restricted via security wrapper).
openclaw skills install gog-restrictedGoogle Workspace CLI. gog-restricted is a security wrapper around the real gog binary — only whitelisted commands are allowed, everything else is hard-blocked. Always call gog-restricted, never gog directly.
--account unless overriding--json for parseable output--no-input to avoid interactive promptsRun script/setup.sh to install the wrapper. The real gog binary is left untouched. The script is idempotent — safe to run more than once.
The installer picks the first writable directory on your PATH from $HOME/.local/bin, $HOME/bin, /opt/homebrew/bin, /usr/local/bin — so agent runtimes that override HOME to a profile dir still land somewhere PATH can see. Set GOG_RESTRICTED_INSTALL_DIR=<dir> to override.
If you're running inside an agent runtime (e.g. Hermes) that sets HOME to a profile-specific directory not reflected in PATH, the installer will fall through to /opt/homebrew/bin or /usr/local/bin. That works, but the wrapper becomes visible to every shell on the machine. For profile-isolated installs, either:
$HOME/.local/bin (or $HOME/bin) to PATH inside the agent profile and re-run script/setup.sh, orGOG_RESTRICTED_INSTALL_DIR to a directory inside the profile that is on PATH (e.g. GOG_RESTRICTED_INSTALL_DIR="$HOME/.local/bin" PATH="$HOME/.local/bin:$PATH" bash script/setup.sh).gog-restricted --version — print version and exitgog-restricted --help — show top-level helpgog-restricted auth status — show auth configuration and keyring backendgog-restricted auth list — list stored accountsgog-restricted auth services — list supported auth services and scopesgog-restricted gmail search '<query>' --max N --json — search threads using Gmail query syntaxgog-restricted gmail read <messageId> — read a message (alias for gmail thread)gog-restricted gmail get <messageId> --json — get a message (full|metadata|raw)gog-restricted gmail thread attachments <threadId> — list all attachments in a threadgog-restricted gmail messages search '<query>' --max N --json — search messages using Gmail query syntaxgog-restricted gmail attachment <messageId> <attachmentId> — download a single attachmentgog-restricted gmail url <threadId> — print Gmail web URL for a threadgog-restricted gmail history — Gmail change historyOrganize operations use label modification. For example, to trash a message, add the TRASH label via thread modify; to archive, remove the INBOX label; to mark as read, remove the UNREAD label.
gog-restricted gmail thread modify <threadId> --add <label> --remove <label> — modify labels on a threadgog-restricted gmail batch modify <messageId> ... --add <label> --remove <label> — modify labels on multiple messagesgog-restricted gmail labels list --json — list all labelsgog-restricted gmail labels get <labelIdOrName> — get label details (including counts)gog-restricted gmail labels create <name> — create a new labelgog-restricted gmail labels add <messageId> --label <name> — add label to a messagegog-restricted gmail labels remove <messageId> --label <name> — remove label from a messagegog-restricted gmail labels modify <threadId> ... --add <label> --remove <label> — modify labels on threadsgog-restricted calendar list --json — list events (alias for calendar events)gog-restricted calendar events [<calendarId>] --json — list events from a calendar or all calendarsgog-restricted calendar get <eventId> --json — get an event (alias for calendar event)gog-restricted calendar event <calendarId> <eventId> — get a single eventgog-restricted calendar calendars --json — list available calendarsgog-restricted calendar search '<query>' --json — search events by querygog-restricted calendar freebusy <calendarIds> --json — get free/busy infogog-restricted calendar conflicts --json — find scheduling conflictsgog-restricted calendar colors — show calendar color palettegog-restricted calendar time — show server timegog-restricted calendar acl list <calendarId> --json — list calendar access controlgog-restricted calendar users --json — list workspace usersgog-restricted calendar team <group-email> --json — show events for all members of a Google Groupgog-restricted calendar create <calendarId> --summary '...' --from '...' --to '...' --json — create an eventThe wrapper enforces a strict flag allowlist on calendar create. Only the following flags may be passed; anything else (including undocumented egress flags like --conference-data, capitalised variants, or argparse-prefix forms like --att) is hard-blocked:
--summary, --from, --to, --description, --location, --all-day, --rrule, --reminder, --event-color, --visibility, --transparency, --json, --no-input, --account.
This is fail-closed: if gog adds a new safe flag, it must be added to the wrapper's allowlist before it can be used.
gog-restricted auth --helpgog-restricted gmail --helpgog-restricted gmail messages --helpgog-restricted gmail labels --helpgog-restricted gmail thread --helpgog-restricted gmail batch --helpgog-restricted calendar --helpgog-restricted calendar acl --help--max 10, not -m 10); the wrapper cannot reliably tell whether a single-dash flag takes a value, so it blocks them rather than risk misclassifying.-- ends option parsing. Useful for passing values that start with -.gog-restricted gmail send — sending emailgog-restricted gmail reply — replying to emailgog-restricted gmail forward — forwarding emailgog-restricted gmail drafts — creating/editing draftsgog-restricted gmail track — email open tracking (inserts tracking pixels)gog-restricted gmail vacation — vacation auto-reply sends automatic responsesgog-restricted gmail filters — creating mail filters (could set up auto-forwarding)gog-restricted gmail delegation — delegating account accessgog-restricted gmail settings — changing Gmail settings (filters, forwarding, delegation)gog-restricted gmail batch delete — permanently delete multiple messagesgog-restricted gmail labels delete — delete a label (removes it from all messages)gog-restricted gmail thread delete / trash / untrash — destructive thread opsgog-restricted gmail attachment upload / delete — attachment writesgog-restricted calendar update / calendar event update / calendar events update — update an eventgog-restricted calendar delete / calendar event delete / calendar events delete — delete an eventgog-restricted calendar event patch / insert / move / import (and events variants) — other event mutationsgog-restricted calendar acl insert / delete / update / patch — ACL changes (would grant external access)gog-restricted calendar respond — RSVP sends response to organizergog-restricted calendar propose-time — propose new meeting timegog-restricted calendar focus-time — create focus time blockgog-restricted calendar out-of-office — create OOO eventgog-restricted calendar working-location — set working locationgog-restricted drive — Google Drivegog-restricted docs — Google Docsgog-restricted sheets — Google Sheetsgog-restricted slides — Google Slidesgog-restricted contacts — Google Contactsgog-restricted people — Google Peoplegog-restricted chat — Google Chatgog-restricted groups — Google Groupsgog-restricted classroom — Google Classroomgog-restricted tasks — Google Tasksgog-restricted keep — Google Keepgog-restricted config — CLI configurationpending-review label instead.--max N on search and list commands to limit results. Start small (--max 10) and paginate if needed.from:alice after:2025/01/01) rather than broad searches.--from and --to to bound the date range. Prefer --today or --days N over open-ended listing.gmail get <messageId> when you need a single message over gmail thread <threadId> which fetches all messages in the thread.--json for structured output — it's faster to parse and less error-prone than text output.Commands that return lists (gmail search, gmail messages search, calendar events) support pagination via --max and --page:
gog-restricted gmail search 'label:inbox' --max 10 --jsonnextPageToken field.gog-restricted gmail search 'label:inbox' --max 10 --page '<nextPageToken>' --jsonnextPageToken is absent (no more results).Keep --max small (10–25) to avoid large responses and reduce API quota usage. Stop paginating once you have enough results — do not fetch all pages by default.