← Back to Skills Marketplace
cyrushuang1995-cmyk

Google Power Tools

by Siyuan Huang · GitHub ↗ · v2.1.9 · MIT-0
cross-platform ✓ Security Clean
361
Downloads
1
Stars
0
Active Installs
15
Versions
Install in OpenClaw
/install gws-google-workspace
Description
Google Workspace CLI. Make sure to use this skill whenever the user mentions Gmail, email, inbox, send email, read email, check mail, draft email, send invit...
README (SKILL.md)

GWS — Google Workspace CLI

Google's official Workspace CLI (@googleworkspace/cli). Covers Gmail, Drive, Calendar, Sheets, Docs, Slides, Forms, Tasks, People, Meet, and Classroom via Google API Discovery Service.

GitHub: https://github.com/googleworkspace/cli

Setup

export GOOGLE_WORKSPACE_PROJECT_ID=\x3Cyour-project-id>
export GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND=file
gws auth login          # first-time auth
gws auth login --full   # re-auth with all scopes if 403 error

Full setup guide: references/setup.md


Global Patterns (ALL commands)

tail -n +2 before jq

gws writes Using keyring backend: file to stdout before JSON. Always skip it:

gws gmail users messages list --params '{"userId":"me"}' 2>/dev/null | tail -n +2 | jq '.'

--params vs --json

  • --params: URL/query parameters (userId, id, q, maxResults)
  • --json: Request body (removeLabelIds, raw, resource JSON)
gws gmail users messages modify \
  --json '{"removeLabelIds":["UNREAD"]}' \
  --params '{"userId":"me","id":"MSG_ID"}'

Email body extraction

Most emails have only HTML. Try plain text first, then strip HTML tags:

