direct-integrations

Query Gmail, Google Calendar, Asana, Slack, Google Sheets, Google Docs, and Google Drive directly via Python APIs. Use when the user asks to check email, view calendar, list tasks, check Slack message

SKILL.md

GitHub

Direct Platform Integrations

Query Gmail, Calendar, Asana, Slack, Sheets, Docs, and Drive directly — no Zapier/MCP needed.

Canonical action policy lives in .claude/scripts/integrations/capabilities.py. Wrapper commands validate against that policy before running. Mutating actions such as Slack send, Sheets write/append, and Asana task changes are operator-confirmed surfaces, not ambient model-facing reads.

Script Path

.claude/skills/direct-integrations/scripts/query.py

Running Commands

# Gmail
python .claude/skills/direct-integrations/scripts/query.py gmail list [--max N] [--query Q] [--unread] [--hours N]
python .claude/skills/direct-integrations/scripts/query.py gmail urgent [--hours N]
python .claude/skills/direct-integrations/scripts/query.py gmail unread
python .claude/skills/direct-integrations/scripts/query.py gmail read <message_id>

# Calendar
python .claude/skills/direct-integrations/scripts/query.py calendar today
python .claude/skills/direct-integrations/scripts/query.py calendar upcoming [--hours N]
python .claude/skills/direct-integrations/scripts/query.py calendar soon

# Asana
python .claude/skills/direct-integrations/scripts/query.py asana my-tasks [--max N]
python .claude/skills/direct-integrations/scripts/query.py asana project [project_id] [--max N]
python .claude/skills/direct-integrations/scripts/query.py asana overdue
python .claude/skills/direct-integrations/scripts/query.py asana due-soon [--days N]

# Slack
python .claude/skills/direct-integrations/scripts/query.py slack channels
python .claude/skills/direct-integrations/scripts/query.py slack messages <channel> [--hours N]
python .claude/skills/direct-integrations/scripts/query.py slack send <channel> <message>
python .claude/skills/direct-integrations/scripts/query.py slack check

# Google Sheets
python .claude/skills/direct-integrations/scripts/query.py sheets read <spreadsheet_id> [--range "Sheet1!A1:Z100"] [--max-rows N]
python .claude/skills/direct-integrations/scripts/query.py sheets info <spreadsheet_id>
python .claude/skills/direct-integrations/scripts/query.py sheets write <spreadsheet_id> --range "A1" --values '[["a","b"]]'
python .claude/skills/direct-integrations/scripts/query.py sheets append <spreadsheet_id> --range "A:Z" --values '[["new","row"]]'

# Google Docs
python .claude/skills/direct-integrations/scripts/query.py docs read <document_id> [--max-chars N]
python .claude/skills/direct-integrations/scripts/query.py docs info <document_id>

# Google Drive
python .claude/skills/direct-integrations/scripts/query.py drive find "search term" [--type spreadsheet|document|folder|presentation|pdf] [--max N]
python .claude/skills/direct-integrations/scripts/query.py drive list [--type TYPE] [--max N]
python .claude/skills/direct-integrations/scripts/query.py drive get <file_id>

Setup

If integrations aren't configured yet:

cd .claude/scripts && uv run python setup_auth.py --check

Notes

  • Gmail + Calendar + Sheets + Docs + Drive share a single Google OAuth token.
  • Gmail reads are model-facing; Gmail archive exists for cleanup paths and is policy-gated as an operator/internal mutator.
  • Sheets has policy-gated read/write access; Docs and Drive are read-only in this wrapper.
  • Asana uses Personal Access Token from .env
  • Slack uses Bot Token from .env
  • Use drive find to locate file IDs by name, then pass to sheets read or docs read