---
title: "Elastic Email MCP server for AI agents - actionlake"
description: "Give Claude 109 Elastic Email actions through one MCP server: contacts, domains, subaccounts. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/elastic-email
updated: 2026-10-23
---

Connectors · Email & messaging

# Elastic Email MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Elastic Email and the rest of your systems. It gives your agent 109 Elastic Email actions (49 reads, 42 writes and 18 that wait for a confirmation) and holds the Elastic Email credential itself, so the agent never does. It paces Elastic Email's limits and records every call.

[Connect Elastic Email free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "elastic_email.contacts.list",
  intent: "check which Elastic Email account is connected"
}
# List contacts · read · 1 upstream call
```

- 109 actions in one signed file
- 49 read look, never change
- 42 write create and update
- 18 wait for a yes destructive, confirmed first

Set up

## Connect Elastic Email in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect Elastic Email.
   API key. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `api_key` Elastic Email API key
   ```
   account { op: "connections.requirements", service: "elastic_email" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "elastic_email.contacts.list" }
   # list contacts · read · 1 upstream call
   check { action: "elastic_email.contacts.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Elastic Email at a glance

**Sign-in**

API key. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.

**You provide**

`api_key`

**Limits we pace to**

600 calls a minute, per connection

**API covered**

Elastic Email REST API v4 (OpenAPI 3.0.3, 4.0.0)`api.elasticemail.com/v4`

**Built from**

Elastic Email's documentation, read 23 October 2026[api.elasticemail.com](https://api.elasticemail.com/public/v4/swagger) [elasticemail.com](https://elasticemail.com/developers/api-documentation/rest-api)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

44 of 49 reads, for up to 5 minutes; a write clears what it affects

**Shared entities**

5, so ask can line Elastic Email up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Elastic Email.

109 actions in 27 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **49** read look, never change
- **42** write create and update
- **18** destructive wait for a confirmation

1. ### Contacts
   8
   2 read · 4 write · 2 destructive
   List contacts · Add up to 1,000 contacts, optionally to lists · Get a contact by email address · Update a contact's name and custom fields
2. ### Domains
   8
   3 read · 4 write · 1 destructive
   List sending domains · Add a sending domain · Get a sending domain and its DNS status · Update a domain's tracking and bounce settings
3. ### Subaccounts
   7
   3 read · 3 write · 1 destructive
   Create a subaccount · List subaccounts · Get a subaccount · Get a subaccount's API key
4. ### Campaigns
   6
   2 read · 3 write · 1 destructive
   List campaigns · Create (and optionally send) a campaign · Get a campaign · Update an active or paused campaign
5. ### Inbound routes
   6
   2 read · 3 write · 1 destructive
   Create an inbound route · List inbound routes · Get an inbound route · Change the order of inbound routes
6. ### Webhooks
   6
   2 read · 2 write · 2 destructive
   Create a webhook · List webhooks · Update a webhook · Get a webhook
7. ### API keys
   5
   2 read · 2 write · 1 destructive
   Create an API key · List API keys · Get an API key · Delete an API key
8. ### Emails
   5
   2 read · 3 write · 0 destructive
   Send a transactional email · View a sent email's content · Send an email to many recipients with merge fields · Send emails merged from an attached CSV file

**19 more areas · 58 actions**

- Events **5**
- Lists **5**
- Segments **5**
- SMTP credentials **5**
- Templates **5**
- Files **4**
- Verification files **4**
- Verifications **4**
- List contacts **3**
- Suppressions **3**
- Bounces **2**
- Campaign statistics **2**
- Channel statistics **2**
- Complaints **2**
- Event exports **2**
- Unsubscribes **2**
- Campaign automations **1**
- Contact exports **1**
- Statistics **1**

Top actions

## The Elastic Email API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 59 of Elastic Email's 59 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `elastic_email.contacts.list` List contacts | List contacts. | read | `crm.contact.list` 177 connectors |
| `elastic_email.lists.list` List contact lists | List contact lists. | read | `comm.audience.list` 26 connectors |
| `elastic_email.list_contacts.list` List the contacts in a list | List the contacts in a list. | read | `comm.audience_member.list` 23 connectors |
| `elastic_email.segments.list` List segments | List segments. | read | `comm.audience_segment.list` 22 connectors |
| `elastic_email.domains.list` List sending domains | List sending domains. | read | `comm.sending_domain.list` 18 connectors |
| `elastic_email.contacts.create` Add up to 1,000 contacts, optionally to lists | Add up to 1,000 contacts, optionally to lists. | write | `crm.contact.create` 161 connectors |
| `elastic_email.lists.create` Create a contact list | Create a contact list. | write | `comm.audience.create` 24 connectors |
| `elastic_email.segments.create` Create a segment | Create a segment. | write | `comm.audience_segment.create` 16 connectors |
| `elastic_email.domains.create` Add a sending domain | Add a sending domain. | write | `comm.sending_domain.create` 15 connectors |
| `elastic_email.contacts.delete` Delete a contact | Delete a contact. | destructive | `crm.contact.delete` 147 connectors |
| `elastic_email.campaigns.list` List campaigns | List campaigns. | read | `comm.campaign.list` 41 connectors |
| `elastic_email.campaigns.create` Create (and optionally send) a campaign | Create (and optionally send) a campaign. | write | `comm.campaign.create` 38 connectors |

Try it

## Prompts to paste into Claude.

Each one names the Elastic Email actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   Find the Elastic Email contacts with no email address, so we can clean them up.
   calls `elastic_email.contacts.list`
2. Write write
   Add up to 1,000 contacts, optionally to lists in Elastic Email. Show me exactly what you will send before you save it.
   calls `elastic_email.contacts.create`
3. Across systems read
   Which contacts are in both Elastic Email and HaloPSA, and how many are in only one of them?
   calls `elastic_email.contacts.list` `halopsa.users.list`

Across your systems

## Elastic Email, joined to the rest of your business.

One `ask` fetches from Elastic Email and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.

- Which contacts are in both Elastic Email and HaloPSA, and how many are in only one of them?
  `elastic_email.contacts.list` + `halopsa.users.list`, on `crm.contact` · [HaloPSA](https://actionlake.com/connectors/halopsa)
- Which contacts are in both Elastic Email and NetSuite, and how many are in only one of them?
  `elastic_email.contacts.list` + `netsuite.views.contacts`, on `crm.contact` · [NetSuite](https://actionlake.com/connectors/netsuite)

Also mapped by other connectors `crm.contact` **192** `comm.audience` **27** `comm.audience_segment` **18** `comm.audience_member` **16** `comm.sending_domain` **12**

ask

```
ask {
  intent: "which contacts are in both Elastic Email and HaloPSA, and how many are in only one of them",
  steps: [
    { action: "elastic_email.contacts.list", as: "people", input: {}, limit: 100, max_pages: 5 },
    { action: "halopsa.users.list", as: "people2", input: {}, limit: 100, max_pages: 5 },
    { join: {
        left: "people",
        right: "people2",
        on: "crm.contact",
        group_by: "people.email",
        select: ["people.email", "count(people2.id) as in_halopsa"]
    } }
  ]
}
```

Example. Run it through check first: it validates the steps and prices them, and it is free.

Governance for Elastic Email

## Destructive actions wait for a yes.

18 Elastic Email actions are destructive. These are all of them:

- Delete a contact `elastic_email.contacts.delete`
- Delete a contact list `elastic_email.lists.delete`
- Delete a segment `elastic_email.segments.delete`
- Delete a sending domain `elastic_email.domains.delete`
- Remove contacts from a list `elastic_email.list_contacts.remove`
- Delete an email template `elastic_email.templates.delete`
- Delete a campaign `elastic_email.campaigns.delete`
- Remove an email address from suppressions `elastic_email.suppressions.delete`
- Delete an API key `elastic_email.api_keys.delete`
- Delete a stored file `elastic_email.files.delete`
- Delete a webhook `elastic_email.webhooks.delete`
- Delete a subaccount `elastic_email.subaccounts.delete`
- Delete contacts by email list or rule `elastic_email.contacts.delete_bulk`
- Delete a stored verification result `elastic_email.verifications.delete`
- Delete an inbound route `elastic_email.inbound_routes.delete`
- Rotate a webhook's signing secret (the old secret stops working) `elastic_email.webhooks.rotate_secret`
- Delete SMTP credentials `elastic_email.smtp_credentials.delete`
- Delete a bulk verification file and its result `elastic_email.verification_files.delete`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do elastic_email.contacts.delete confirm_policy: **human**

Delete a contact?

**intent:** the user asked me to delete a contact

run suspended · waiting for a named person · key _elastic-email-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "elastic-email-agent",
  allowed_actions: ["elastic_email.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "elastic_email.contacts.delete", approver: "lead@example.com" },
    { match: "elastic_email.lists.delete", approver: "lead@example.com" },
    { match: "elastic_email.segments.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Elastic Email only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Elastic Email costs on actionlake.

Every Elastic Email action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Elastic Email refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 109 Elastic Email actions
- 109 actions page each page of a long list is one call
- 44 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Elastic Email action.

109 actions by area: the id your agent calls, what it does, and its effect.

**Contacts 8**

- `elastic_email.contacts.create` Add up to 1,000 contacts, optionally to lists write
- `elastic_email.contacts.delete` Delete a contact destructive
- `elastic_email.contacts.delete_bulk` Delete contacts by email list or rule destructive
- `elastic_email.contacts.export` Start an export of contacts to a file write
- `elastic_email.contacts.get` Get a contact by email address read
- `elastic_email.contacts.import` Import contacts from a CSV file at a URL write
- `elastic_email.contacts.list` List contacts read
- `elastic_email.contacts.update` Update a contact's name and custom fields write

**Domains 8**

- `elastic_email.domains.create` Add a sending domain write
- `elastic_email.domains.delete` Delete a sending domain destructive
- `elastic_email.domains.get` Get a sending domain and its DNS status read
- `elastic_email.domains.get_restricted` Check whether a domain is restricted read
- `elastic_email.domains.list` List sending domains read
- `elastic_email.domains.set_default` Set the default sender domain (by sender email address) write
- `elastic_email.domains.update` Update a domain's tracking and bounce settings write
- `elastic_email.domains.verify` Verify a domain's DNS records write

**Subaccounts 7**

- `elastic_email.subaccounts.add_credits` Add or remove a subaccount's email credits write
- `elastic_email.subaccounts.create` Create a subaccount write
- `elastic_email.subaccounts.delete` Delete a subaccount destructive
- `elastic_email.subaccounts.get` Get a subaccount read
- `elastic_email.subaccounts.get_api_key` Get a subaccount's API key read
- `elastic_email.subaccounts.list` List subaccounts read
- `elastic_email.subaccounts.update_email_settings` Update a subaccount's email settings write

**Campaigns 6**

- `elastic_email.campaigns.create` Create (and optionally send) a campaign write
- `elastic_email.campaigns.delete` Delete a campaign destructive
- `elastic_email.campaigns.get` Get a campaign read
- `elastic_email.campaigns.list` List campaigns read
- `elastic_email.campaigns.pause` Pause a sending campaign write
- `elastic_email.campaigns.update` Update an active or paused campaign write

**Inbound routes 6**

- `elastic_email.inbound_routes.create` Create an inbound route write
- `elastic_email.inbound_routes.delete` Delete an inbound route destructive
- `elastic_email.inbound_routes.get` Get an inbound route read
- `elastic_email.inbound_routes.list` List inbound routes read
- `elastic_email.inbound_routes.reorder` Change the order of inbound routes write
- `elastic_email.inbound_routes.update` Update an inbound route write

**Webhooks 6**

- `elastic_email.webhooks.create` Create a webhook write
- `elastic_email.webhooks.delete` Delete a webhook destructive
- `elastic_email.webhooks.get` Get a webhook read
- `elastic_email.webhooks.list` List webhooks read
- `elastic_email.webhooks.rotate_secret` Rotate a webhook's signing secret (the old secret stops working) destructive
- `elastic_email.webhooks.update` Update a webhook write

**API keys 5**

- `elastic_email.api_keys.create` Create an API key write
- `elastic_email.api_keys.delete` Delete an API key destructive
- `elastic_email.api_keys.get` Get an API key read
- `elastic_email.api_keys.list` List API keys read
- `elastic_email.api_keys.update` Update an API key's access write

**Emails 5**

- `elastic_email.emails.get_status` Get the delivery status of a send transaction read
- `elastic_email.emails.send_bulk` Send an email to many recipients with merge fields write
- `elastic_email.emails.send_mergefile` Send emails merged from an attached CSV file write
- `elastic_email.emails.send_transactional` Send a transactional email write
- `elastic_email.emails.view` View a sent email's content read

**Events 5**

- `elastic_email.events.export` Start an export of events write
- `elastic_email.events.export_channel` Start an export of one channel's events write
- `elastic_email.events.list` List email events (sent, opened, clicked, bounced...) read
- `elastic_email.events.list_by_channel` List events for one channel read
- `elastic_email.events.list_by_transaction` List events for one send transaction read

**Lists 5**

- `elastic_email.lists.create` Create a contact list write
- `elastic_email.lists.delete` Delete a contact list destructive
- `elastic_email.lists.get` Get a contact list read
- `elastic_email.lists.list` List contact lists read
- `elastic_email.lists.update` Rename or update a contact list write

**Segments 5**

- `elastic_email.segments.create` Create a segment write
- `elastic_email.segments.delete` Delete a segment destructive
- `elastic_email.segments.get` Get a segment read
- `elastic_email.segments.list` List segments read
- `elastic_email.segments.update` Update a segment's rule write

**SMTP credentials 5**

- `elastic_email.smtp_credentials.create` Create SMTP credentials write
- `elastic_email.smtp_credentials.delete` Delete SMTP credentials destructive
- `elastic_email.smtp_credentials.get` Get SMTP credentials read
- `elastic_email.smtp_credentials.list` List SMTP credentials read
- `elastic_email.smtp_credentials.update` Update SMTP credentials write

**Templates 5**

- `elastic_email.templates.create` Create an email template write
- `elastic_email.templates.delete` Delete an email template destructive
- `elastic_email.templates.get` Get an email template read
- `elastic_email.templates.list` List email templates read
- `elastic_email.templates.update` Update an email template write

**Files 4**

- `elastic_email.files.delete` Delete a stored file destructive
- `elastic_email.files.get` Get a stored file's details read
- `elastic_email.files.list` List stored files read
- `elastic_email.files.upload` Upload a file (base64 content) write

**Verification files 4**

- `elastic_email.verification_files.delete` Delete a bulk verification file and its result destructive
- `elastic_email.verification_files.get_result` Get a bulk verification file's results read
- `elastic_email.verification_files.list` List bulk verification files and their status read
- `elastic_email.verification_files.start` Start verifying an uploaded file write

**Verifications 4**

- `elastic_email.verifications.delete` Delete a stored verification result destructive
- `elastic_email.verifications.get` Get a stored verification result for an email read
- `elastic_email.verifications.list` List single email verification results read
- `elastic_email.verifications.verify` Verify one email address write

**List contacts 3**

- `elastic_email.list_contacts.add` Add existing contacts to a list write
- `elastic_email.list_contacts.list` List the contacts in a list read
- `elastic_email.list_contacts.remove` Remove contacts from a list destructive

**Suppressions 3**

- `elastic_email.suppressions.delete` Remove an email address from suppressions destructive
- `elastic_email.suppressions.get` Get a suppression by email address read
- `elastic_email.suppressions.list` List all suppressions read

**Bounces 2**

- `elastic_email.bounces.create` Add addresses to the bounce list write
- `elastic_email.bounces.list` List bounced addresses read

**Campaign statistics 2**

- `elastic_email.campaign_statistics.get` Get one campaign's statistics read
- `elastic_email.campaign_statistics.list` List campaign statistics read

**Channel statistics 2**

- `elastic_email.channel_statistics.get` Get one channel's statistics read
- `elastic_email.channel_statistics.list` List channel statistics read

**Complaints 2**

- `elastic_email.complaints.create` Add addresses to the complaint list write
- `elastic_email.complaints.list` List complaint addresses read

**Event exports 2**

- `elastic_email.event_exports.get_channel_status` Get a channel event export's status read
- `elastic_email.event_exports.get_status` Get an event export's status read

**Unsubscribes 2**

- `elastic_email.unsubscribes.create` Add addresses to the unsubscribe list write
- `elastic_email.unsubscribes.list` List unsubscribed addresses read

**Campaign automations 1**

- `elastic_email.campaign_automations.trigger` Trigger an automation campaign for one contact write

**Contact exports 1**

- `elastic_email.contact_exports.get_status` Get a contact export's status read

**Statistics 1**

- `elastic_email.statistics.get` Get account sending statistics for a date range read

Questions

## The Elastic Email MCP server, answered.

**Is there an Elastic Email MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 109 Elastic Email actions across contacts, domains, subaccounts and campaigns, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Elastic Email.

**What do I need to connect Elastic Email?**

Elastic Email API key. The free call account { op: "connections.requirements", service: "elastic_email" } lists exactly what to paste.

**Can an AI agent delete or change things in Elastic Email?**

Only if its key allows it, and only with an explicit confirmation. 18 Elastic Email actions are destructive, including delete a contact, delete a contact list and delete a segment. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Elastic Email API limit?**

actionlake paces every call to the limits in the Elastic Email service file: 600 calls a minute per connection. Repeated reads are answered from cache (44 Elastic Email actions can be), which never reaches Elastic Email.

**What does an Elastic Email action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (109 Elastic Email actions page). Cache hits, searches, dry runs and calls Elastic Email refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which Elastic Email API does it cover?**

The Elastic Email REST API v4 (OpenAPI 3.0.3, 4.0.0) at api.elasticemail.com/v4. It is built from Elastic Email's documentation as read on 23 October 2026. 109 actions in 27 areas, each one in the signed service file (version 1.0.0).

**Can I combine Elastic Email with my other systems?**

Yes. ask joins Elastic Email to HaloPSA or NetSuite on the same customer and returns the answer rather than every row. Elastic Email maps crm.contact, which 192 other connectors also map.

**Does actionlake keep my Elastic Email data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Elastic Email credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like Elastic Email

Shares the most action names with

- [Resend 44](https://actionlake.com/connectors/resend)
- [Sinch Mailjet 42](https://actionlake.com/connectors/sinch-mailjet)
- [Bird 40](https://actionlake.com/connectors/bird)
- [Mailtrap 27](https://actionlake.com/connectors/mailtrap)
- [Dotdigital 26](https://actionlake.com/connectors/dotdigital)
- [SparkPost 24](https://actionlake.com/connectors/sparkpost)

Joins with, on shared entities

- [Brevo 4](https://actionlake.com/connectors/brevo)
- [Circle 3](https://actionlake.com/connectors/circle)
- [beehiiv 3](https://actionlake.com/connectors/beehiiv)
- [ActiveCampaign 2](https://actionlake.com/connectors/activecampaign)
- [Cvent 2](https://actionlake.com/connectors/cvent)
- [Qualtrics XM 2](https://actionlake.com/connectors/qualtrics-xm)

Browse

- [All Email & messaging connectors](https://actionlake.com/connectors/category/email-and-messaging)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Elastic Email; the name is the vendor's own. Counts are from the Elastic Email service file, version 1.0.0.

## Give your agent Elastic Email today.

[Connect Elastic Email free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/elastic-email
More: https://actionlake.com/llms.txt
