| name | batch-send-drafts |
| description | 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. |
| version | 1.0.0 |
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.
<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>
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]"
}
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)