Access Gmail (read-only), Google Calendar (configurable), Google Contacts (read-only), Google Drive (configurable, with comments), Google Docs (configurable), and Google Sheets (configurable).
Download the latest release binary for linux/arm64 and install to ~/.openclaw/bin/:
bash
TAG=$(curl -fsSL "https://api.github.com/repos/PanthroCorp-Limited/openclaw-skills/releases" \
| grep -o '"tag_name":"google-workspace/v[^"]*"' | head -1 | cut -d'"' -f4)
VERSION=${TAG#google-workspace/v}
curl -fsSL "https://github.com/PanthroCorp-Limited/openclaw-skills/releases/download/${TAG}/google-workspace_${VERSION}_linux_arm64.tar.gz" \
| tar -xz -C ~/.openclaw/bin/ google-workspace
chmod +x ~/.openclaw/bin/google-workspace
google-workspace config show.config set before use.--drive=readwrite requests the full drive OAuth scope, which grants broad access to all Drive files at the token level. Only enable this if the operator accepts that risk.Before using any commands, verify what is enabled:
text
google-workspace config show
Search messages:
text
google-workspace gmail search --query "from:someone@example.com" --max-results 10
Read a message by ID:
text
google-workspace gmail read --id MESSAGE_ID
List labels:
text
google-workspace gmail labels
Search or read threads:
text
google-workspace gmail threads --query "subject:meeting"
google-workspace gmail threads --id THREAD_ID
List available calendars:
text
google-workspace calendar list
List upcoming events:
text
google-workspace calendar events --from 2026-03-29T00:00:00Z --to 2026-04-05T23:59:59Z
Get a specific event:
text
google-workspace calendar event --id EVENT_ID
Create an event (only if calendar mode is readwrite):
text
google-workspace calendar create --summary "Team sync" --start "2026-04-01T10:00:00Z" --end "2026-04-01T11:00:00Z"
Update an event (only if calendar mode is readwrite):
text
google-workspace calendar update --id EVENT_ID --summary "Updated title"
Delete an event (only if calendar mode is readwrite):
text
google-workspace calendar delete --id EVENT_ID
List contacts:
text
google-workspace contacts list --max-results 50
Search contacts:
text
google-workspace contacts search --query "John"
Get a specific contact:
text
google-workspace contacts get --id "people/c1234567890"
List files:
text
google-workspace drive list --max-results 20
Search files:
text
google-workspace drive list --query "name contains 'report'" --max-results 10
Get file metadata:
text
google-workspace drive get --id FILE_ID
Download file content (Google Docs export as plain text, Sheets as CSV):
text
google-workspace drive download --id FILE_ID
List comments on a file:
text
google-workspace drive comments list --file-id FILE_ID
Add a comment (requires readwrite mode):
text
google-workspace drive comment --file-id FILE_ID --content "Looks good, approved."
Reply to a comment (requires readwrite mode):
text
google-workspace drive comment reply --file-id FILE_ID --comment-id COMMENT_ID --content "Thanks!"
Read a document:
text
google-workspace docs read --document-id DOC_ID
Insert text (requires readwrite mode):
text
google-workspace docs edit --document-id DOC_ID --insert-text "Hello" --index 1
Find and replace (requires readwrite mode):
text
google-workspace docs edit --document-id DOC_ID --find "old text" --replace-with "new text"
List sheets in a spreadsheet:
text
google-workspace sheets list --spreadsheet-id SPREADSHEET_ID
Read cell values:
text
google-workspace sheets read --spreadsheet-id SPREADSHEET_ID --range "Sheet1!A1:C10"
Write cell values (requires readwrite mode):
text
google-workspace sheets write --spreadsheet-id SPREADSHEET_ID --range "Sheet1!A1:B2" --values '[["Name","Score"],["Alice","95"]]'
Check if the token is valid:
text
google-workspace auth status
If the token has expired, ask the operator to re-authenticate by running google-workspace auth login on the host.
If authentication fails with Error 400: policy_enforced, the operator's Google account likely has Advanced Protection enabled. They will need to temporarily unenroll, complete the OAuth flow, then re-enroll. The refresh token persists across sessions.
All commands output JSON by default. Use --output text for plain text where supported.