skills/gws/SKILL.md
Access Google Workspace (Gmail + Calendar) via the `gws` CLI. Use when the user asks to read, search, send, reply to, or manage emails, or to view, create, update, or delete calendar events.
npx skillsauth add pietz/skills gwsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
gws)gws is installed: gws --helpnpm install -g @anthropic-ai/gws (or follow the gws project README)gws auth login — this opens a browser for OAuth consentgws gmail users labels list --params '{"userId": "me"}' — should return labelsAsk the user for their Google account email if needed for calendar operations.
gws --help # full CLI reference
gws gmail --help # Gmail commands + helpers
gws calendar --help # Calendar commands + helpers
"userId": "me" for Gmail operations.q across all mail, not just INBOX, unless specifically asked for unread/inbox items.gws calendar calendarList list before assuming calendar IDs.# Recent inbox messages
gws gmail users messages list --params '{"userId": "me", "labelIds": "INBOX", "maxResults": 10}'
# Search all mail (includes archive)
gws gmail users messages list --params '{"userId": "me", "q": "from:alice subject:dinner", "maxResults": 10}'
# Common q operators: from: to: subject: has:attachment after:2026/03/01 before:2026/03/12 is:unread label:INBOX
List only returns id + threadId. Fetch full content with get.
# Metadata only (headers: Subject, From, To, Date)
gws gmail users messages get --params '{"userId": "me", "id": "MSG_ID", "format": "metadata"}'
# Full message with body
gws gmail users messages get --params '{"userId": "me", "id": "MSG_ID", "format": "full"}'
The body is in payload.parts[] or payload.body.data (base64url-encoded).
# Quick unread inbox summary (subject, sender, date)
gws gmail +triage
# Helper (preferred)
gws gmail +send --params '{"userId": "me"}' --json '{
"to": "[email protected]",
"subject": "Hello",
"body": "Message text here"
}'
# Reply (preserves threading)
gws gmail +reply --params '{"userId": "me", "id": "MSG_ID"}' --json '{
"body": "Reply text"
}'
# Reply all
gws gmail +reply-all --params '{"userId": "me", "id": "MSG_ID"}' --json '{
"body": "Reply text"
}'
# Forward
gws gmail +forward --params '{"userId": "me", "id": "MSG_ID"}' --json '{
"to": "[email protected]",
"body": "FYI see below"
}'
# Archive (remove from inbox)
gws gmail users messages modify --params '{"userId": "me", "id": "MSG_ID"}' --json '{"removeLabelIds": ["INBOX"]}'
# Mark as read
gws gmail users messages modify --params '{"userId": "me", "id": "MSG_ID"}' --json '{"removeLabelIds": ["UNREAD"]}'
# Mark as unread
gws gmail users messages modify --params '{"userId": "me", "id": "MSG_ID"}' --json '{"addLabelIds": ["UNREAD"]}'
# Star
gws gmail users messages modify --params '{"userId": "me", "id": "MSG_ID"}' --json '{"addLabelIds": ["STARRED"]}'
# Trash
gws gmail users messages trash --params '{"userId": "me", "id": "MSG_ID"}'
gws gmail users labels list --params '{"userId": "me"}'
# Agenda helper (all calendars)
gws calendar +agenda
# List from primary calendar
gws calendar events list --params '{
"calendarId": "primary",
"timeMin": "2026-03-12T00:00:00Z",
"timeMax": "2026-03-19T00:00:00Z",
"singleEvents": true,
"orderBy": "startTime",
"maxResults": 20
}'
Timed events use start.dateTime / end.dateTime. All-day events use start.date / end.date.
gws calendar +insert --params '{"calendarId": "primary", "sendUpdates": "all"}' --json '{
"summary": "Team sync",
"location": "Office",
"start": {"dateTime": "2026-03-15T19:00:00", "timeZone": "Europe/Berlin"},
"end": {"dateTime": "2026-03-15T21:00:00", "timeZone": "Europe/Berlin"},
"attendees": [{"email": "[email protected]"}],
"reminders": {"useDefault": true}
}'
gws calendar events update --params '{"calendarId": "primary", "eventId": "EVENT_ID", "sendUpdates": "all"}' --json '{
"summary": "Updated title",
"start": {"dateTime": "2026-03-15T20:00:00", "timeZone": "Europe/Berlin"},
"end": {"dateTime": "2026-03-15T22:00:00", "timeZone": "Europe/Berlin"}
}'
gws calendar events delete --params '{"calendarId": "primary", "eventId": "EVENT_ID", "sendUpdates": "all"}'
gws calendar freebusy query --json '{
"timeMin": "2026-03-15T00:00:00Z",
"timeMax": "2026-03-15T23:59:59Z",
"items": [{"id": "primary"}]
}'
For large result sets, use --page-all to auto-paginate (NDJSON, one page per line):
gws gmail users messages list --params '{"userId": "me", "q": "from:amazon"}' --page-all --page-limit 5
Default is JSON. Use --format table for human-readable output, --format csv for export.
development
Finish a build session by shipping the work. Ensure tests exist and pass, validate the functionality, spawn a fresh-eyes subagent review when the change is large or risky, then commit and push to main. Use when the user says "ship", "ship it", "wrap this up and push", "test, commit and push", or otherwise wants the session's changes tested, reviewed, committed, and pushed.
development
Search YouTube and read video transcripts from the command line. Use this whenever the user wants to find YouTube videos or channels, answer a question using knowledge from YouTube videos, get/read/summarize a video's transcript or captions, or find where in a video something is discussed. Also consider this skill for general purpose research, since YouTube is a rich source of information.
development
Create visual documents (presentations, flyers, brochures, posters) by generating HTML/CSS and converting to PDF via headless Chromium. Use this skill when the user wants to create slides, presentations, pitch decks, flyers, brochures, or posters.
development
Find and remove incidental architectural complexity in an existing codebase — structure that accreted through many locally-reasonable edits until the whole became more complex than the problem warrants. Preserves what the software does for its callers while simplifying how it's built. NOT for bug fixes, feature work, formatting/style cleanup, or refactors whose change is already obvious.