Get the FREE Ultimate OpenClaw Setup Guide →

google-workspace-ops

npx machina-cli add skill buildoak/fieldwork-skills/google-workspace-ops --openclaw
Files (1)
SKILL.md
15.3 KB

Google Workspace Ops

Automates Google Workspace work using the gog CLI with machine-parseable JSON output, from email and calendar operations to Drive/docs/sheets workflows. Use it when you need repeatable workspace automation, but avoid it for non-Google services or ad hoc UI workflows.

Terminology used in this file:

  • OAuth: Google's delegated login/authorization flow used to grant CLI access without sharing your password.
  • GCP: Google Cloud Platform, where you create the project and OAuth credentials.
  • RFC3339: Standard date-time format used by Google APIs (for example, 2026-02-18T09:00:00+00:00).

Setup

brew tap steipete/tap
brew install gogcli
gog login YOUR_EMAIL --services all
  • Claude Code: copy this skill folder into .claude/skills/google-workspace-ops/
  • Codex CLI: append this SKILL.md content to your project's root AGENTS.md

For the full installation walkthrough (prerequisites, OAuth setup, verification, troubleshooting), see references/installation-guide.md.

Credential management: GOG_KEYRING_PASSWORD is required for all gog operations using the file-based keyring (headless/SSH environments, or desktop when opting out of system keychain). We strongly recommend managing it via the vault skill -- see references/auth-setup.md for all options including vault, custom secret managers, and plain export.

Staying Updated

This skill ships with an UPDATES.md changelog and UPDATE-GUIDE.md for your AI agent.

After installing, tell your agent: "Check UPDATES.md in the google-workspace-ops skill for any new features or changes."

When updating, tell your agent: "Read UPDATE-GUIDE.md and apply the latest changes from UPDATES.md."

Follow UPDATE-GUIDE.md so customized local files are diffed before any overwrite.


Quick Start

Run one read-only Gmail flow end-to-end:

gog auth status
gog gmail search "is:unread" --max 5 --json --no-input
gog gmail thread get THREAD_ID --json --no-input

Use this baseline pattern for automation:

  • read/list/search: --json --no-input
  • send/create/modify/delete: run --dry-run first, then ask user approval

Decision Tree: When to Use gog

Need to interact with Google Workspace?
  |
  +-- Is it email? (read, search, send, labels, drafts)
  |     YES --> gog gmail ...
  |
  +-- Is it calendar? (events, create, conflicts, freebusy)
  |     YES --> gog calendar ...
  |
  +-- Is it files? (search, upload, download, share)
  |     YES --> gog drive ...
  |
  +-- Is it document editing? (create, read, write Google Docs)
  |     YES --> gog docs ...
  |
  +-- Is it presentations? (create from markdown, export)
  |     YES --> gog slides ...
  |
  +-- Is it spreadsheets? (read cells, update, append)
  |     YES --> gog sheets ...
  |
  +-- Is it people? (contacts, directory search, tasks)
        YES --> gog contacts / gog tasks / gog people ...

Rule of thumb: if it touches Google Workspace, gog is the right entry point.

Security: Approval Rules

State-modifying operations require explicit user approval before execution.

Operation TypeExamplesAutonomous?
Read / List / Searchgmail messages list, drive ls, calendar list, docs catYES — run freely
Send / Creategmail send, docs create, calendar create, drive uploadNO — ask user first
Modify / Updategmail modify, sheets update, docs write, contacts updateNO — ask user first
Delete / Trashgmail trash, drive trash, tasks deleteNO — ask user first
Draftgmail drafts createYES — drafts are safe, not sent

The rule is simple: if an action changes workspace state visible to others or is hard to undo, get approval first. Reading is okay.

Automation and scripts should present intent (recipient, subject, summary, account, target IDs) and wait for explicit confirmation before send/modify/delete operations.

Global Flags (All Commands)

Every gog command accepts these flags. Know them -- they control output format and safety.

FlagShortPurposeWhen to Use
--json-jJSON output to stdoutAlways for agent use -- structured, parseable
--plain-pTSV output (no colors)When piping to awk/cut
--results-onlyDrop envelope (nextPageToken etc.)Cleaner JSON for single-page results
--select=FIELDSPick only needed fields (dot paths)Reduce token cost on large responses
--account=EMAIL-aTarget specific accountMulti-account setups
--dry-run-nPreview without executingAlways before destructive ops
--force-ySkip confirmationsNon-interactive pipelines
--no-inputFail instead of promptingAgent automation (never interactive)
--verbose-vDebug loggingTroubleshooting

Agent-critical pattern: use --json --no-input for automation. JSON keeps automation deterministic. --no-input prevents prompt hangs.

Services Overview

