gws-master
Google Workspace CLI mastery — Gmail, Drive, Calendar, Sheets, Docs, Chat, Admin via the official gws CLI
Google Workspace CLI Master
Operate all Google Workspace services from the terminal using gws — Google's official CLI. Dynamically discovers APIs from Google's Discovery Service, so it covers every Workspace endpoint.
When this applies
- Sending, searching, or managing email (Gmail)
- Managing calendar events and availability
- Uploading, downloading, or sharing Google Drive files
- Reading or writing Google Sheets data
- Creating or exporting Docs, Slides, and Forms
- Managing Google Chat spaces and messages
- Admin operations (users, groups, domains)
Self-Help
gws dynamically generates commands from Google's Discovery Service — it knows every API endpoint.
- Run
gws --helpfor top-level service list - Run
gws <service> --helpfor all methods in a service (e.g.gws gmail --help) - Run
gws <service> <method> --helpfor flags and parameters - Run
gws discoverto see all available Google APIs - Use
--output jsonon any command for machine-readable output
Auth
Two modes:
- Service account: set
GOOGLE_APPLICATION_CREDENTIALSto the key JSON path - OAuth2 user context: run
gws auth login(interactive) or setGWS_REFRESH_TOKEN+GWS_OAUTH_CLIENT_ID+GWS_OAUTH_CLIENT_SECRETfor headless
Check auth: gws auth status
Gmail
gws gmail messages list --query "is:unread newer_than:7d" --max-results 20 --output json
gws gmail messages get <messageId> --output json
gws gmail messages send --to "[email protected]" --subject "Report" --body "See attached" --attachment report.pdf
gws gmail drafts list --output json
gws gmail drafts create --to "[email protected]" --subject "Draft" --body "..."
gws gmail labels list --output json
gws gmail threads get <threadId> --output json
gws gmail messages trash <messageId>
Gmail search operators: from:, to:, subject:, is:unread, has:attachment, newer_than:, older_than:, label:, in:sent.
Calendar
gws calendar events list --calendar-id primary --max-results 10 --output json
gws calendar events insert --calendar-id primary --summary "Meeting" \
--start "2026-03-25T14:00:00" --end "2026-03-25T15:00:00" --timezone "UTC"
gws calendar events update <eventId> --calendar-id primary --summary "Updated"
gws calendar events delete <eventId> --calendar-id primary
gws calendar freebusy --email "[email protected]" --time-min "2026-03-25T00:00:00Z" --time-max "2026-03-26T00:00:00Z" --output json
gws calendar calendars list --output json
Drive
gws drive files list --output json
gws drive files list --query "mimeType='application/pdf'" --max-results 10 --output json
gws drive files list --query "name contains 'quarterly'" --output json
gws drive files get <fileId> --output json
gws drive files download <fileId> --output-file ./local.pdf
gws drive files export <fileId> --mime-type application/pdf --output-file ./export.pdf
gws drive files upload ./file.pdf --parent <folderId> --name "file.pdf"
gws drive files create-folder "New Folder" --parent <folderId>
gws drive permissions list <fileId> --output json
gws drive permissions create <fileId> --email "[email protected]" --role writer
Sheets
gws sheets values get <spreadsheetId> --range "Sheet1!A1:D10" --output json
gws sheets values update <spreadsheetId> --range "Sheet1!A1" --values '[["a","b"],["c","d"]]'
gws sheets values append <spreadsheetId> --range "Sheet1!A1" --values '[["new","row"]]'
gws sheets spreadsheets get <spreadsheetId> --output json # metadata + sheet tabs
gws sheets values clear <spreadsheetId> --range "Sheet1!A1:D10"
Docs & Slides
gws docs documents get <docId> --output json
gws docs documents create --title "New Doc"
gws drive files export <docId> --mime-type application/pdf --output-file ./doc.pdf
gws drive files export <slideId> --mime-type application/vnd.openxmlformats-officedocument.presentationml.presentation --output-file ./slides.pptx
Chat
gws chat spaces list --output json
gws chat spaces messages list <spaceName> --output json
gws chat spaces messages create <spaceName> --text "Hello from agent"
Admin
gws admin users list --domain example.com --output json
gws admin users get <userId> --output json
gws admin groups list --output json
gws admin groups members list <groupId> --output json
Decision Rules
- If searching email →
gws gmail messages list --querywith Gmail query syntax - If checking availability →
gws calendar freebusybefore creating events - If exporting Google-native files (Docs/Sheets/Slides) →
gws drive files exportwith --mime-type - If downloading non-native files →
gws drive files download - If writing structured data →
gws sheets values updatewith JSON array values - If need file ID →
gws drive files list --queryfirst - If command not covered above →
gws <service> --helpto discover it
Do
- Always use
--output jsonfor parseable output - Use
--max-resultsto limit results and avoid token overflow - Check calendar availability before creating events
- Use Gmail search operators for precise filtering
- Confirm file ID before export/download (
gws drive files list --query) - Use
gws discoverto find services not listed here
Don't
- Send emails without user confirmation (irreversible — always confirm recipient + content)
- Delete calendar events or Drive files without confirmation (destructive)
- Modify shared Sheets without confirming the target range (overwrites data)
- Create Drive permissions without confirmation (grants external access)
- Omit
--output json(plain text is harder to parse reliably) - Read email threads without a clear task reason (privacy)