# Sendraven MCP MCP server

Email infrastructure for AI agents: send, read replies as threads, campaigns, per-key limits.

## At a glance

Sendraven MCP is an MCP server in the Marketing & Social category. It runs locally over stdio via `npx -y @sendraven/mcp`, and needs SENDRAVEN_API_KEY. It exposes 63 tools, including send_email, list_emails and get_email. It scores A (82/100) on the MCP Skills Hub health score as of Oct 28, 2026.

## Install

### How to install Sendraven MCP in Claude Code

1. Add the server

```bash
claude mcp add sendraven -e 'SENDRAVEN_API_KEY=<SENDRAVEN_API_KEY>' -- npx -y @sendraven/mcp
```

2. Fill in your credentials

   Replace <SENDRAVEN_API_KEY> with your real value. Keep secrets out of any config file you commit.

3. Verify it's connected

```bash
claude mcp list
```

4. Sharing it with your team?

   Add `--scope project` to write it to .mcp.json in the repository root, which you can commit (with the secrets left as environment variables).

5. Use it in a session

   Ask Claude to use the tools this server exposes (e.g. send_email, list_emails, get_email). It discovers them automatically.

### How to install Sendraven MCP in Claude Desktop

1. Open your MCP config

   macOS: ~/Library/Application Support/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json

2. Add this server

```json
{
  "mcpServers": {
    "sendraven": {
      "command": "npx",
      "args": [
        "-y",
        "@sendraven/mcp"
      ],
      "env": {
        "SENDRAVEN_API_KEY": "<SENDRAVEN_API_KEY>"
      }
    }
  }
}
```

3. Fill in your credentials

   Replace <SENDRAVEN_API_KEY> with your real value. Keep secrets out of any config file you commit.

4. Restart Claude Desktop

   The tools appear under the 🔌 menu once the app reloads.

### How to install Sendraven MCP in Cursor

1. Create / edit .cursor/mcp.json in your project

```json
{
  "mcpServers": {
    "sendraven": {
      "command": "npx",
      "args": [
        "-y",
        "@sendraven/mcp"
      ],
      "env": {
        "SENDRAVEN_API_KEY": "<SENDRAVEN_API_KEY>"
      }
    }
  }
}
```

2. Fill in your credentials

   Replace <SENDRAVEN_API_KEY> with your real value. Keep secrets out of any config file you commit.

3. Enable it

   Cursor Settings → MCP → toggle the server on. Tools become available to the Composer/Agent.

### How to install Sendraven MCP in Codex CLI

1. Add to ~/.codex/config.toml

```toml
[mcp_servers.sendraven]
command = "npx"
args = ["-y", "@sendraven/mcp"]
env = { SENDRAVEN_API_KEY = "<SENDRAVEN_API_KEY>" }
```

2. Fill in your credentials

   Replace <SENDRAVEN_API_KEY> with your real value. Keep secrets out of any config file you commit.

3. Run Codex

   Codex loads MCP servers from config.toml on startup and exposes their tools to the agent.

### How to install Sendraven MCP in Windsurf

1. Edit ~/.codeium/windsurf/mcp_config.json

```json
{
  "mcpServers": {
    "sendraven": {
      "command": "npx",
      "args": [
        "-y",
        "@sendraven/mcp"
      ],
      "env": {
        "SENDRAVEN_API_KEY": "<SENDRAVEN_API_KEY>"
      }
    }
  }
}
```

2. Fill in your credentials

   Replace <SENDRAVEN_API_KEY> with your real value. Keep secrets out of any config file you commit.

3. Reload

   Windsurf → Cascade → refresh MCP servers. Cascade can now call the tools.

### How to install Sendraven MCP in Cline

1. Open Cline → MCP Servers → Configure

   Adds to cline_mcp_settings.json.

2. Add the server

```json
{
  "mcpServers": {
    "sendraven": {
      "command": "npx",
      "args": [
        "-y",
        "@sendraven/mcp"
      ],
      "env": {
        "SENDRAVEN_API_KEY": "<SENDRAVEN_API_KEY>"
      }
    }
  }
}
```

3. Fill in your credentials

   Replace <SENDRAVEN_API_KEY> with your real value. Keep secrets out of any config file you commit.

### How to install Sendraven MCP in VS Code

1. Create .vscode/mcp.json

```json
{
  "servers": {
    "sendraven": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@sendraven/mcp"
      ],
      "env": {
        "SENDRAVEN_API_KEY": "<SENDRAVEN_API_KEY>"
      }
    }
  }
}
```

