How to integrate Elastic Email MCP with Mastra AI

This guide walks you through connecting Elastic Email to Mastra AI using the Composio tool router. By the end, you'll have a working Elastic Email agent that can add your contacts, create contact lists, build campaigns, make templates, and set up domains through natural language commands. This guide will help you understand how to give your Mastra AI agent real control over a Elastic Email account through Composio's Elastic Email MCP server. Before we dive in, let's take a quick look at the key ideas and tools involved.

Elastic Email logoElastic Email
Api Key

Elastic Email is an email delivery and marketing platform for transactional emails, campaigns, contacts, and reporting. Use it to send reliable emails, manage audiences, verify addresses, and track performance.

91 Tools

Introduction

This guide walks you through connecting Elastic Email to Mastra AI using the Composio tool router. By the end, you'll have a working Elastic Email agent that can add your contacts, create contact lists, build campaigns, make templates, and set up domains through natural language commands.

This guide will help you understand how to give your Mastra AI agent real control over a Elastic Email account through Composio's Elastic Email MCP server.

Before we dive in, let's take a quick look at the key ideas and tools involved.

Also integrate Elastic Email with

TL;DR

Here's what you'll learn:
  • Set up your environment so Mastra, OpenAI, and Composio work together
  • Create a Tool Router session in Composio that exposes Elastic Email tools
  • Connect Mastra's MCP client to the Composio generated MCP URL
  • Fetch Elastic Email tool definitions and attach them as a toolset
  • Build a Mastra agent that can reason, call tools, and return structured results
  • Run an interactive CLI where you can chat with your Elastic Email agent

What is Mastra AI?

Mastra AI is a TypeScript framework for building AI agents with tool support. It provides a clean API for creating agents that can use external services through MCP.

Key features include:

  • MCP Client: Built-in support for Model Context Protocol servers
  • Toolsets: Organize tools into logical groups
  • Step Callbacks: Monitor and debug agent execution
  • OpenAI Integration: Works with OpenAI models via @ai-sdk/openai

What is the Elastic Email MCP server, and what's possible with it?

The Elastic Email MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Elastic Email account. It provides structured and secure access to your contacts, campaigns, templates, domains, delivery records, and account settings, so your agent can organize audiences, create campaigns, build templates, check delivery status, and manage sending domains on your behalf.

  • Contact and audience management: Have your agent add or remove contacts, create contact lists, assign existing contacts to lists, and build dynamic segments using defined rules.
  • Campaign and template creation: Direct your agent to create campaigns, prepare reusable email templates, retrieve campaign details, or remove campaigns and templates you no longer need.
  • Delivery tracking and message review: Let the agent check email job status, review recipient delivery details, and retrieve rendered message previews with attachment information.
  • Domain and inbound email setup: Instruct your agent to add sending or tracking domains, review their DNS and certificate state, check domain restrictions, and configure inbound email routes.
  • Suppression, verification, and event management: Have your agent maintain suppression records, retrieve saved email verification results, monitor export jobs, and create or remove webhooks for selected email events.

What is the Composio tool router, and how does it fit here?

What is Composio SDK?

Composio's Composio SDK helps agents find the right tools for a task at runtime. You can plug in multiple toolkits (like Gmail, HubSpot, and GitHub), and the agent will identify the relevant app and action to complete multi-step workflows. This can reduce token usage and improve the reliability of tool calls. Read more here: Getting started with Composio SDK

The tool router generates a secure MCP URL that your agents can access to perform actions.

How the Composio SDK works

The Composio SDK follows a three-phase workflow:

  1. Discovery: Searches for tools matching your task and returns relevant toolkits with their details.
  2. Authentication: Checks for active connections. If missing, creates an auth config and returns a connection URL via Auth Link.
  3. Execution: Executes the action using the authenticated connection.

Step-by-step Guide

Step by step09 STEPS
1

Prerequisites

Before starting, make sure you have:
  • Node.js 18 or higher
  • A Composio account with an active API key
  • An OpenAI API key
  • Basic familiarity with TypeScript
2