raw=$(gws gmail users messages get --params '{"userId":"me","id":"MSG_ID","format":"full"}' 2>/dev/null | tail -n +2)
body=$(echo "$raw" | jq -r '(.payload.parts[]? | select(.mimeType=="text/plain") .body.data // empty)' | head -1 | base64 -d 2>/dev/null)
if [ -z "$body" ] || [ ${#body} -lt 10 ]; then
  body=$(echo "$raw" | jq -r '(.payload.body.data // (.payload.parts[]? | select(.mimeType=="text/html") .body.data // empty))' | head -1 | base64 -d 2>/dev/null | python3 -c "import sys,re; html=sys.stdin.buffer.read().decode('utf-8',errors='ignore'); print(re.sub(r'\x3C[^>]+>',' ',re.sub(r'\x3Cstyle[^>]*>.*?\x3C/style>','',html,flags=re.S)).strip()[:500])" 2>/dev/null)
fi

Per-command latency (~2-3s)

Use batchModify (up to 1000 IDs) or shell & + wait for parallel execution.

Discover any command

gws schema \x3Cservice>          # list all methods
gws schema \x3Cservice.method>   # parameter details
gws \x3Csvc> \x3Cmethod> --dry-run  # preview without executing

Gmail

Quick commands

gws gmail +triage                                                        # unread inbox summary
gws gmail +read --params '{"userId":"me","id":"MSG_ID"}'                 # read message
gws gmail +send --json '{"to":"[email protected]","subject":"Hi","body":"Text"}'   # send email
gws gmail +watch                                                         # stream new emails

Common operations

# List unread
gws gmail users messages list --params '{"userId":"me","q":"is:unread","maxResults":20}'

# Read headers (match by NAME, never by array index)
gws gmail users messages get --params '{"userId":"me","id":"ID","format":"metadata","metadataHeaders":["From","Subject","Date"]}' 2>/dev/null | tail -n +2 | jq '.payload.headers | map({(.name): .value}) | add'

# Batch mark as read (up to 1000 IDs)
IDS=$(gws gmail users messages list --params '{"userId":"me","q":"is:unread","maxResults":100}' 2>/dev/null | tail -n +2 | jq -c '[.messages[].id]')
gws gmail users messages batchModify --params '{"userId":"me"}' --json "{\"ids\":$IDS,\"removeLabelIds\":[\"UNREAD\"]}"

# Send with attachment: see references/gmail.md
# Labels, threads, attachments: see references/gmail.md

Search syntax: is:unread, from:xxx, subject:keyword, label:xxx, has:attachment, newer_than:1d, category:primary|social|updates

📖 More: labels, attachments, threads, parallel batch read → references/gmail.md


Drive

Common operations

# List files
gws drive files list --params '{"pageSize":10,"orderBy":"modifiedTime desc"}'
gws drive files list --params '{"q":"mimeType=\"application/vnd.google-apps.spreadsheet\""}'

# Upload (two-step: upload → rename, because files create ignores name)
cd ~/Downloads
gws drive files create --params '{}' --upload file.pdf --upload-content-type application/pdf
FILE_ID=$(gws drive files create --params '{}' --upload file.pdf --upload-content-type application/pdf 2>/dev/null | tail -n +2 | jq -r '.id')
gws drive files update --params "{\"fileId\":\"$FILE_ID\"}" --json '{"name":"file.pdf"}'

# Create folder
gws drive files create --params '{}' --json '{"name":"Folder","mimeType":"application/vnd.google-apps.folder"}'

# Download / Export
gws drive files get --params '{"fileId":"ID","alt":"media"}' --output file.txt
gws drive files export --params '{"fileId":"ID","mimeType":"application/pdf"}' --output doc.pdf

⚠️ --upload and --output only accept relative paths. cd to the directory first. ⚠️ files delete returns a saved_file field — ignore it.

📖 More: copy/move, permissions, storage → references/drive.md


Calendar

All time parameters use RFC 3339 format.

# List events
gws calendar events list --params '{"calendarId":"primary","timeMin":"TODAY_START","timeMax":"TODAY_END","maxResults":20}'

# Create event
gws calendar events insert --json '{"summary":"Meeting","start":{"dateTime":"START_TIME","timeZone":"TIMEZONE"},"end":{"dateTime":"END_TIME","timeZone":"TIMEZONE"}}' --params '{"calendarId":"primary"}'

# Free/busy
gws calendar freebusy query --json '{"timeMin":"START","timeMax":"END","items":[{"id":"primary"}]}'

📖 More: update/delete events, ACL, calendar management → references/calendar.md


Sheets

# Read
gws sheets spreadsheets values get --params '{"spreadsheetId":"ID","range":"Sheet1!A1:B10"}'

# Write values (RAW)
gws sheets spreadsheets values update --params '{"spreadsheetId":"ID","range":"Sheet1!A1","valueInputOption":"RAW"}' --json '{"values":[["Value"]]}'

# Write formulas (must use USER_ENTERED)
gws sheets spreadsheets values update --params '{"spreadsheetId":"ID","range":"Sheet1!C1","valueInputOption":"USER_ENTERED"}' --json '{"values":[["=SUM(A1:B10)"]]}'

# Append rows
gws sheets spreadsheets values append --params '{"spreadsheetId":"ID","range":"Sheet1!A1","valueInputOption":"RAW"}' --json '{"values":[["col1","col2"]]}'

📖 More: row/column ops, formatting, conditional formatting → references/sheets.md


Docs

DOC_ID=$(gws docs documents create --json '{"title":"My Doc"}' --params '{}' 2>/dev/null | tail -n +2 | jq -r '.documentId')
gws docs documents get --params '{"documentId":"ID"}' 2>/dev/null | tail -n +2 | jq '[.body.content[]|select(.paragraph)|.paragraph.elements[]?|select(.textRun)|.textRun.content]|join("")'
gws docs documents batchUpdate --json '{"requests":[{"insertText":{"location":{"index":1},"text":"Hello\
"}}]}' --params '{"documentId":"ID"}'

📖 More: bold, headings, images, bullet lists → references/docs-slides-forms.md


Slides

Coordinates use EMU units (1 inch = 914400 EMU).

# Create presentation
SLIDE_ID=$(gws slides presentations create --json '{"title":"My Slides"}' --params '{}' 2>/dev/null | tail -n +2 | jq -r '.presentationId')

# Add text box
gws slides presentations batchUpdate --json '{"requests":[{"createShape":{"objectId":"s1","shapeType":"TEXT_BOX","elementProperties":{"pageObjectId":"p1","size":{"width":{"magnitude":4000000,"unit":"EMU"},"height":{"magnitude":300000,"unit":"EMU"}},"transform":{"scaleX":1,"scaleY":1,"translateX":100000,"translateY":100000,"unit":"EMU"}}}},{"insertText":{"objectId":"s1","text":"Hello!"}}]}' --params '{"presentationId":"ID"}'

# Add new slide
gws slides presentations batchUpdate --json '{"requests":[{"createSlide":{"objectId":"slide2"}}]}' --params '{"presentationId":"ID"}'

# Insert image
gws slides presentations batchUpdate --json '{"requests":[{"createImage":{"url":"https://example.com/img.png","elementProperties":{"pageObjectId":"p1","size":{"width":{"magnitude":3000000,"unit":"EMU"},"height":{"magnitude":2000000,"unit":"EMU"}}}}}]}' --params '{"presentationId":"ID"}'

📖 More → references/docs-slides-forms.md

Forms

# Create form
FORM_ID=$(gws forms forms create --json '{"info":{"title":"Survey"}}' --params '{}' 2>/dev/null | tail -n +2 | jq -r '.formId')

# Add question (text)
gws forms forms batchUpdate --json '{"requests":[{"createItem":{"location":{"index":0},"item":{"title":"Your name?","questionItem":{"question":{"required":true,"textQuestion":{}}}}}}]}' --params '{"formId":"ID"}'

# Add question (radio / checkbox / dropdown / date / scale)
gws forms forms batchUpdate --json '{"requests":[{"createItem":{"location":{"index":1},"item":{"title":"Rate 1-5","questionItem":{"question":{"required":true,"scaleQuestion":{"low":1,"high":5}}}}}}]}' --params '{"formId":"ID"}'

# View responses
gws forms forms responses list --params '{"formId":"ID"}'

📖 More question types → references/docs-slides-forms.md

Tasks

gws tasks tasklists list 2>/dev/null | tail -n +2 | jq '.items[]|{title,id}'
gws tasks tasks list --params '{"tasklist":"@default"}'
gws tasks tasks insert --json '{"title":"Task","notes":"Desc"}' --params '{"tasklist":"@default"}'
gws tasks tasks patch --params '{"tasklist":"@default","task":"TASK_ID"}' --json '{"status":"completed"}'
gws tasks tasks delete --params '{"tasklist":"@default","task":"TASK_ID"}'

📖 More → references/tasks-people-other.md

People / Contacts

searchContacts requires readMask — omitting causes 400 error.

gws people people get --params '{"resourceName":"people/me","personFields":"names,emailAddresses"}'
gws people people searchContacts --params '{"query":"john","pageSize":10,"readMask":"names,emailAddresses,phoneNumbers"}'
gws people connections list --params '{"resourceName":"people/me","personFields":"names,emailAddresses","pageSize":10}'
gws people people createContact --json '{"names":[{"givenName":"First","familyName":"Last"}],"emailAddresses":[{"value":"[email protected]"}]}' --params '{"readMask":"names,emailAddresses"}'
gws people contactGroups list --params '{"pageSize":10}'

📖 More → references/tasks-people-other.md

Meet / Classroom

gws meet conferenceRecords list --params '{"pageSize":10}'
gws classroom courses list --params '{"pageSize":10}'
gws classroom courses students list --params '{"courseId":"COURSE_ID"}'
gws classroom courses courseWork list --params '{"courseId":"COURSE_ID"}'

📖 More → references/tasks-people-other.md


Workflow Helpers

gws workflow +standup-report                   # today's meetings + tasks
gws workflow +meeting-prep                     # next meeting prep
gws workflow +weekly-digest                    # weekly meetings + unread count
gws workflow +email-to-task --message-id "ID"  # Gmail → Tasks

Can't find the right command?

  1. Discover all methods for a service: gws schema \x3Cservice> (e.g. gws schema drive, gws schema gmail)
  2. Get parameter details: gws schema \x3Cservice.method> (e.g. gws schema drive.files.copy)
  3. Dry-run to preview: gws \x3Csvc> \x3Cmethod> --dry-run
  4. Check references/ for detailed examples per service
  5. Official docs: https://github.com/googleworkspace/cli

Troubleshooting

Issue Solution
403 Insufficient scopes gws auth login --full
No OAuth client Check ~/.config/gws/client_secret.json
API not enabled Enable in GCP Console → APIs & Services
jq parse error Add tail -n +2 to skip keyring prefix
Upload shows "Untitled" Rename with files update after upload
File not found on upload Use relative paths, cd first
Usage Guidance
This skill appears to be what it says: a wrapper around the official Google Workspace CLI. Before installing or using it, confirm you trust the @googleworkspace/cli package source (npm + GitHub repo), install it in a controlled environment, and prefer least-privilege OAuth scopes rather than the full set unless necessary. Be aware the setup instructs you to create an OAuth client and store client_secret.json in ~/.config/gws and may prompt you to accept an 'unverified app' flow for personal projects; only proceed if you control the GCP project and understand that published/in-production apps can yield long-lived tokens. Finally, note the small inconsistency that the registry entry lacked an install spec while SKILL.md includes one — you may want to confirm the intended install method.
Capability Analysis
Type: OpenClaw Skill Name: gws-google-workspace Version: 2.1.9 The skill provides a legitimate and well-documented interface for the official Google Workspace CLI (@googleworkspace/cli). It includes comprehensive instructions for managing Gmail, Drive, Calendar, and other Workspace services using standard shell utilities like jq and base64. The setup guide (references/setup.md) correctly details the OAuth process and provides sound security advice regarding API scopes and token management. No evidence of malicious intent, data exfiltration to unauthorized endpoints, or prompt injection was found.
Capability Tags
requires-oauth-token
Capability Assessment
Purpose & Capability
Name/description (Google Workspace CLI) align with required binaries (gws, jq, base64, python3), the required config (~/.config/gws/client_secret.json), and the OAuth env vars. Nothing requested appears unrelated to the stated purpose.
Instruction Scope
SKILL.md stays on-topic: it documents gws commands, discovery, OAuth setup, troubleshooting, and file locations the CLI uses. It does not instruct the agent to read unrelated system files or exfiltrate data to non-Google endpoints.
Install Mechanism
The registry metadata lists no install spec, but SKILL.md contains an 'install' block and instructs an npm global install of @googleworkspace/cli. Installing a global npm package is expected for this CLI but is a moderate-risk action (arbitrary code executed at install time). The package and homepage point to the official GitHub repo, which reduces but does not eliminate install risk.
Credentials
Requested env vars and config path are appropriate. The setup guidance recommends many broad OAuth scopes (gmail, drive, calendar, docs, sheets, slides, forms, tasks, people, classroom, etc.), which is consistent with full Workspace control but represents high privilege — the user should apply least-privilege scopes and understand long-lived tokens if switching to 'In production'.
Persistence & Privilege
No 'always: true' or other elevated persistence flags. The skill writes/reads its own config and token files under ~/.config/gws, which is appropriate for a CLI that performs OAuth; it does not request other skills' credentials or system-wide settings.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install gws-google-workspace
  3. After installation, invoke the skill by name or use /gws-google-workspace
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v2.1.9
Rename skill from 'GWS - Google Workspace CLI' to 'Google Power Tools' for better clarity and appeal. Keep all functionality and documentation unchanged.
v2.1.8
Fix incorrect command syntax: scaleQuestion uses low/high (not minimum/maximum), DROPDOWN -> DROP_DOWN, courses.courseWork -> courses courseWork. Remove unnecessary Security & Privacy section. Expand description with more trigger phrases (draft email, send invite, share file, create a document, share calendar, to-do, reminder, address book, etc.).
v2.1.7
Expand Slides, Forms (all question types), Tasks, People, Meet, Classroom with full examples in SKILL.md. Add 'Can't find the right command?' troubleshooting section with gws schema discovery flow. Expand Forms reference with radio/checkbox/dropdown/date/scale question types.
v2.1.6
Expand description with comprehensive trigger phrases (email, inbox, upload, download, schedule, spreadsheet, cloud storage, etc.). Remove hardcoded dates from Calendar examples.
v2.1.5
Fix suspicious flag: declare python3 bin, env vars (GOOGLE_WORKSPACE_PROJECT_ID, GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND), config path (~/.config/gws/client_secret.json). Remove evals/ and gws-workspace/ test data from package.
v2.1.4
Security audit: fix ClawHub suspicious flag. Remove env vars from metadata, add Security section, improve OAuth guidance to risk-assessment style, restructure SKILL.md to 257 lines with quick-reference + reference pointers
v2.1.3
文档改进:添加 OAuth Testing vs Production 模式说明,补充 7天token过期问题的解决方案
v2.2.1
Clean up: remove eval/test files, remove error examples, keep only correct guidance, tighten to SKILL.md + setup.md only
v2.2.0
Merge with v1: add Drive upload rename bug, parallel batch read, Sheets formatting, Docs/Slides editing, Workflow helpers, attachment download; retain all known limitations (tail -n +2, params vs json, resultSizeEstimate, HTML body extraction); add install metadata, license, homepage
v2.1.2
Full rewrite: add Docs/Sheets/Slides editing (formulas, formatting, merge, insert), Forms/Meet/Classroom, remove Chat (paid), fix metadata format, restructure sections with bold headers
v1.1.0
Fix Sheets +append syntax, add Forms/Meet/Classroom, remove Chat (paid), fix metadata requires format
v2.1.1
Fix: add openclaw.requires metadata declaring env vars (GOOGLE_WORKSPACE_PROJECT_ID, credentials file, keyring backend) and binaries (gws, jq, base64) to resolve security scan mismatch.
v2.1.0
Declare required env vars (GOOGLE_WORKSPACE_PROJECT_ID, CREDENTIALS_FILE, KEYRING_BACKEND) and binaries (gws, jq, base64) in skill metadata to resolve security scan flag.
v2.0.0
Major rewrite: skill-creator compliant AI usage guide. Added Gmail attachments/threads/trash/settings, Drive copy/move/folder/permissions/storage, Calendar CRUD/freebusy/ACL/secondary calendars, Sheets create/update/clear, Docs/Slides/Forms create, Tasks complete/clear, People search/create/groups, Meet/Classroom queries. Removed hardcoded paths, added decision principles.
v1.0.0
Initial release: 15 verified Google services with workflow examples and performance tips
Metadata
Slug gws-google-workspace
Version 2.1.9
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 15
Frequently Asked Questions

What is Google Power Tools?

Google Workspace CLI. Make sure to use this skill whenever the user mentions Gmail, email, inbox, send email, read email, check mail, draft email, send invit... It is an AI Agent Skill for Claude Code / OpenClaw, with 361 downloads so far.

How do I install Google Power Tools?

Run "/install gws-google-workspace" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Google Power Tools free?

Yes, Google Power Tools is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Google Power Tools support?

Google Power Tools is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Google Power Tools?

It is built and maintained by Siyuan Huang (@cyrushuang1995-cmyk); the current version is v2.1.9.

💬 Comments