Learn-skills.dev gmail-label
Auto-label Gmail emails into Action Required, Waiting On, and Reference categories. Use when user asks to label emails, triage inbox, categorize emails, or organize Gmail.
git clone https://github.com/NeverSight/learn-skills.dev
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/aiagentwithdhruv/skills/gmail-label" ~/.claude/skills/neversight-learn-skills-dev-gmail-label && rm -rf "$T"
data/skills-md/aiagentwithdhruv/skills/gmail-label/SKILL.mdGmail Auto-Label
Goal
Fetch inbox emails, classify them via parallel subagents into Action Required / Waiting On / Reference, and apply labels in bulk via Gmail API.
Scripts
- Fetch email summaries as compact JSON./scripts/gmail_label_fetch.py
- Split emails into N chunks for parallel classification./scripts/gmail_label_split.py
- Merge classified chunks into single labels.json./scripts/gmail_label_merge.py
- Apply label classifications in bulk./scripts/gmail_label_apply.py
Subagent
— defined inemail-classifier.claude/agents/email-classifier.md- Model: Sonnet 4.5 (fast, cost-efficient classification)
- Each subagent reads one chunk, writes one classified output file
Flow (Parallel — default)
Step 1: Fetch emails
python3 .claude/skills/gmail-label/scripts/gmail_label_fetch.py \ --account ACCOUNT --query "in:inbox" --limit 100 --output .tmp/emails.json
Step 2: Split into chunks
python3 .claude/skills/gmail-label/scripts/gmail_label_split.py \ --input .tmp/emails.json --chunks 10 --output-dir .tmp/chunks
Step 3: Classify in parallel (spawn 10 subagents)
Spawn 10
email-classifier subagents in background, one per chunk. Each subagent:
- Reads
.tmp/chunks/chunk_N.json - Classifies each email
- Writes
.tmp/chunks/classified_N.json
Use the Task tool with
run_in_background: true and model: "sonnet". Launch ALL 10 in a single message for true parallelism:
For each chunk 0-9, spawn a Task with: subagent_type: "email-classifier" model: "sonnet" run_in_background: true prompt: "Read /absolute/path/.tmp/chunks/chunk_N.json, classify each email, write results to /absolute/path/.tmp/chunks/classified_N.json"
CRITICAL: Do NOT use TaskOutput to read subagent results. The subagents write their results to files — the main agent never needs to see the classification data. Reading TaskOutput will flood the context window and cause "prompt too long" errors with large batches (500+ emails).
Instead, poll for file existence:
# Wait until all classified files exist (timeout after 120s) for i in $(seq 0 9); do while [ ! -f ".tmp/chunks/classified_$i.json" ]; do sleep 2; done done
Then proceed directly to Step 4 (merge).
Step 4: Merge classifications
python3 .claude/skills/gmail-label/scripts/gmail_label_merge.py \ --input-dir .tmp/chunks --output .tmp/labels.json
Step 5: Apply labels
python3 .claude/skills/gmail-label/scripts/gmail_label_apply.py \ --account ACCOUNT --input .tmp/labels.json
Classification Guidelines
Action Required:
- Security alerts that need verification
- Expiring credit cards / domain renewals with deadlines
- Slack @mentions asking questions
- New team members to greet (Slack join notifications)
- Client emails needing response
- Business listing updates (Google Business Profile, Bing Places)
- Stripe action-required notices
Waiting On:
- Outbound sales emails awaiting reply
- Support tickets awaiting resolution
- Proposals sent, pending response
Reference:
- Marketing newsletters (DigitalMarketer, etc.)
- Charity/nonprofit newsletters (RAPS, etc.)
- Google Business Profile performance reports
- Promotional offers (Blinkist, sales, etc.)
- Platform update notifications (Google Play, Apify, etc.)
- Confirmation codes (already used)
- Real estate newsletters (Westbank, etc.)
- Gaming account emails (Riot Games, etc.)
- Informational security alerts (2FA turned on, etc.)
- Health advisories
- Legal/policy update notices
Account Registry
Accounts are stored in
gmail_accounts.json at workspace root. Each account needs:
- Gmail addressemail
- Path to OAuth tokentoken_file
Adding New Accounts
python3 .claude/skills/gmail-inbox/scripts/gmail_multi_auth.py --account ACCOUNT_NAME --email EMAIL
Performance
- Serial flow: ~36s for 100 emails (fetch 1s + classify 34s + apply 1s)
- Parallel flow: ~30s for 100 emails (classify 19s + merge <1s + apply ~10s)
- Classification is the bottleneck; 10 parallel subagents cut it from 34s to 19s (~1.8x speedup)
- Agent startup overhead (~4s stagger) limits theoretical gains
- Apply step may vary due to Gmail API throttling
Schema
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| string | Yes | Gmail account name from registry |
| string | No | Gmail search query (default: 'in:inbox') |
| integer | No | Max emails to classify (default: 100) |
| integer | No | Parallel classification chunks (default: 10) |
Outputs
| Name | Type | Description |
|---|---|---|
| object | Count per category: Action Required, Waiting On, Reference |
Credentials
| Name | Source |
|---|---|
| file |
| file (auto-generated) |
Composable With
Skills that chain well with this one:
gmail-inbox
Cost
Claude Sonnet API for classification