ServiceCommandAliasesKey Operations
Gmailgog gmailmail, emailsearch, get, send, thread, labels, drafts, batch
Calendargog calendarcalevents, create, search, conflicts, freebusy
Drivegog drivedrvls, search, upload, download, share, mkdir
Docsgog docsdoccreate, cat, write, insert, find-replace
Slidesgog slidesslidecreate, create-from-markdown, export, read-slide
Sheetsgog sheetssheetget, update, append, clear, format, metadata
Contactsgog contactscontactsearch, list, create, update
Tasksgog taskstasklists, list, add, done, update
Chatgog chatspaces, messages, threads, dm
Peoplegog peoplepersonme, search, get, relations
Formsgog formsformget, create, responses
Groupsgog groupsgrouplist, members
Classroomgog classroomclasscourses, students, coursework, submissions
Apps Scriptgog appscriptscriptget, content, run, create
Keepgog keeplist, get, search (Workspace only)

Top-level shortcuts (save keystrokes):

ShortcutExpands To
gog sendgog gmail send
gog lsgog drive ls
gog searchgog drive search
gog downloadgog drive download
gog uploadgog drive upload
gog logingog auth add
gog logoutgog auth remove
gog statusgog auth status
gog me / gog whoamigog people me

10x Workflows

These are the highest-leverage patterns. Use these before inventing new scripts.

1. Read and Summarize Recent Emails

# Get last 5 unread emails with full content
gog gmail search "is:unread" --max 5 --json | jq '.[].messages[0] | {subject: .subject, from: .from, snippet: .snippet}'

# Get a specific thread with all messages
gog gmail thread get THREAD_ID --json

2. Send Email (with Safety)

# Preview first (dry-run)
gog send --to "person@example.com" --subject "Meeting notes" --body "Here are the notes..." --dry-run

# Then send
gog send --to "person@example.com" --subject "Meeting notes" --body "Here are the notes..." --no-input

3. Today's Calendar at a Glance

# Today's events across all calendars
gog cal events --today --all --json

# This week
gog cal events --week --json

# Next 3 days
gog cal events --days 3 --json

4. Create Calendar Event from Natural Language

# The agent translates natural language to RFC3339 times
gog cal create primary \
  --summary "Team standup" \
  --from "2026-02-18T09:00:00+00:00" \
  --to "2026-02-18T09:30:00+00:00" \
  --description "Daily sync" \
  --with-meet \
  --json

5. Search Drive and Get Links

# Full-text search
gog search "quarterly report" --max 5 --json | jq '.[].webViewLink'

# List files in a folder
gog ls --parent FOLDER_ID --json

6. Create a Google Doc from Markdown

# Create doc with markdown content
gog docs create "Meeting Notes 2026-02-17" --file notes.md --json

# Or write markdown to existing doc
gog docs write DOC_ID --file notes.md --replace --markdown

7. Read a Google Doc as Plain Text

# Dump doc as text (great for agent consumption)
gog docs cat DOC_ID

# Read specific tab
gog docs cat DOC_ID --tab "Notes"

# All tabs
gog docs cat DOC_ID --all-tabs

8. Create Slides from Markdown

# One command: markdown -> Google Slides
gog slides create-from-markdown "Q1 Review" --content-file presentation.md --json

9. Spreadsheet Operations

# Read a range
gog sheets get SHEET_ID "Sheet1!A1:D10" --json

# Append a row
gog sheets append SHEET_ID "Sheet1!A:D" "value1" "value2" "value3" "value4"

# Update specific cells
gog sheets update SHEET_ID "Sheet1!B2" "new value"

10. Multi-Service Pipeline

# Find a doc, read it, email a summary
DOC_ID=$(gog search "project brief" --max 1 --json | jq -r '.[0].id')
CONTENT=$(gog docs cat "$DOC_ID")
gog send --to "team@example.com" --subject "Project Brief Summary" --body "$CONTENT" --no-input

Output Modes

gog supports three output modes. Choose based on consumer.

ModeFlagBest For
Human(default)Terminal, interactive use, colored tables
JSON--jsonAutomation, scripting, jq pipelines
TSV--plainawk, cut, spreadsheet import

For automation: always --json. Add --results-only to trim envelopes.

Field selection reduces token use:

# Only get subject and date from emails
gog gmail search "is:unread" --json --select "subject,date,from"

Exit Codes

Stable exit codes for automation.

CodeNameMeaning
0okSuccess
1errorGeneral error
2usageInvalid arguments / bad syntax
3empty_resultsNo results found (use with --fail-empty)
4auth_requiredOAuth token missing or expired
5not_foundResource not found
6permission_deniedInsufficient permissions
7rate_limitedGoogle API rate limit hit
8retryableTransient error, retry is safe
10configConfiguration problem
130cancelledUser cancelled (Ctrl-C)

Agent error handling pattern:

gog gmail search "is:unread" --json --fail-empty
EXIT=$?
if [ $EXIT -eq 3 ]; then echo "No unread emails"; fi
if [ $EXIT -eq 4 ]; then echo "Auth expired -- run: gog login EMAIL"; fi
if [ $EXIT -eq 7 ]; then sleep 5 && retry; fi

Multi-Account

gog supports multiple Google accounts. Use -a EMAIL to target a specific account.

# List authenticated accounts
gog auth list

# Target specific account
gog gmail search "is:unread" -a work@company.com --json
gog cal events --today -a personal@gmail.com --json

# Set default account
gog config set default_account work@company.com

Common Gotchas