2. Fill in your credentials

   Replace <SENDRAVEN_API_KEY> with your real value. Keep secrets out of any config file you commit.

3. Start it

   VS Code shows a ▶ Start action above the server entry. Agent mode (Copilot Chat) can then use the tools.

## Tools

- `send_email` — Send a transactional email, immediately or scheduled. scheduled_at takes a relative phrase like 'in 3 days' or an ISO timestamp. The From domain must already be verified. Every accepted send answers with the same fields: id, status, thread_
- `list_emails` — List messages newest first with their delivery status, including held, scheduled, skipped and failed ones and the mail campaigns and automations sent. Filter by status, recipient or tag. Paged: at most 100 per call; while has_more is true, 
- `get_email` — Fetch one message with its full event timeline (send, delivery, bounce, complaint, open, click). The timeline shows why an email didn't arrive.
- `cancel_scheduled_email` — Cancel a scheduled email before it sends. Only works while status is 'scheduled': a message that has already started sending, or is in any other state, answers 409 invalid_state naming its status; a retry answers the same, and get_email sho
- `update_email_tags` — Add or remove tags on an email already sent, scheduled or held, to refile it for the tag filters of list_emails and list_threads. Removals apply first, then additions, so one call swaps a tag: remove_tags [{name:'recovery_case'}] (no value:
- `list_sending_domains` — List sending domains with their verification status and the DNS records each one needs. Each record shows what is currently published, so this diagnoses a stuck verification. mail_from says whether SES has adopted the bounce. subdomain as t
- `add_sending_domain` — Register a sending domain and get back the DNS records to publish. It takes the domain mail is sent from — mail. and news. are provisioned beneath it and the right one is chosen per message, so a marketing complaint spike can never affect p
- `verify_sending_domain` — Re-check a domain's DNS records now instead of waiting for the background monitor. Also restarts bounce-path (mail_from) verification when SES gave up before the MX record existed.
- `set_utm_tags` — Turn UTM tags on or off for a sending domain, and set what they say. When on, every link in that domain's marketing HTML gets utm_source (default 'newsletter'), utm_medium (default 'email') and utm_campaign (the campaign's name or the autom
- `list_suppressions` — List addresses we refuse to mail and why (hard_bounce, complaint, unsubscribe, manual, list_hygiene), newest first, each with its scope. When someone reports not receiving email, this shows whether the address is suppressed. email returns o
- `add_suppression` — Stop sending to an address. Scope 'marketing' leaves transactional mail working; the default is 'all'. Reason 'unsubscribe' is a real opt-out: it also cancels the person's queued scheduled sends and ends their automation enrolments, which i
- `remove_suppression` — Remove a suppression so the address can be mailed again. A hard bounce means the address was rejected by the receiving server, and re-sending raises the bounce rate that AWS enforces on. The scope must match the stored one: removed: false m
- `create_broadcast` — Create a campaign as a draft. Nothing is sent: preview_broadcast reports its reach and send_broadcast sends it. identity_id must be a marketing sending domain (see list_sending_domains; risk_class 'marketing'). topic_key must name an existi
- `get_broadcast` — One campaign, with a 'progress' object while it is sending, paused or testing: how many addresses are still pending, sent, failed, or skipped because the person opted out after the campaign started. This is what tells a paused campaign that
- `list_broadcasts` — List campaigns, newest first, with their status. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page. Each row is the campaign object get_broadcast returns, live progress and A/B resu
- `preview_broadcast` — How many contacts a campaign would reach, and whether the reputation gate would allow it. It is the only way to see the size of a campaign without starting it. For an A/B test it also reports the sample size and per-variant count against th
- `send_broadcast` — Send a draft or scheduled campaign now, or schedule it with scheduled_at. This mails every contact in the segment and cannot be undone once started; preview_broadcast shows the count beforehand. Marketing mail must carry a postal address: a
- `pick_broadcast_winner` — Decide an A/B test now instead of waiting for decide_at. 'variant' names the winning key; without it the metric decides on the figures so far. The rest of the audience is then sent to the winner and cannot be redirected. Only a campaign in 
- `resume_broadcast` — Continue a paused campaign now. It mails only the addresses still pending — the audience was frozen when the campaign started and everyone already reached is marked — so calling this twice cannot double-send. Only works on a paused campaign
- `list_threads` — List email conversations. awaiting_reply=true returns only the threads where someone has written in and no answer has been sent, which is what needs a response. A reply held for approval or scheduled does not count as sent: such a thread st
- `get_thread` — Read a conversation as a chronological transcript of outbound and inbound messages. Inbound `text` already has quoted history and signatures stripped; `raw_text` holds the untrimmed body, for when the stripped version looks wrong. sender_au
- `reply_to_message` — Reply to a message, keeping it on the same conversation. Sets the threading headers so the recipient's mail client shows it as part of the existing exchange rather than a new one, which send_email does not do. It is a send, so it answers ex
- `mark_thread_handled` — Clear a conversation's awaiting_reply flag without sending anything, for when the last inbound message needs no answer — a "thanks, all sorted" — so it stops appearing in list_threads with awaiting_reply=true. A reply sent only to clear the
- `list_templates` — List stored email templates and the variables each one needs. Unlike HTML composed at send time, templates carry the workspace's reviewed subject, copy and styling. They do not carry the unsubscribe footer: that is added at send time to mar
- `render_template` — Render a template with values, without sending, showing how the copy reads before it mails a real person. A missing variable answers 422 missing_variables with the list in `missing`; an unknown slug answers 404. Returns subject, html and te
- `send_template_email` — Send an email built from a stored template. Variable values are HTML-escaped on substitution, so they are safe to fill from user-supplied text. Nothing is sent when a value is missing: 422 missing_variables lists the names in `missing`, and
- `list_pending_approvals` — List messages held for human approval, with their full content. A key configured to require approval drafts rather than sends; a person releases it. A send that returned status 'pending_approval' is waiting here, and retrying the send does 
- `decide_approval` — Approve or reject a held message. Approving releases it: it sends now, or at its scheduled_at when the draft was scheduled for later. If every recipient unsubscribed or was suppressed while it waited, nothing is sent and the answer says ski
- `list_automations` — List multi-step email sequences and how many people are currently in each, with the id each one is enrolled by. Newest first, at most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page. A 'paused' 
- `get_automation` — Fetch one automation: its status, trigger, steps (each with the id and condition update_automation needs passed back), exit rules and how many people are in each state. The same object list_automations returns, for a caller that already hol
- `get_automation_metrics` — How each step of an automation is doing: per current step, its step_id, position, sent, delivered, opened and clicked. Opens and clicks are unique people, counted only after link scanners are ruled out, so they are lower than raw hit counts
- `list_automation_enrollments` — The people in one automation, newest enrolment first: each row has the email, status, current_step, next_due_at and, for a cancelled one, cancel_reason. It answers 'is this person still on the sequence?', 'who is waiting on step 2?' and 'wh
- `create_automation` — Define a multi-step sequence as a draft; nothing is sent until it is activated, from the dashboard or with set_automation_status. Unlike several separately scheduled emails, it ends on its own when the person unsubscribes, replies, bounces,
- `update_automation` — Change a sequence's steps, the rules that take someone out of it (topic_key, exit_tags, required_tags, exit_on_reply), its reply_to, its reenrollment, or its default_variables (replaces the whole set; {} clears it). The trigger is fixed onc
- `set_automation_status` — Activate, pause or return an automation to draft. A new automation is a draft and sends nothing until it is set to 'active'. Pausing ('paused' or 'draft') holds everyone on their current step: nobody is sent a step and nobody new is enrolle
- `delete_automation` — Delete an automation for good and cancel every active enrolment in it, so nobody is sent another step. Answers enrollments_canceled. It cannot be undone: to stop it for a while and continue everyone later, use set_automation_status with pau
- `enroll_in_automation` — Put someone into a multi-step sequence. Unlike several separately scheduled emails, the sequence stops on its own if they unsubscribe (from everything or from the automation's topic), reply, hard bounce, gain one of its exit tags, or lose o
- `emit_event` — Emit a named event, starting every automation that waits on it — for example 'trial_started' or 'invoice_overdue'. The configured sequences decide what happens, rather than the caller naming an automation. Returns automations_started; 0 mea
- `list_conversion_goals` — List conversion goals: the event names counted as a conversion, each with its credit window in days. An emit_event call with one of these names is credited to the last email the person clicked inside that window; any other name is an ordina
- `create_conversion_goal` — Start counting an event as a conversion, such as 'subscription_started' or 'purchase'. Counts only events emitted after this call; it does not go back over earlier ones. Use the exact name the app already passes to emit_event. A name that i
- `get_conversion_metrics` — Attributed conversions, converters and revenue per currency. Pass broadcast_id for a campaign, broken down per A/B variant with its sent count and rate, or automation_id for a sequence, broken down per step. The figures are attributed, not 
- `list_topics` — List subscription topics — the categories a person can opt out of individually. Marketing mail sent under a topic lets recipients unsubscribe from that kind alone rather than from everything.
- `get_email_preferences` — What one person has chosen to receive. It shows whether someone who isn't getting a particular kind of email opted out of it — an opt-out looks identical to a delivery failure from the outside.
- `set_email_preferences` — Set which topics a person receives, recording what they asked for — silently re-subscribing someone who opted out is what generates spam complaints. Every key must be an existing topic from list_topics: one unknown key refuses the whole cal
- `list_audiences` — List contact lists, newest first, with each one's id and contact_count. Paged: at most 100 per call; while has_more is true, more lists are on later pages, returned when next_cursor is passed back as cursor.
- `add_contact` — Add someone to an audience. A contact exists once per workspace and can be on any number of audiences, so adding an address that already exists joins them to this list rather than creating a second copy. status records that the person opted
- `import_contacts` — Import up to 5,000 contacts into an audience in one call, with names, tags, custom properties and subscription status. This is the migration tool: the previous provider's unsubscribed, bounced and complained lists, imported with the matchin
- `get_contact` — Fetch one contact by id, with their audience memberships, custom properties and engagement dates.
- `update_contact` — Update a contact. Attributes are merged, so sending one field does not clear the rest. unsubscribed: true is a real opt-out: it suppresses the address for marketing, cancels their pending sends and ends their automation enrolments. unsubscr
- `list_segments` — List saved audience filters. A campaign created with a segment id, rather than a filter described inline, shares one definition that can be reused and counted.
- `list_tags` — Every tag in use in the workspace, with how many contacts carry each. Tags are free-form, so this is the only way to know what exists before applying one.
- `count_segment` — How many contacts a segment currently matches. A filter that matches nobody shows up here as 0, before any campaign is built around it or sent. Engagement windows and date conditions (e.g. attributes.trial_ends_at within_next_days 3) are me
- `get_email_metrics` — Delivery and engagement over a window. Open and click rates are over delivered, not sent — a low open rate with a high bounce rate is a deliverability problem, not an engagement one.
- `list_scheduled_emails` — Messages queued to send later but not yet sent, newest first; cancel_scheduled_email cancels one. At most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page.
- `suppress_many` — Stop sending to many addresses at once — the path for importing another provider's unsubscribe list before a first campaign. Without it, everyone who already opted out there gets mailed again here. The defaults differ from add_suppression: 
- `list_webhooks` — The workspace's webhook endpoints: each with id, url, the events it receives and whether it is enabled. Read-only: endpoints are added and changed in the dashboard, because a tool that could point one at a new URL would let an agent route t
- `list_webhook_deliveries` — Recent delivery attempts for a webhook endpoint: each with event, status, attempts, last_status_code, last_error and delivered_at (null until it succeeds). This is what tells 'we never sent it' from 'your endpoint returned 500'. Newest firs
- `list_broadcast_recipients` — Who a campaign reached and what happened to each message, with the A/B variant when there is one. At most 200 per call; while has_more is true, next_cursor (a message id) passed back as cursor returns the next page.
- `get_usage` — This workspace's plan, what it has sent this billing period, what the period costs so far, and — the fields worth branching on — sending_locked and lock_reason, which name the exact 402 a send would be refused with right now, before a large
- `find_contact` — Find a contact by address across every audience, without knowing which list they are on, or list the workspace's contacts by tag or subscription. email matches exactly, and q matches an address prefix. A person exists once per workspace, so
- `remove_from_audience` — Take a contact off one audience. They stay in the workspace and keep every other audience, their suppression and their engagement history. delete_contact removes the person entirely — leaving a list and being forgotten are different things.
- `delete_contact` — Remove a person from the workspace entirely, along with every audience membership. Their suppression and topic preferences are kept on purpose — an opt-out has to outlive the contact record, or the next import silently puts them back on the
- `tag_contact` — Add or remove tags on a contact. Tags are flat labels — vip, beta, churned — as opposed to custom properties, which are declared fields with a value. They are lower-cased and spaces become hyphens, so VIP and vip are the same tag. Tagging r

Source repository: https://github.com/CommonNinja/sendraven-mcp-server

---

Source: https://mcp-skills-hub.vercel.app/mcps/ai-sendraven-mcp · MCP Skills Hub · data as of 2026-10-28T12:31:05Z
