Skip to content
AI & Agents
Skill

/google-workspace

Access Google Workspace APIs (Drive, Docs, Calendar, Gmail, Sheets, Slides, Chat, People) via local helper scripts without MCP. Handles OAuth login and direct API calls.

BOOST
From plugin
agent-stuff
3.2k18 skills1 command
Install
$ npx -y skills add mitsuhiko/agent-stuff --skill google-workspace --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/google-workspace

Context preview

The summary Claude sees to decide when to auto-load this skill.

Access Google Workspace APIs (Drive, Docs, Calendar, Gmail, Sheets, Slides, Chat, People) via local helper scripts without MCP. Handles OAuth login and direct API calls.

SKILL.md

google-workspace.SKILL.md
name: google-workspace
description: "Access Google Workspace APIs (Drive, Docs, Calendar, Gmail, Sheets, Slides, Chat, People) via local helper scripts without MCP. Handles OAuth login and direct API calls."

Google Workspace

Use this skill for Google Workspace tasks (Gmail, Drive, Calendar, Docs, Sheets, etc.).

Files

  • `scripts/auth.js` — OAuth login/status/clear + account enumeration
  • `scripts/workspace.js` — JavaScript execution based API runner

Account model (multi-account)

This skill is **profile-based by email address**.

  • There is **no default account**.
  • Every API call must specify `--email <account@example.com>`.
  • Tokens are stored per-email under `~/.pi/google-workspace/tokens/`.

Before running API calls, discover available signed-in accounts:

node scripts/auth.js accounts

Usage

Always use `exec` and always provide `--email`.

node scripts/workspace.js exec --email user@example.com <<'JS'
const me = await workspace.whoAmI();
const files = await workspace.call('drive', 'files.list', {
  pageSize: 5,
  fields: 'files(id,name,mimeType)',
});
return { me, files: files.files };
JS

Available inside exec scripts:

  • `auth` (authorized OAuth client)
  • `google` (`googleapis` root)
  • `workspace.accountEmail` (selected profile email)
  • `workspace.call(service, methodPath, params, {version})`
  • `workspace.service(service, {version})`
  • `workspace.whoAmI()`

Optional flags:

  • `--timeout <ms>` (default 30000, max 300000)
  • `--scopes s1,s2`
  • `--script 'return 42'`

Agent guidance

1. Prefer one `exec` script per user request. 2. Keep payloads small (`fields`, `maxResults`, minimal props). 3. Use `Promise.all` for independent requests. 4. Never print token contents. 5. If the user did not specify an account, run `node scripts/auth.js accounts` and choose/confirm an explicit email. 6. If auth fails, first run `node scripts/auth.js accounts` to see known profiles. 7. If account mismatch is possible, run `workspace.whoAmI()` in the selected profile. 8. On 401/403/unauthorized errors, switch account (`--email ...`) or re-login that specific profile.

Unauthorized/account-switch playbook

If a request fails with unauthorized/forbidden/insufficient permissions:

1. Enumerate profiles:

node scripts/auth.js accounts

2. Retry with the intended account:

node scripts/workspace.js exec --email correct-user@example.com <<'JS'
return await workspace.whoAmI();
JS

3. If token is stale or missing scopes, re-login that account:

node scripts/auth.js login --email correct-user@example.com

4. Retry the original request with the same `--email`.

Short Gmail counting example

node scripts/workspace.js exec --email user@example.com <<'JS'
const gmail = google.gmail({ version: 'v1', auth });

let trash = 0;
let pageToken;
do {
  const res = await gmail.users.messages.list({
    userId: 'me',
    q: 'in:trash',
    maxResults: 500,
    pageToken,
    fields: 'messages/id,nextPageToken',
  });
  trash += (res.data.messages || []).length;
  pageToken = res.data.nextPageToken;
} while (pageToken);

return { currentlyInTrash: trash };
JS

Setup + auth

node scripts/auth.js login --email user@example.com

Notes:

  • Dependencies auto-install on first run.
  • Default auth mode is **cloud** (no local `credentials.json` needed).
  • Optional local mode: `GOOGLE_WORKSPACE_AUTH_MODE=local` and credentials at `~/.pi/google-workspace/credentials.json`.
  • Useful diagnostics:
node scripts/auth.js accounts
node scripts/auth.js status --email user@example.com
node scripts/auth.js clear --email user@example.com
Read more
Ships withagent-stuff

Armin's personal Pi Coding Agent package: reusable skills, extensions, prompt commands, themes, and a few supporting utilities that I use across projects. The package is published to npm as mitsupi.

Get the whole plugin
Stats
3,177
Stars
229
Forks
Active
Maintenance
TypeScript
Language
Apache-2.0
License
10d ago
Last commit
11mo ago
Created
9h ago
Added

Repo: mitsuhiko/agent-stuff

Other skills on agent-stuff.