Agent 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.
Install this agent skill to your Project
npx add-skill https://github.com/gmcabrita/dotfiles/tree/main/.agents/skills/google-workspace
SKILL.md
Google Workspace
Use this skill for Google Workspace tasks (Gmail, Drive, Calendar, Docs, Sheets, etc.).
Files
scripts/auth.js— OAuth login/status/clear + account enumerationscripts/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(googleapisroot)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
- Prefer one
execscript per user request. - Keep payloads small (
fields,maxResults, minimal props). - Use
Promise.allfor independent requests. - Never print token contents.
- If the user did not specify an account, run
node scripts/auth.js accountsand choose/confirm an explicit email. - If auth fails, first run
node scripts/auth.js accountsto see known profiles. - If account mismatch is possible, run
workspace.whoAmI()in the selected profile. - 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:
- Enumerate profiles:
node scripts/auth.js accounts
- Retry with the intended account:
node scripts/workspace.js exec --email correct-user@example.com <<'JS'
return await workspace.whoAmI();
JS
- If token is stale or missing scopes, re-login that account:
node scripts/auth.js login --email correct-user@example.com
- 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.jsonneeded). - Optional local mode:
GOOGLE_WORKSPACE_AUTH_MODE=localand 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
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
autoresearch-finalize
Finalize an autoresearch session into clean, reviewable branches. Use when asked to "finalize autoresearch", "clean up experiments", or "prepare autoresearch for review".
autoresearch-create
Set up and run an autonomous experiment loop for any optimization target. Gathers what to optimize, then starts the loop immediately. Use when asked to "run autoresearch", "optimize X in a loop", "set up autoresearch for X", or "start experiments".
update-changelog
Read this skill before updating changelogs
web-browser
Allows to interact with web pages by performing actions such as clicking buttons, filling out forms, and navigating links. It works by remote controlling Google Chrome or Chromium browsers using the Chrome DevTools Protocol (CDP). When Claude needs to browse the web, it can use this skill to do so.
summarize
Fetch a URL or convert a local file (PDF/DOCX/HTML/etc.) into Markdown using `uvx markitdown`, optionally it can summarize
commit
Read this skill before making git commits
Didn't find tool you were looking for?