Getting API Keys for OpenAI and Composio

OpenAI API Key
  • Go to the OpenAI dashboard and create an API key.
  • You need credits or a connected billing setup to use the models.
  • Store the key somewhere safe.
Composio API Key
  • Log in to the Composio dashboard.
  • Go to Settings and copy your API key.
  • This key lets your Mastra agent talk to Composio and reach Elastic Email through MCP.
3

Install dependencies

bash
npm install @composio/core @mastra/core @mastra/mcp @ai-sdk/openai dotenv

Install the required packages.

What's happening:

  • @composio/core is the Composio SDK for creating MCP sessions
  • @mastra/core provides the Agent class
  • @mastra/mcp is Mastra's MCP client
  • @ai-sdk/openai is the model wrapper for OpenAI
  • dotenv loads environment variables from .env
4

Set up environment variables

bash
COMPOSIO_API_KEY=your_composio_api_key_here
COMPOSIO_USER_ID=your_user_id_here
OPENAI_API_KEY=your_openai_api_key_here

Create a .env file in your project root.

What's happening:

  • COMPOSIO_API_KEY authenticates your requests to Composio
  • COMPOSIO_USER_ID tells Composio which user this session belongs to
  • OPENAI_API_KEY lets the Mastra agent call OpenAI models
5

Import libraries and validate environment

typescript
import "dotenv/config";
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { MCPClient } from "@mastra/mcp";
import { Composio } from "@composio/core";
import * as readline from "readline";

import type { AiMessageType } from "@mastra/core/agent";

const openaiAPIKey = process.env.OPENAI_API_KEY;
const composioAPIKey = process.env.COMPOSIO_API_KEY;
const composioUserID = process.env.COMPOSIO_USER_ID;

if (!openaiAPIKey) throw new Error("OPENAI_API_KEY is not set");
if (!composioAPIKey) throw new Error("COMPOSIO_API_KEY is not set");
if (!composioUserID) throw new Error("COMPOSIO_USER_ID is not set");

const composio = new Composio({
  apiKey: composioAPIKey as string,
});
What's happening:
  • dotenv/config auto loads your .env so process.env.* is available
  • openai gives you a Mastra compatible model wrapper
  • Agent is the Mastra agent that will call tools and produce answers
  • MCPClient connects Mastra to your Composio MCP server
  • Composio is used to create a Tool Router session
6

Create a Tool Router session for Elastic Email

typescript
async function main() {
  const session = await composio.create(
    composioUserID as string,
    {
      toolkits: ["elastic_email"],
    },
  );

  const composioMCPUrl = session.mcp.url;
  console.log("Elastic Email MCP URL:", composioMCPUrl);
What's happening:
  • create spins up a short-lived MCP HTTP endpoint for this user
  • The toolkits array contains "elastic_email" for Elastic Email access
  • session.mcp.url is the MCP URL that Mastra's MCPClient will connect to
7

Configure Mastra MCP client and fetch tools

typescript
const mcpClient = new MCPClient({
    id: composioUserID as string,
    servers: {
      nasdaq: {
        url: new URL(composioMCPUrl),
        requestInit: {
          headers: session.mcp.headers,
        },
      },
    },
    timeout: 30_000,
  });

console.log("Fetching MCP tools from Composio...");
const composioTools = await mcpClient.getTools();
console.log("Number of tools:", Object.keys(composioTools).length);
What's happening:
  • MCPClient takes an id for this client and a list of MCP servers
  • The headers property includes the x-api-key for authentication
  • getTools fetches the tool definitions exposed by the Elastic Email toolkit
8

Create the Mastra agent

typescript
const agent = new Agent({
    name: "elastic_email-mastra-agent",
    instructions: "You are an AI agent with Elastic Email tools via Composio.",
    model: "openai/gpt-5",
  });
What's happening:
  • Agent is the core Mastra agent
  • name is just an identifier for logging and debugging
  • instructions guide the agent to use tools instead of only answering in natural language
  • model uses openai("gpt-5") to configure the underlying LLM
9

Set up interactive chat interface

typescript
let messages: AiMessageType[] = [];

console.log("Chat started! Type 'exit' or 'quit' to end.\n");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: "> ",
});

rl.prompt();

rl.on("line", async (userInput: string) => {
  const trimmedInput = userInput.trim();

  if (["exit", "quit", "bye"].includes(trimmedInput.toLowerCase())) {
    console.log("\nGoodbye!");
    rl.close();
    process.exit(0);
  }

  if (!trimmedInput) {
    rl.prompt();
    return;
  }

  messages.push({
    id: crypto.randomUUID(),
    role: "user",
    content: trimmedInput,
  });

  console.log("\nAgent is thinking...\n");

  try {
    const response = await agent.generate(messages, {
      toolsets: {
        elastic_email: composioTools,
      },
      maxSteps: 8,
    });

    const { text } = response;

    if (text && text.trim().length > 0) {
      console.log(`Agent: ${text}\n`);
        messages.push({
          id: crypto.randomUUID(),
          role: "assistant",
          content: text,
        });
      }
    } catch (error) {
      console.error("\nError:", error);
    }

    rl.prompt();
  });

  rl.on("close", async () => {
    console.log("\nSession ended.");
    await mcpClient.disconnect();
    process.exit(0);
  });
}

main().catch((err) => {
  console.error("Fatal error:", err);
  process.exit(1);
});
What's happening:
  • messages keeps the full conversation history in Mastra's expected format
  • agent.generate runs the agent with conversation history and Elastic Email toolsets
  • maxSteps limits how many tool calls the agent can take in a single run
  • onStepFinish is a hook that prints intermediate steps for debugging

Complete Code

Here's the complete code to get you started with Elastic Email and Mastra AI:

typescript
import "dotenv/config";
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { MCPClient } from "@mastra/mcp";
import { Composio } from "@composio/core";
import * as readline from "readline";

import type { AiMessageType } from "@mastra/core/agent";

const openaiAPIKey = process.env.OPENAI_API_KEY;
const composioAPIKey = process.env.COMPOSIO_API_KEY;
const composioUserID = process.env.COMPOSIO_USER_ID;

if (!openaiAPIKey) throw new Error("OPENAI_API_KEY is not set");
if (!composioAPIKey) throw new Error("COMPOSIO_API_KEY is not set");
if (!composioUserID) throw new Error("COMPOSIO_USER_ID is not set");

const composio = new Composio({ apiKey: composioAPIKey as string });

async function main() {
  const session = await composio.create(composioUserID as string, {
    toolkits: ["elastic_email"],
  });

  const composioMCPUrl = session.mcp.url;

  const mcpClient = new MCPClient({
    id: composioUserID as string,
    servers: {
      elastic_email: {
        url: new URL(composioMCPUrl),
        requestInit: {
          headers: session.mcp.headers,
        },
      },
    },
    timeout: 30_000,
  });

  const composioTools = await mcpClient.getTools();

  const agent = new Agent({
    name: "elastic_email-mastra-agent",
    instructions: "You are an AI agent with Elastic Email tools via Composio.",
    model: "openai/gpt-5",
  });

  let messages: AiMessageType[] = [];

  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: "> ",
  });

  rl.prompt();

  rl.on("line", async (input: string) => {
    const trimmed = input.trim();
    if (["exit", "quit"].includes(trimmed.toLowerCase())) {
      rl.close();
      return;
    }

    messages.push({ id: crypto.randomUUID(), role: "user", content: trimmed });

    const { text } = await agent.generate(messages, {
      toolsets: { elastic_email: composioTools },
      maxSteps: 8,
    });

    if (text) {
      console.log(`Agent: ${text}\n`);
      messages.push({ id: crypto.randomUUID(), role: "assistant", content: text });
    }

    rl.prompt();
  });

  rl.on("close", async () => {
    await mcpClient.disconnect();
    process.exit(0);
  });
}

main();

Conclusion

You've built a Mastra AI agent that can interact with Elastic Email through Composio's Tool Router. You can extend this further by:
  • Adding other toolkits like Gmail, Slack, or GitHub
  • Building a web-based chat interface around this agent
  • Using multiple MCP endpoints to enable cross-app workflows
TOOLS

Supported Tools

Every Elastic Email action and event your agent gets out of the box.

Add Contact List Members

Add selected existing contacts to a named Elastic Email contact list.

Add Contacts

Add up to 1000 Elastic Email contacts and optionally assign them to existing lists.

Add Suppressions

Add up to 1000 email addresses to Elastic Email's bounce, complaint, or unsubscribe suppression records.

Adjust Subaccount Credits

Add or remove email credits from a managed Elastic Email subaccount.

Check Domain Restriction

Check whether Elastic Email restricts a domain or identifies it as a free-provider domain.

Create Campaign

Create a campaign.

Create Contact List

Create a contact list, optionally with initial email members.

Create Domain

Create a sending or tracking domain in the connected Elastic Email account.

Create Inbound Route

Create a new inbound email route.

Create Segment

Create a dynamic contact segment from a name and SQL-like rule.

Create Subaccount

Create a managed subaccount with optional initial email settings.

Create Template

Create a new email template with its name, content, and scope.

Create Webhook

Create a webhook subscription for selected email events.

Delete Campaign

Delete one campaign by exact name.

Delete Contact

Delete one contact by exact email address.

Delete Contact List

Delete one contact list by exact name.

Delete Contacts

Permanently delete 1-10 contacts by exact email address.

Delete Domain

Delete one configured domain from the connected Elastic Email account.

Delete Email Verification

Delete one saved email verification result by exact email address.

Delete File

Permanently delete one stored file by its exact name.

Delete Inbound Route

Permanently delete one inbound email route by its public ID.

Delete Segment

Delete one Elastic Email dynamic contact segment by its exact name.

Delete Suppression

Remove one email address from Elastic Email suppression records.

Delete Template

Delete one Elastic Email template by its exact name.

Delete Verification File

Delete one uploaded verification file job by its VerificationID.

Delete Webhook

Delete one webhook subscription by its public WebhookID.

Download File

Download a stored Elastic Email file by its exact name.

Download Verification File Results

Download the ZIP result archive for a completed verification file job.

Get Campaign

Return one Elastic Email campaign by its exact name.

Get Contact

Return one Elastic Email contact by email address.

Get Contact Export Status

Get the current status of an asynchronous contact export job.

Get Contact List

Return one Elastic Email contact list by its exact name.

Get Credential Metadata

Get one Elastic Email API-key or SMTP credential's audit metadata without returning its secret token.

Get Domain

Return detailed DNS and certificate state for one Elastic Email domain.

Get Email Job Status

Return delivery status and optional recipient-level details for an Elastic Email transaction.

Get Email Preview

Return the rendered preview, attachment metadata, and delivery status for an Elastic Email message ID.

Get Email Verification

Return the saved Elastic Email verification result for one email address.

Get Event Export Status

Get the current status of an asynchronous global or channel event export.

Get File Info

Return metadata for a stored Elastic Email file without downloading it.

Get Inbound Route

Return one Elastic Email inbound route by its public ID.

Get Segment

Return one Elastic Email dynamic contact segment by its exact name.

Get Account Statistics

Return aggregate Elastic Email delivery statistics for a time interval.

Get Statistics Breakdown

Return one Elastic Email campaign or channel delivery summary by exact name.

Get Subaccount

Return one managed Elastic Email subaccount by its login email.

Get Suppression

Return suppression details for one Elastic Email address.

Get Template

Return one Elastic Email template by its exact name.

Get Verification File Results

Return one page of detailed results and metadata for a verification file.

Get Webhook

Return one Elastic Email webhook subscription by its public ID.

Import Contacts

Start an asynchronous contact import using exactly one source: an uploaded CSV file or a provider-accessible CSV URL.

Import Suppressions

Upload CSV content containing bounced, complained, or unsubscribed email addresses for asynchronous suppression import.

List Campaigns

Find campaigns by optional name fragment and return one page.

List Contact List Members

