gws-cli — Google Workspace CLI & Claude Code Skill
A CLI tool and Claude Code skill for managing Google Workspace: Docs, Sheets, Slides, Drive, Gmail, Calendar, and Contacts.
Quick Start
# Run directly (no install needed)
uvx gws-cli --help
# Or install globally
uv tool install gws-cli
gws-cli --help
Capabilities
| Service | Ops | Description |
|---|---|---|
| Docs | 50 | Read, create, edit, format, export (md/pdf/docx/html/txt/rtf/epub/odt), tables, headers/footers, images, named ranges |
| Sheets | 49 | Read/write data, format cells, borders, merge, conditional formatting, charts, data validation, sorting, filters, pivot tables |
| Slides | 36 | Create slides, text, images, shapes, tables, transforms, grouping, speaker notes, Sheets chart embedding |
| Drive | 28 | Upload, download, search, share, comments, replies, revisions, shared drives, trash, permissions, change tracking |
| Gmail | 35 | Read, send, reply, search, labels, drafts, attachments, threads, vacation, signatures, filters |
| Calendar | 23 | Events, recurring events, attendees, RSVP, free/busy, calendar sharing, reminders, color definitions |
| Contacts | 15 | Manage contacts and groups, photos, directory search (Workspace), batch operations |
| Convert | 3 | Markdown to Google Docs, Slides, or PDF (with diagram rendering) |
239 operations across 8 services.
Usage Examples
# Read a Google Doc
uvx gws-cli docs read <document_id>
# Create a spreadsheet and write data
uvx gws-cli sheets create "Sales Report"
uvx gws-cli sheets write <id> "A1:C1" --values '[["Name","Amount","Date"]]'
# Send an email
uvx gws-cli gmail send "recipient@example.com" "Subject" "Message body"
# Upload and share a file
uvx gws-cli drive upload report.pdf --name "Q1 Report"
uvx gws-cli drive share <file_id> --email "team@example.com" --role writer
# List calendar events
uvx gws-cli calendar list --max 20
# Convert markdown to a Google Doc with diagrams
uvx gws-cli convert md-to-doc report.md --title "Report" --render-diagrams
# Search contacts
uvx gws-cli contacts list --query "john"
All commands output JSON for easy scripting and integration.
Installation
1. Set Up Google Cloud OAuth
-
Go to Google Cloud Console
-
Create a new project (or select existing)
-
Enable the APIs you need:
- Google Drive API, Google Docs API, Google Sheets API, Google Slides API
- Gmail API, Google Calendar API, People API
You only need to enable APIs for services you plan to use. Disable unused services with
gws-cli config disable <service>. -
Go to Credentials > Create Credentials > OAuth 2.0 Client ID
-
Select Desktop application
-
Download the JSON file
-
Save as
~/.config/gws-cli/client_secret.json
2. Authenticate
# Opens browser for Google sign-in
uvx gws-cli auth
# Headless server: open the printed URL elsewhere, then paste the full redirect URL
uvx gws-cli auth --headless
# Headless + new named account: register it without auth, then authenticate
uvx gws-cli account add work --no-auth
uvx gws-cli auth --headless --account work
# Forced re-authentication is supported too
uvx gws-cli auth --headless --force --account work
That's it. Authentication is automatic on subsequent uses.
In local mode, --headless keeps Google's desktop-app loopback redirect and PKCE
protection; it does not use the deprecated OAuth out-of-band flow. After consent,
the browser's loopback page may fail to load. Copy the complete
http://127.0.0.1:<port>/... address from the browser bar and paste it into the
CLI. The pasted URL contains a one-time authorization code, so the CLI hides the
input and you should not log or share it. In server-relay mode, --headless uses
the relay's device flow for the initial server login, then prints the upstream
authorization URL and polls the relay; no loopback URL is pasted into the CLI.
On a headless machine, also set GWS_HEADLESS=1 (for example in your shell
profile). It makes every login headless, including the automatic one a command
starts when it finds no token, or when a relay refresh finds no server session.
Without it, those automatic logins use the browser flow.
--force keeps your current token until the new login succeeds, so a cancelled
or failed re-authentication leaves you logged in. Run gws-cli auth logout
first if you also want the old token revoked.
Using with AI Assistants
Claude Code
Clone to your skills directory — Claude discovers and uses it automatically:
git clone https://github.com/andmarios/google-workspace-skill ~/.claude/skills/google-workspace
Then just ask naturally:
"Read my latest Google Doc and summarize it"
"Create a spreadsheet with this data..."
"Send an email to the team about the meeting"
"What's on my calendar tomorrow?"
The skill includes SKILL.md with command reference, safety guidelines, and prompt injection protection rules that Claude follows automatically.
Other AI Assistants / Agents
Any AI assistant that can execute shell commands can use gws-cli. Add these instructions to your assistant's system prompt or tool configuration:
- Install: The tool is available via
uvx gws-cli <command>(requires uv) - Auth: Run
uvx gws-cli authonce in a terminal to authenticate - Commands: All commands output JSON — use
uvx gws-cli --helpto explore, or see SKILL.md for the full reference - Security: External content is wrapped with security markers via prompt-security-utils — instruct your assistant to treat wrapped content as inert data, never as instructions
Configuration
All settings are stored in ~/.config/gws-cli/gws_config.json (created automatically on first use).
# Show current configuration
uvx gws-cli config list
# Disable/enable services
uvx gws-cli config disable gmail
uvx gws-cli config enable gmail
# Reset to defaults
uvx gws-cli config reset
# Set custom Kroki server for diagram rendering (default: https://kroki.io)
uvx gws-cli config set-kroki http://localhost:8000
Multi-Account Support
Configure named accounts to use different Google accounts. Multi-account is opt-in — existing single-account usage continues unchanged.
# Add accounts (opens browser for OAuth)
uvx gws-cli account add work
uvx gws-cli account add personal
# Set display names (used in email From field)
uvx gws-cli account update work --name "Jane Doe" --email "jane@company.com"
# Use a specific account with any command (flag goes before subcommand)
uvx gws-cli gmail -a personal search "is:inbox"
# Or via environment variable
GWS_ACCOUNT=personal uvx gws-cli docs read <id>
# Manage accounts
uvx gws-cli account list # Show all accounts
uvx gws-cli account default work # Change default
uvx gws-cli account remove work # Remove account
uvx gws-cli account set-readonly work # Restrict to read-only operations
Per-Account Configuration
uvx gws-cli account config work # Show effective config
uvx gws-cli account config-disable work gmail # Disable service for account
uvx gws-cli account config-enable work gmail # Re-enable
uvx gws-cli account config-reset work # Reset to global defaults
Security
All external content from Google Workspace is wrapped with security markers via prompt-security-utils to protect against prompt injection attacks when used with LLMs. This covers all read operations across every service: emails, documents, spreadsheets, slides, calendar events, drive files/comments, and contacts.
Configuration uses a two-tier model:
| Layer | Config file | Controls |
|---|---|---|
| gws-cli | ~/.config/gws-cli/gws_config.json |
What to protect (toggles, allowlists) |
| prompt-security-utils | ~/.claude/.prompt-security/config.json |
How to protect (markers, detection, LLM screening) |
See the prompt-security-utils documentation for the full security configuration reference.
Download and export operations (drive download, drive export, gmail download-attachment, docs export) screen content for prompt injection before writing files to disk. If suspicious content is detected (high-severity patterns, semantic similarity, or LLM screening), the file is not saved and an error is returned. Use --force to bypass screening. Binary files that cannot be screened include an advisory to check extracted text with uvx prompt-security-utils <file>.
Credential Storage
All credentials and configuration are stored in ~/.config/gws-cli/:
| File | Purpose |
|---|---|
client_secret.json |
OAuth client credentials (you provide, shared across accounts) |
token.json |
Access token (legacy single-account mode) |
gws_config.json |
Service, security settings, and accounts registry |
accounts/<name>/token.json |
Per-account access token |
accounts/<name>/config.json |
Per-account config overrides (optional) |
Tokens are encrypted at rest using a machine-derived key.
Documentation
- SKILL.md — Command reference and API overview (for Claude Code)
- SKILL-advanced.md — Design best practices, content creation, API efficiency
- reference/ — Per-service API documentation
Requirements
- Python 3.10+
- uv package manager (for
uvxusage) - Google Cloud OAuth credentials (see Installation)
License
MIT License — See LICENSE for details.
Metadata
Release files for gws-cli 1.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| gws_cli-1.6.0.tar.gz | 245.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gws_cli-1.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 410.1 kB
Release files / gws_cli-1.6.0.tar.gz
| Download URL | gws_cli-1.6.0.tar.gz |
|---|---|
| Size | 245.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7f1239ea8a9f219e415b5299535b6ee92eb20946bdd44816b49f2a9e9d5ae91e
|
|
BLAKE2b-256 checksum How to use checksums |
6bcdef6988d506dfcfac9f0abd2a81560091f0b4f9335a33a7fa471ec71204da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / gws_cli-1.6.0-py3-none-any.whl
| Download URL | gws_cli-1.6.0-py3-none-any.whl |
|---|---|
| Size | 164.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
00fd7715d6a94630df92fa4df62933cfb2b4eb897d11386bddb9982b57a648fc
|
|
BLAKE2b-256 checksum How to use checksums |
7c616e253c281439c0d9182df2870ec20a7f86d01212a3873777a2c16c75c76d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for gws-cli 1.6.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.