IssueCauseFix
auth_required (exit 4)Token expired or missingRun gog login EMAIL --services all
config (exit 10)No OAuth credentials JSONDownload from Google Cloud Console, run gog auth credentials set FILE.json
Gmail search returns threads, not messagesGmail groups by thread by defaultUse gog gmail get MSG_ID for individual messages
Calendar times wrongMissing timezone in RFC3339Include timezone offset, e.g. 2026-02-18T09:00:00+00:00
rate_limited (exit 7)Too many API callsWait and retry. Use --max to limit results per call.
Docs markdown not renderingMissing --markdown flagUse gog docs write DOC_ID --replace --markdown
--select returns emptyField path wrongRun once with --json first to inspect schema
Slides from markdown: emptyMissing --content or --content-fileProvide content inline or via file

Error Handling

SymptomExit code / signalRecovery
No results when data is expected3 (empty_results)Re-run without --fail-empty to inspect envelope; broaden query or change filters
OAuth expired or missing4 (auth_required)Run gog login EMAIL --services all, then gog auth status
API permission denied6 (permission_denied)Re-auth with the needed scopes and verify API is enabled in Google Cloud
Rate limit hit7 (rate_limited)Back off (sleep), reduce --max, retry with jitter
Transient backend error8 (retryable)Retry with exponential backoff; keep idempotent operations safe
Invalid command/flags2 (usage)Re-check command syntax in references/gog-commands.md

Anti-Patterns

Do NotDo Instead
Use gog without --json in automationAlways use --json --no-input
Send email without --dry-run firstPreview with --dry-run, then send
Fetch all pages of large resultsUse --max N; paginating blindly wastes tokens
Hardcode account email in scriptsUse -a EMAIL or default_account config
Use gog for non-Google servicesUse the right tool for the job
Skip --no-input in automationScripts cannot answer prompts
Use --force on delete without --dry-runAlways preview destructive operations
Ignore exit codesHandle them explicitly (see table above)

Sandboxed / CI Environments

gog makes HTTPS calls to Google APIs. In sandboxed or CI environments, ensure network access is available.

Operation TypeSandbox Requirements
Read-only (search, list, get)Read-only sandbox + network access
Write operations (send, create, modify)Write sandbox + network access
Complex pipelines with local file I/OFull access (write + network)

If your sandbox blocks outbound HTTPS, gog commands will fail with network errors. Ensure your environment allows connections to *.googleapis.com.

Bundled Resources Index

PathWhatWhen to Load
./UPDATES.mdStructured changelog for AI agentsWhen checking for new features or updates
./UPDATE-GUIDE.mdInstructions for AI agents performing updatesWhen updating this skill
./references/installation-guide.mdDetailed install walkthrough for Claude Code and Codex CLIFirst-time setup or environment repair
./references/gog-commands.mdFull command reference for all 15 servicesNeed exact command syntax and flags
./references/pipeline-patterns.mdComposable patterns: gog + jq + multi-service workflowsBuilding complex automation
./references/auth-setup.mdOAuth setup, credentials, token handling, multi-account, headed + headless authFirst-time setup or auth troubleshooting

Source

git clone https://github.com/buildoak/fieldwork-skills/blob/main/skills/google-workspace-ops/SKILL.mdView on GitHub

Overview

Automates Google Workspace workflows using the gog CLI, returning machine-parseable JSON across Gmail, Calendar, Drive, Docs, Slides, Sheets, and more. It enables repeatable, pipeline-driven automation for email, calendar, and file/Docs workflows, while avoiding non-Google services or ad hoc UI tasks.

How This Skill Works

The skill invokes gog commands for Gmail, Calendar, Drive, Docs, Slides, Sheets, and other included services to perform read/list/search or modify operations. Results are emitted as JSON, enabling composable pipelines; authentication is handled via OAuth (gog login) and credentials can be stored securely with a file-based keyring or vault-based management.

When to Use It

  • Automate Gmail tasks like search, read, and retrieving thread details
  • Create, update, or list calendar events without opening the UI
  • Upload, download, search, and share Drive files in automated flows
  • Create or read Google Docs, Slides, and Sheets in pipelines
  • Orchestrate cross-service Google Workspace automations using JSON-first pipelines

Quick Start

  1. Step 1: gog auth status
  2. Step 2: gog gmail search "is:unread" --max 5 --json --no-input
  3. Step 3: gog gmail thread get THREAD_ID --json --no-input

Best Practices

  • Use --json --no-input for read/list/search operations to keep outputs machine-friendly
  • For state-changing actions, start with --dry-run and obtain explicit user approval before execution
  • Secure credentials with GOG_KEYRING_PASSWORD; prefer vault-based or secret-manager options
  • Test changes in a sandbox and consult the UPDATE guides when upgrading
  • Follow the decision tree and use the corresponding gog subcommands (gmail, calendar, drive, docs, slides, sheets, etc.)

Example Use Cases

  • Read unread Gmail messages and fetch the first thread
  • Search Gmail for specific labels and extract thread IDs for processing
  • List upcoming calendar events or create a new event programmatically
  • Upload a file to Drive and configure sharing permissions
  • Create or read a Google Doc/Sheet/Slide as part of an automated workflow

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers