Send email from Claude Code in one line, and let it read the replies
One command adds SendRaven to Claude Code. Verify a domain, send, and when the reply comes back, ask what is waiting. Then give the agent a key it cannot hurt you with.
Claude Code can send email once it has an MCP server that speaks to an email API. Most of them stop there: the agent can send, and that is all. This is the setup for one that can also read what comes back, and that you can put limits on.
Ten minutes, start to finish, and the only thing you type by hand is one command.
1. Add the server
claude mcp add --transport http sendraven https://mcp.sendraven.ai/mcp
That is the remote server. The first tool call opens a browser, you sign in to SendRaven and pick a workspace, and the client holds a token scoped to what you granted. Nothing to install, no key to paste.
If you would rather run it as a local process, or you are configuring an agent that runs unattended, the same server is on npm:
claude mcp add sendraven -e SENDRAVEN_API_KEY=sk_live_… -- npx -y @sendraven/mcp
For Cursor or Claude Desktop, the JSON is the usual shape with "url": "https://mcp.sendraven.ai/mcp".
2. Verify a domain
Sending needs a domain you control. In a Claude Code session:
Add acme.com as a sending domain and tell me which DNS records to publish.
Claude calls add_sending_domain. One domain gives you two sending identities, mail.acme.com for transactional and news.acme.com for campaigns, each with its own reputation, so a newsletter can never hurt a password reset. The response lists the records. Publish them, then:
Check whether acme.com is verified yet.
verify_sending_domain re-checks the records and says exactly which one is still missing, if any. Verification usually lands within minutes of the records propagating.
3. Send
Email maya@acme.com from hi@mail.acme.com with the subject "Welcome" and a two-line hello.
Claude calls send_email. If you use templates, send_template_email takes a template slug and variables; values are HTML-escaped on substitution, so a name like <script> cannot rewrite the message around it, and a missing variable fails loudly rather than mailing {{name}} to a customer.
Scheduling is in plain words: "in 3 days" works as scheduled_at.
4. Read the reply
Maya writes back. Ask:
What replies are waiting on me?
Claude calls list_threads with awaiting_reply: true, then get_thread for the one you care about. The reply is joined to the message it answers on the Message-ID header, the quoted history is stripped, and the message carries SPF and DKIM verdicts so a forged sender is treated as untrusted input rather than instructions.
Reply to Maya that the PDF is attached, and attach it.
reply_to_message sets the threading headers so her mail client shows one conversation.
5. Give the agent a key it cannot hurt you with
The setup above ran on your own sign-in, which is fine for a session you are watching. An agent running on its own should hold a key with limits on it. In the dashboard under Developers, create a key and set three things:
daily_send_limit, a hard ceiling per UTC day. A send that would cross it is refused whole.allowed_recipients, exact addresses or whole domains such as@acme.com. A misdirected send gets a clearrecipient_not_allowedrather than an ambiguous quota error.requires_approval, which turns every send into a draft. The agent getspending_approvalback; a person releases or rejects it from the approvals queue. The tool descriptions tell the model this is not an error and not something to retry.
These live on the key rather than the workspace because a workspace quota trips after an agent has already mailed thousands of people. A key limit trips before. Both the daily cap and the hold apply to scheduled sends too, so an agent cannot walk around either by asking for "in one minute."
Then point the server at that key instead of your sign-in, and the agent can reach exactly what the key can reach and nothing more.
What you have at the end
A Claude Code session that can send from your domain, read the replies as threads, and answer "what is waiting on me" in one call. And a credential you handed to an agent with a cap, an allowlist, and a person between the draft and the send.
The whole tool list, with the three behaviours worth knowing, is on the MCP page. The API underneath is documented at /docs, and the orientation a model reads before it has a key is at /llms.txt.