batch-send-drafts

v2026.09.24

Review and batch-send staged Gmail BDR outreach drafts. Lists all queued drafts, shows a prioritized review table (recipient / subject / vertical), and generates one-click Gmail send links so Tim can flush the outreach queue in under 2 minutes. Trigger: send staged drafts, flush draft queue, batch send drafts, review my drafts, what drafts do I have.

GitHub
Install command
npx skhub add scientiacapital/batch-send-drafts
Markdown
SKILL.md
<objective> Surface all staged Gmail outreach drafts for review, group them by vertical/priority, and produce a one-click send link per draft — so Tim can review and flush the entire queue without hunting through Gmail. The Gmail MCP has no send tool; the bottleneck is knowing WHICH to send and in what order, not the click itself. </objective>

<quick_start> Trigger: "send staged drafts" / "flush draft queue" / "batch send drafts" / "review my drafts" From address: tkipper@epiphan.com (always filter to this sender) Output: Numbered review table + one Gmail link per draft → Tim clicks Send in browser MCP tools: list_drafts → search_threads (for recipient enrichment if needed) </quick_start>

<success_criteria>

  • All drafts from tkipper@epiphan.com fetched and displayed
  • Table shows: # / Recipient / Subject / Vertical / Touch # / Draft Age
  • Drafts prioritized: ATL contacts first, then by age (oldest first)
  • One-click Gmail link per draft: https://mail.google.com/mail/u/0/#drafts
  • Tim approves subset → links open, Tim sends in browser (one tab per draft)
  • Outcome sidecar written with count queued / count confirmed for send </success_criteria>
<workflow>

Stage 1: Fetch all staged drafts

MCP tool: mcp__claude_ai_Gmail__list_drafts

Call with no filter first to get the full list. If the result is large (>50 drafts), call mcp__claude_ai_Gmail__search_threads with query from:tkipper@epiphan.com in:drafts to narrow to BDR outreach.

For each draft, extract:

  • id — the Gmail draft ID (used to build the send link)
  • message.payload.headers — scan for To, Subject
  • message.internalDate or message.payload.headers.Date — draft age
  • message.snippet — first 100 chars of body (vertical clue)

If list_drafts returns minimal header data, call mcp__claude_ai_Gmail__get_thread on the threadId of each draft to get full headers.

Stage 2: Enrich + classify

For each draft:

Vertical detection (from subject line + snippet, no extra API calls):

  • edu / university / college / higher ed → Higher Ed
  • court / judicial / clerk → Courts
  • city / county / government / municipality → Government
  • hospital / health / medical / surgical → Healthcare
  • church / worship / pastor → Worship
  • everything else → Corporate / Other

ATL signal (from subject or recipient name if available):

  • Title keywords: Director, VP, CIO, Dean, Provost, Superintendent → ATL ★
  • No title info → Unknown (treat as GRAY)

Touch number (from subject line patterns):

  • RE: prefix or [2] / [3] / FU / follow → follow-up touch
  • No prefix → Touch 1 (cold)

Draft age: days since internalDate. Flag drafts >7 days old with ⚠️ (stale, recipient context may have changed).

Stage 3: Present review table

Sort order: ATL first → then by draft age DESC (oldest first, they've been waiting longest).

Present as a clean numbered table:

STAGED OUTREACH DRAFTS — <date> (<N> total)
──────────────────────────────────────────────────────────────────
 #  Recipient                Subject                    Vertical    Age   ATL?
──────────────────────────────────────────────────────────────────
 1  Dr. Smith (dean@u.edu)   [Pearl Mini] Lecture cap…  Higher Ed   3d    ★
 2  J. Johnson (jj@city.gov) Following up on Nexus…     Gov         1d    ★
 3  T. Nguyen (t@hosp.org)   Epiphan for OR suites…     Healthcare  5d ⚠️ ?
 4  …
──────────────────────────────────────────────────────────────────
<N> drafts ready. Which to send? (e.g. "all", "1-3", "1 3 5", "skip 3")

Ask Tim: "Which drafts to send?"

Accepted responses:

  • all → confirm full list
  • 1-4 → range
  • 1 3 5 → specific numbers
  • skip 2 → all except
  • draft number alone → just that one
  • none / cancel → exit without sending

Stage 4: Generate send links

For each confirmed draft, build the Gmail URL:

https://mail.google.com/mail/u/0/#drafts/<DRAFT_ID>

where <DRAFT_ID> is the id from the list_drafts response.

Output format:

READY TO SEND — open each link, review, click Send:

 1. Dr. Smith — [Pearl Mini] Lecture cap…
    → https://mail.google.com/mail/u/0/#drafts/18f3a...

 2. J. Johnson — Following up on Nexus…
    → https://mail.google.com/mail/u/0/#drafts/18f4b...

 3. T. Nguyen — Epiphan for OR suites…
    → https://mail.google.com/mail/u/0/#drafts/18f5c...

Open all <N> in tabs? Run: ! open -a "Google Chrome" "<url1>" "<url2>" ...
(Or cmd+click each link above.)

Also offer the one-liner open command so Tim can pop all selected drafts into Chrome tabs simultaneously:

! open -a "Google Chrome" "https://mail.google.com/mail/u/0/#drafts/ID1" "https://mail.google.com/mail/u/0/#drafts/ID2" ...

Why not auto-send? The Gmail MCP exposes list/create/label but no send tool. A GCP project + Gmail API OAuth would enable programmatic send — flag in BACKLOG if Tim wants full automation later.

Stage 5: Emit outcome sidecar

Write ~/.claude/skill-analytics/last-outcome-batch-send-drafts.json:

{
  "ts": "[UTC ISO8601]",
  "skill": "batch-send-drafts",
  "version": "1.0.0",
  "variant": "default",
  "status": "[success|partial|error]",
  "runtime_ms": "[est ms]",
  "metrics": {
    "drafts_found": "[n]",
    "drafts_confirmed_for_send": "[n]",
    "atl_count": "[n]",
    "stale_count": "[n]",
    "verticals": {"higher_ed": 0, "courts": 0, "gov": 0, "healthcare": 0, "other": 0}
  },
  "error": null,
  "session_id": "[YYYY-MM-DD]"
}
</workflow>

Known limitation + upgrade path

Current: Tim clicks Send in browser (one tab per draft, ~5 sec each). Full automation requires: GCP project → Gmail API enabled → gws auth setup --project <id> --login → then gws mail send <draft_id> per draft. See BACKLOG.md.

Skill metadata

Version: 1.0.0 · Status: v1 (review + link; manual send) · Author: Tim Kipper Integration: Gmail MCP (list_drafts, search_threads, get_thread) Tier: P1 (BDR Core) · Triggers: Manual ("send staged drafts", "flush draft queue") Feeds: outreach pipeline; complements morning-brief (draft count awareness)

Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

Not specified

Source path

active/batch-send-drafts-skill

Default branch

main

Latest commit

9e03af3

Tree SHA

5b28287