| name | google-workspace |
| description | Google Workspace: Gmail, Calendar, Drive, Contacts, Sheets, Docs. Use when the user asks about email, calendar events, files on Drive, contacts, spreadsheets, or documents. |
| version | 2.0.0 |
| always | false |
Google Workspace (via gws)
Use npx gws for all Google Workspace operations. Run commands via exec.
The gws binary is bundled as an optional dependency — no global install needed.
The CLI dynamically discovers all Google Workspace APIs via Google Discovery Service — when Google adds an endpoint, gws picks it up automatically.
Setup (one-time)
Run npx gws auth login -s drive,gmail,calendar,sheets,docs,contacts — this opens a browser for Google OAuth consent. Only needed once; credentials are stored encrypted at ~/.config/gws/.
For headless/Docker: export credentials from a machine with a browser, then set env var on the server:
npx gws auth export --unmasked > credentials.json
export GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE=/path/to/credentials.json
CLI Syntax
npx gws <service> <resource> <method> --params '{"key": "val"}' --json '{"key": "val"}'
Key flags:
| Flag | Description |
|---|
--params '{...}' | URL/query parameters |
--json '{...}' | Request body |
--dry-run | Preview request without executing |
--page-all | Auto-paginate (NDJSON output) |
--page-limit <N> | Max pages (default: 10) |
-o, --output <PATH> | Save binary response to file |
--upload <PATH> | Upload file (multipart) |
Discover any method's schema:
npx gws schema <service>.<resource>.<method>
Gmail
npx gws gmail +triage
npx gws gmail users messages list --params '{"q": "newer_than:7d", "maxResults": 10}'
npx gws gmail users messages list --params '{"q": "from:amazon.com subject:order", "maxResults": 5}'
npx gws gmail +read --message-id <messageId>
npx gws gmail +send --to recipient@example.com --subject "Subject" --body "Message"
npx gws gmail +send --to recipient@example.com --subject "Subject" --body-file - <<'EOF'
Hi,
Message body here.
Regards
EOF
npx gws gmail +send --to a@b.com --subject "Hi" --body "<p>Hello</p>" --html
npx gws gmail +send --to a@b.com --subject "Report" --body "See attached" -a report.pdf
npx gws gmail +send --to a@b.com --subject "Hi" --body "Draft text" --draft
npx gws gmail +reply --message-id <messageId> --body "Reply text"
npx gws gmail +reply-all --message-id <messageId> --body "Reply text"
npx gws gmail +forward --message-id <messageId> --to other@example.com
npx gws gmail +watch
Calendar
npx gws calendar +agenda
npx gws calendar +agenda --today --timezone Europe/Warsaw
npx gws calendar +insert --summary "Meeting" --start 2026-03-10T10:00:00 --end 2026-03-10T11:00:00
npx gws calendar events list --params '{"calendarId": "primary", "timeMin": "2026-03-08T00:00:00Z", "timeMax": "2026-03-15T00:00:00Z"}'
npx gws calendar events patch --params '{"calendarId": "primary", "eventId": "<eventId>"}' --json '{"summary": "New Title"}'
npx gws calendar events delete --params '{"calendarId": "primary", "eventId": "<eventId>"}'
npx gws calendar freebusy query --json '{"timeMin": "2026-03-10T00:00:00Z", "timeMax": "2026-03-10T23:59:59Z", "items": [{"id": "primary"}]}'
npx gws calendar colors get
Drive
npx gws drive files list --params '{"q": "name contains '\''budget 2026'\''", "pageSize": 10}'
npx gws drive files list --params '{"q": "'\''<folderId>'\'' in parents", "pageSize": 20}'
npx gws drive +upload ./report.pdf --name "Q1 Report"
npx gws drive files get --params '{"fileId": "<fileId>", "alt": "media"}' -o ./downloaded.pdf
npx gws drive files create --json '{"name": "New Folder", "mimeType": "application/vnd.google-apps.folder"}'
npx gws drive permissions create --params '{"fileId": "<fileId>"}' --json '{"role": "reader", "type": "user", "emailAddress": "user@example.com"}'
Contacts
npx gws people people searchContacts --params '{"query": "Jan Kowalski", "readMask": "names,emailAddresses,phoneNumbers"}'
npx gws people people connections list --params '{"resourceName": "people/me", "personFields": "names,emailAddresses,phoneNumbers", "pageSize": 20}'
npx gws people people searchDirectoryPeople --params '{"query": "Jan", "readMask": "names,emailAddresses", "sources": ["DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE"]}'
npx gws people people createContact --json '{"names": [{"givenName": "Jan", "familyName": "Kowalski"}], "emailAddresses": [{"value": "jan@example.com"}]}'
Sheets
npx gws sheets +read --spreadsheet <spreadsheetId> --range "Sheet1!A1:D10"
npx gws sheets +append --spreadsheet <spreadsheetId> --values "Alice,95,Pass"
npx gws sheets spreadsheets values update \
--params '{"spreadsheetId": "<id>", "range": "Sheet1!A1:B2", "valueInputOption": "USER_ENTERED"}' \
--json '{"values": [["Name","Value"],["a","1"]]}'
npx gws sheets spreadsheets values clear \
--params '{"spreadsheetId": "<id>", "range": "Sheet1!A2:Z"}'
npx gws sheets spreadsheets get --params '{"spreadsheetId": "<id>"}'
npx gws sheets spreadsheets create --json '{"properties": {"title": "Q1 Budget"}}'
Shell tip: Sheet ranges use ! which zsh interprets as history expansion. Use double quotes:
npx gws sheets +read --spreadsheet ID --range "Sheet1!A1:D10"
Docs
npx gws docs documents get --params '{"documentId": "<docId>"}'
npx gws docs documents create --json '{"title": "New Document"}'
npx gws docs +write --document-id <docId> --text "Hello, world!"
Workflow Helpers
npx gws workflow +standup-report
npx gws workflow +meeting-prep
npx gws workflow +weekly-digest
npx gws workflow +email-to-task --message-id <messageId>
npx gws workflow +file-announce --file-id <fileId> --space <spaceId>
Rules
- Always confirm before sending email or creating/modifying events.
- Use
--dry-run for destructive operations when possible.
- Use
npx gws schema <service>.<resource>.<method> to discover parameters for any API method.
- JSON values in
--params and --json must be wrapped in single quotes for shell escaping.
- Use ISO 8601 format for all dates/times.
- Use
--page-all for large result sets.