| name | gws |
| description | Google Workspace -- Gmail, Calendar, Drive, Sheets, Docs, Tasks. Use when: send email, check calendar, read/write spreadsheets, manage Drive files, Google Tasks. |
| user-invocable | true |
| argument-hint | [service] [action] |
GWS -- Google Workspace
CLI: gws (Google official). Requires OAuth 2.0 setup.
Setup
pip install google-workspace-cli
mkdir -p ~/.config/gws
cp client_secret.json ~/.config/gws/
gws auth login
gws auth status
Health Check
bash $CLAUDE_SKILL_DIR/scripts/health-check.sh
Gmail
gws gmail users messages list --params '{"userId":"me","maxResults":10,"q":"newer_than:7d"}'
gws gmail users messages get --params '{"userId":"me","id":"MSG_ID","format":"full"}'
gws gmail users messages list --params '{"userId":"me","q":"from:someone@email.com subject:urgent","maxResults":5}'
python3 -c "
import base64, json, subprocess
from email.mime.text import MIMEText
msg = MIMEText('Email body here')
msg['to'] = 'recipient@email.com'
msg['subject'] = 'Subject'
raw = base64.urlsafe_b64encode(msg.as_bytes()).decode()
result = subprocess.run([
'gws', 'gmail', 'users', 'messages', 'send',
'--params', '{\"userId\":\"me\"}',
'--json', json.dumps({'raw': raw})
], capture_output=True, text=True)
print(result.stdout)
"
Calendar
gws calendar calendarList list
gws calendar events list --params '{
"calendarId":"primary",
"timeMin":"2026-01-01T00:00:00Z",
"timeMax":"2026-01-07T00:00:00Z",
"singleEvents":true,
"orderBy":"startTime"
}'
gws calendar events insert --params '{"calendarId":"primary"}' --json '{
"summary":"Meeting",
"start":{"dateTime":"2026-01-02T10:00:00+03:00"},
"end":{"dateTime":"2026-01-02T11:00:00+03:00"},
"reminders":{"useDefault":false,"overrides":[
{"method":"popup","minutes":1440},
{"method":"popup","minutes":180},
{"method":"popup","minutes":15}
]}
}'
Drive
gws drive files list --params '{"pageSize":10,"q":"name contains \"report\""}'
gws drive files get --params '{"fileId":"FILE_ID","alt":"media"}' --output /tmp/file.pdf
gws drive files create --params '{"uploadType":"multipart"}' --json '{"name":"file.txt","parents":["FOLDER_ID"]}' --upload /path/to/file.txt
Sheets
gws sheets spreadsheets values get --params '{"spreadsheetId":"SHEET_ID","range":"Sheet1!A1:D10"}'
gws sheets spreadsheets values update --params '{
"spreadsheetId":"SHEET_ID",
"range":"Sheet1!A1:B2",
"valueInputOption":"USER_ENTERED"
}' --json '{"values":[["A","B"],["1","2"]]}'
gws sheets spreadsheets values append --params '{
"spreadsheetId":"SHEET_ID",
"range":"Sheet1!A:C",
"valueInputOption":"USER_ENTERED",
"insertDataOption":"INSERT_ROWS"
}' --json '{"values":[["x","y","z"]]}'
Docs
gws docs documents get --params '{"documentId":"DOC_ID"}'
gws drive files export --params '{"fileId":"DOC_ID","mimeType":"text/plain"}' --output /tmp/doc.txt
Tasks
gws tasks tasklists list
gws tasks tasks list --params '{"tasklist":"TASKLIST_ID"}'
Rules
- CONFIRM before sending email or creating calendar events
- All output is JSON by default
- Use
--page-all for pagination
- Token auto-refreshes -- no manual renewal needed
- Credentials in
~/.config/gws/ -- chmod 600