The Build
I built a Claude Code skill that drafts emails in Missive directly from the terminal. No browser tab switching, no copy-pasting into templates, no manual variable filling. You say /missive-draft, point it at a template and a CSV, and it creates personalized drafts in Missive ready for review and send.
The skill fetches canned response templates from Missive's REST API, performs {{ variable }} substitution from CSV data, and creates drafts via POST /v1/drafts. One file. No dependencies. No third-party MCP server sitting between you and your email.
Why This Matters
This is the first piece of a larger pipeline. The next step is connecting Cargo's MCP tools for lead enrichment — find companies, enrich contacts, verify emails — and feeding that directly into Missive drafts. The entire outreach workflow lives in the terminal: identify leads, enrich them, draft personalized emails, review in Missive, send.
The pipeline looks like this:
- Find — Cargo MCP enriches companies and people matching your criteria
- Verify — Cargo verifies email addresses before you waste a draft
- Draft —
/missive-draftcreates personalized emails from templates + enriched data - Review — You check the first few drafts in Missive before greenlighting the batch
- Send — From Missive's UI, on your terms
Every step is auditable. Every draft is reviewable. No emails leave without your explicit approval.
The Security Decision
We evaluated community MCP servers for Missive and rejected them. An MCP server is third-party code that sits between you and your email with your API token. For something that can send emails on your behalf, the trust boundary matters.
Instead: direct REST API calls from the skill, token stored in Claude Code's environment config, no intermediary code. The tradeoff is less abstraction, but the attack surface is just you, curl, and Missive's API.
How It Works
You invoke /missive-draft and provide three things: a template name, recipient data (CSV), and your from address. The skill handles the rest — fetching the template, matching variables, rendering per-recipient, creating drafts in batches with a pause after the first few so you can verify in Missive before continuing.
Templates live in Missive's canned responses. Variables use {{ placeholder }} syntax. Defaults and conditionals are handled in the CSV data itself rather than depending on a Liquid template engine — simpler, no dependencies, and the CSV becomes the single source of truth for what each recipient sees.