Return one page of contacts in a named Elastic Email contact list.

List Contact Lists

Return one page of contact lists from the connected Elastic Email account.

List Contacts

Return one page of contacts from the connected Elastic Email account.

List Credential Metadata

List API-key or SMTP credential metadata without returning secret tokens.

List Domains

Return all sending and tracking domains configured for the account.

List Email Verifications

Return one page of individual email verification results.

List Files

Return one page of stored files and metadata.

List Inbound Routes

Return all inbound email routing rules in their current order.

List Segments

Return one page of dynamic contact segments.

List Statistics Breakdowns

Return one page of campaign or channel delivery summaries.

List Subaccounts

Return one page of managed subaccounts without credentials or passwords.

List Suppressions

Return one page of all suppressed addresses or only addresses suppressed for bounce, complaint, or unsubscribe reasons.

List Templates

Return one page of templates for the required visibility scopes.

List Verification Files

Return all uploaded verification file jobs and their current statuses.

List Webhooks

Return one page of webhook subscriptions.

Pause Campaign

Pause an active Elastic Email campaign by exact name, cancelling messages that are still waiting to be sent.

Remove Contact List Members

Remove selected contacts from a named Elastic Email contact list without deleting the contacts.

Reorder Inbound Routes

Set the processing order of Elastic Email inbound routing rules.

Search Delivery Events

Search all delivery events, one transaction's events, or one channel's events and return one page.

Send Email

Send an email to one or more recipients using inline content or a saved template.

Send Merge File Email

Send personalized email to recipients listed in a CSV merge-data file.

Send Transactional Email

Send one transactional message with To, CC, and BCC recipient groups.

Set Default Sender Domain

Set the domain of a verified sender email as the account default.

Start Contact Export

Start an asynchronous export of all contacts or contacts selected by one filter rule or a list of email addresses.

Start Event Export

Start an asynchronous export for all events or one channel.

Start Verification File

Start bulk verification for a previously uploaded CSV file.

Trigger Campaign Automation

Enter one contact email into an irreversible automation that may send email or execute later steps and cannot be undone.

Update Campaign

Update an existing active or paused campaign.

Update Contact

Update the first name, last name, or custom fields for one Elastic Email contact.

Update Contact List

Update an Elastic Email contact list by providing at least one change: rename it with NewListName or change whether contacts may unsubscribe with AllowUnsubscribe.

Update Domain

Update certificate, VERP, or custom bounce settings for an Elastic Email domain.

Update Inbound Route

Replace an existing inbound route definition by public ID.

Update Segment

Replace an existing dynamic contact segment's name and rule.

Update Subaccount Email Settings

Replace email limits and sender settings for a managed subaccount.

Update Template

Replace an existing email template's name, content, and scope.

Update Webhook

Update a webhook URL, event notification flags, name, or enabled state.

Upload File

Store a base64-encoded file in the connected Elastic Email account.

Upload Verification File

Upload a CSV containing an email column for a later bulk verification job.

Verify Domain

Ask Elastic Email to re-check a domain's DNS configuration.

Verify Email

Run verification for one email address and return its deliverability assessment.

FAQ

Frequently asked questions

With a standalone Elastic Email MCP server, the agents and LLMs can only access a fixed set of Elastic Email tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Elastic Email and many other apps based on the task at hand, all through a single MCP endpoint.

Yes, you can. Mastra AI fully supports MCP integration. You get structured tool calling, message history handling, and model orchestration while Tool Router takes care of discovering and serving the right Elastic Email tools.

Yes, absolutely. You can configure which Elastic Email scopes and actions are allowed when connecting your account to Composio. You can also bring your own OAuth credentials or API configuration so you keep full control over what the agent can do.

All sensitive data such as tokens, keys, and configuration is fully encrypted at rest and in transit. Composio is SOC 2 Type 2 compliant and follows strict security practices so your Elastic Email data and credentials are handled as safely as possible.

Start with Elastic Email.It takes 30 seconds.

Managed auth, hosted MCP servers, and every Elastic Email tool your agent needs.Free to start.

Start building