@sendraven/mcp
The SendRaven MCP server. Send email, read replies as threads, run campaigns and automations, and decide approvals, from any client that speaks the Model Context Protocol.
SendRaven is email infrastructure for AI agents. Agents use it over REST or MCP to run real email conversations: sending, reading replies as threads, and running campaigns and automations, within limits and approvals set on the API key. It is priced per email sent, never per contact.
Install
Claude Code, remote server, signs in with OAuth on first use:
claude mcp add --transport http sendraven https://mcp.sendraven.ai/mcp
Cursor, Claude Desktop, and other clients with a JSON config:
{
"mcpServers": {
"sendraven": {
"url": "https://mcp.sendraven.ai/mcp"
}
}
}
Any client, as a local process. Create an API key under Developers in the dashboard, then:
claude mcp add sendraven -e SENDRAVEN_API_KEY=sk_live_… -- npx -y @sendraven/mcp
{
"mcpServers": {
"sendraven": {
"command": "npx",
"args": ["-y", "@sendraven/mcp"],
"env": { "SENDRAVEN_API_KEY": "sk_live_…" }
}
}
}
Remote server with a key instead of OAuth, for an agent running unattended:
{
"mcpServers": {
"sendraven": {
"url": "https://mcp.sendraven.ai/mcp",
"headers": { "Authorization": "Bearer sk_live_…" }
}
}
}
Give an agent's key a daily send limit, a recipient allowlist, or an approval hold. The tools respect all three, campaigns included: a key with an approval hold or an allowlist cannot start a campaign, and a key with a daily limit can start one only if its recipients fit what is left of the day. See Limits for agents.
Behaviour worth knowing
- A held send is not a failure. When a key requires approval,
send_emailreturnspending_approvalwith an id. Report that it awaits a person; do not retry. - Out of plan is 402, not 429.
get_usagereports plan, usage and remaining, so an agent can say "you are near your limit" before a batch. - Two calls cannot be undone.
send_broadcastmails an audience; runpreview_broadcastfirst.remove_suppressionlets us mail an address that bounced or complained. Neither is a way to fix a failed send. - Approvals are decided by a person.
decide_approvalanswers 403 when the client signed in with OAuth, when the key drafted the message, and when the key has any guardrail. Use the dashboard, or a key without guardrails. - Retry sends with the same
idempotency_key, and only for the identical message. A retry replays the first answer instead of sending twice; the same key with different arguments is refused withidempotency_key_reusedand nothing is sent. - A failed call returns the API's own message with its HTTP status and error
type, so "No verified transactional sending domain for …" comes back as
those words with
HTTP 422 no_verified_identity, and a missing template variable lists the names inmissing. Types mean the same thing on every tool; see Errors.
Tools
56 tools, generated from the server's registry.
Environment
The server holds no database or provider credentials of its own. It is a proxy over the public REST API and can reach exactly what the caller's key can reach.
Links
License
MIT. Copyright Common Ninja Ltd.