The official Model Context Protocol server for the Elastic Email REST API v4. Written in C# / .NET.
Installation β’ Quick start β’ Tools β’ Examples β’ Contributing
- Transactional and bulk email. Let your AI assistant send single messages or bulk sends, with plain content or an existing template.
- Contacts and lists. Add, import, list and delete contacts, and create and manage contact lists.
- Campaigns. Create, update, pause and list campaigns, including A/X split tests and scheduled sends.
- Segments and templates. Create and read segments, and look up personal or global templates.
- Statistics. Read opens, clicks and other numbers for one campaign or all of them.
- Works with any MCP client. VS Code (GitHub Copilot agent mode), Cursor, Claude Code and other clients that speak MCP over HTTP.
- Per-request authentication. Each client sends its own Elastic Email API key. The server keeps no credentials of its own.
Tip
Don't want to run a server? Elastic Email hosts this server at https://mcp.elasticemail.com. See the hosted MCP guide. This repository is for running it yourself.
| Requirement | Version |
|---|---|
| .NET SDK | 10.0 or later |
| Network | Port 5001 open for HTTP, outbound HTTPS to api.elasticemail.com |
| MCP client | Any client that supports MCP over HTTP |
You'll also need an Elastic Email API key. You can create one in your API settings. Give it view and modify access to Account, Templates, Campaigns, Contacts, Files and Send HTTP, and at least view access to Access Tokens. The server rejects keys that can't list API keys.
Clone the repository and build it:
git clone https://github.com/ElasticEmail/elasticemail-mcp-server.git
cd elasticemail-mcp-server
dotnet build src/ElasticEmail.Mcp.Service.slnThe build restores its NuGet dependencies (ModelContextProtocol.AspNetCore, Newtonsoft.Json and Serilog.AspNetCore) for you.
Important
Elastic Email only sends from verified domains. Before your first send, verify your sending domain and use an address on that domain as the sender.
dotnet run --project src/ElasticEmail.Mcp.Service.csprojThe server listens on http://0.0.0.0:5001/ and writes daily rolling logs to the working directory.
Add the server to .vscode/mcp.json in your workspace:
{
"inputs": [
{
"type": "promptString",
"id": "elasticemail-api-key",
"description": "Elastic Email API key",
"password": true
}
],
"servers": {
"elasticemail": {
"type": "http",
"url": "http://localhost:5001/",
"headers": {
"X-Auth-Token": "${input:elasticemail-api-key}"
}
}
}
}Then open Copilot Chat, switch to Agent mode, click Start above the server entry, and check that the Elastic Email tools are selected in the tools picker.
Tip
Keep your API key out of files you commit. The inputs prompt above asks for it once and stores it securely in VS Code.
claude mcp add --transport http elasticemail http://localhost:5001/ \
--header "X-Auth-Token: $ELASTICEMAIL_API_KEY"Add the server to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"elasticemail": {
"url": "http://localhost:5001/",
"headers": {
"X-Auth-Token": "YOUR_API_KEY"
}
}
}
}Ask your assistant something like:
- "Check that the Elastic Email MCP server is ready."
- "Send a transactional email to john.doe@example.com from no-reply@yourdomain.com with the subject Welcome aboard!"
- "Create a list called beta-testers with jane@example.com and john@example.com."
- "Show me open and click statistics for all my campaigns."
The from address must use a domain you've verified in your Elastic Email account. If you leave it out, the server uses your account's default sender.
More complete, runnable samples are in the Elastic Email examples repository. It covers transactional email, SMTP, webhooks, inbound email, contacts and serverless platforms across 20+ languages and frameworks.
- π€ AI agent examples (LangChain, OpenAI Agents, Vercel AI SDK)
- π£ .NET / C# examples
- π All examples
| Header | Sent by | Used for |
|---|---|---|
X-Auth-Token |
Your MCP client, on every request | Your Elastic Email API key. The server checks it against GET /v4/security/apikeys and forwards it on every API call. |
Requests without the header, or with a key the API rejects, get 401 Unauthorized.
Important
The server speaks plain HTTP, so the API key travels unencrypted. Keep it on localhost or a private network. If you expose it, put it behind a reverse proxy that terminates TLS.
The server calls the Elastic Email API v4 with your key, so the API's limits apply:
- Up to 20 concurrent connections per account
- A hard timeout of 600 seconds per request
The server exposes 26 tools in 6 groups: EmailSending, ContactsManagement, CampaignManagement, SegmentsManagement, TemplatesManagement and HealthCheck. Most tools return the API's JSON response as a string. Tools marked bool return only true or false.
Show all tools
| Group | Tool | Parameters | Description |
|---|---|---|---|
| EmailSending | SendTransactionalEmail | data |
Send a transactional email, with content or a template |
| EmailSending | SendBulkEmails | emailData |
Send email to many recipients, with content or a template |
| ContactsManagement | FetchContacts | limit (default 20) |
Load contacts |
| ContactsManagement | FetchContactHistory | email |
Load a contact's history |
| ContactsManagement | AddContact (bool) | email, firstName?, lastName? |
Add a contact |
| ContactsManagement | DeleteContacts (bool) | contacts? or rule? |
Delete contacts by email list or rule |
| ContactsManagement | UploadContacts | fileName, base64Content, listName |
Import contacts from a file, creating the list if needed |
| ContactsManagement | FetchLists | Load all contact lists | |
| ContactsManagement | FetchList | listName |
Load a list's details |
| ContactsManagement | FetchListContacts | listName |
Load the contacts in a list |
| ContactsManagement | CreateList | listName, emails |
Create a list with the given contacts |
| ContactsManagement | AddContactsToList | listName, emails |
Add contacts to a list |
| ContactsManagement | RemoveContactsFromList (bool) | listName, contacts? or rule? |
Remove contacts from a list |
| CampaignManagement | CreateCampaign | campaignData |
Create and send a campaign |
| CampaignManagement | ListCampaigns | Load campaigns | |
| CampaignManagement | GetCampaign | name |
Load a campaign |
| CampaignManagement | UpdateCampaign | campaignData |
Update a campaign (change its status to start it again) |
| CampaignManagement | PauseCampaign (bool) | name |
Pause a campaign |
| CampaignManagement | GetCampaignStatistics | name |
Load one campaign's statistics |
| CampaignManagement | GetAllCampaignStatistics | Load statistics for all campaigns | |
| SegmentsManagement | CreateSegment | segmentData (Name, Rule) |
Create a segment |
| SegmentsManagement | GetSegments | Load segments | |
| SegmentsManagement | GetSegment | name |
Load a segment |
| TemplatesManagement | FetchTemplates | scopes, templateTypes? |
Load templates, filtered by scope and type |
| TemplatesManagement | FetchTemplate | name |
Load a template |
| HealthCheck | IsReady | Check the server and its connection to the API |
Your MCP client shows each tool's full description and input schema. The source is in src/Tools.
The server follows the Elastic Email API v4. Releases and release notes are listed in GitHub Releases.
Build details
- API version: 4.0.0
- Target framework:
net10.0 - MCP SDK:
ModelContextProtocol.AspNetCore0.4.0-preview.3 - Transport: HTTP (Streamable HTTP and SSE), port 5001
Contributions are welcome! Please read CONTRIBUTING.md before opening a pull request.
- π Report a bug
- π‘ Request a feature
- π Report a security issue
This project follows the Contributor Covenant Code of Conduct.
Important
The fastest way to get help is the chat widget on elasticemail.com. Our support team can help with your account, sending, deliverability and API questions.
- π¬ Chat with support on elasticemail.com (preferred)
- π API documentation
- π§ Hosted MCP guide
- π§ͺ Examples repository
- π GitHub issues, for bugs in this server only
Released under the MIT License. Copyright Β© 2025β2026 Elastic Email.