How to integrate Elastic Email MCP with OpenAI Agents SDK

This guide walks you through connecting Elastic Email to the OpenAI Agents SDK 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 OpenAI Agents SDK 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 the OpenAI Agents SDK 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 OpenAI Agents SDK 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:
  • Get and set up your OpenAI and Composio API keys
  • Install the necessary dependencies
  • Initialize Composio and create a Tool Router session for Elastic Email
  • Configure an AI agent that can use Elastic Email as a tool
  • Run a live chat session where you can ask the agent to perform Elastic Email operations

What is OpenAI Agents SDK?

The OpenAI Agents SDK is a lightweight framework for building AI agents that can use tools and maintain conversation state. It provides a simple interface for creating agents with hosted MCP tool support.

Key features include:

  • Hosted MCP Tools: Connect to external services through hosted MCP endpoints
  • SQLite Sessions: Persist conversation history across interactions
  • Simple API: Clean interface with Agent, Runner, and tool configuration
  • Streaming Support: Real-time response streaming for interactive applications

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:
  • Composio API Key and OpenAI API Key
  • Primary know-how of OpenAI Agents SDK
  • A live Elastic Email project
  • Some knowledge of Python or Typescript
2

Getting API Keys for OpenAI and Composio

OpenAI API Key
  • Go to the OpenAI dashboard and create an API key. You'll need credits to use the models, or you can connect to another model provider.
  • Keep the API key safe.
Composio API Key
3

Install dependencies

npm install @composio/openai-agents @openai/agents dotenv

Install the Composio SDK and the OpenAI Agents SDK.

4

Set up environment variables

bash
OPENAI_API_KEY=sk-...your-api-key
COMPOSIO_API_KEY=your-api-key
USER_ID=composio_user@gmail.com

Create a .env file and add your OpenAI and Composio API keys.

5

Import dependencies

import 'dotenv/config';
import { Composio } from '@composio/core';
import { OpenAIAgentsProvider } from '@composio/openai-agents';
import { Agent, hostedMcpTool, run, OpenAIConversationsSession } from '@openai/agents';
import * as readline from 'readline';
What's happening:
  • You're importing all necessary libraries.
  • The Composio and OpenAIAgentsProvider classes are imported to connect your OpenAI agent to Composio tools like Elastic Email.
6

Set up the Composio instance

dotenv.config();

const composioApiKey = process.env.COMPOSIO_API_KEY;
const userId = process.env.USER_ID;

if (!composioApiKey) {
  throw new Error('COMPOSIO_API_KEY is not set. Create a .env file with COMPOSIO_API_KEY=your_key');
}
if (!userId) {
  throw new Error('USER_ID is not set');
}

// Initialize Composio
const composio = new Composio({
  apiKey: composioApiKey,
  provider: new OpenAIAgentsProvider(),
});
What's happening:
  • dotenv.config() loads your .env file so COMPOSIO_API_KEY and USER_ID are available as environment variables.
  • Creating a Composio instance using the API Key and OpenAIAgentsProvider class.
7

Create a Tool Router session

// Create Tool Router session for Elastic Email
const session = await composio.create(userId as string, {
  toolkits: ['elastic_email'],
});
const mcpUrl = session.mcp.url;

What is happening:

  • You give the Tool Router the user id and the toolkits you want available. Here, it is only elastic_email.
  • The router checks the user's Elastic Email connection and prepares the MCP endpoint.
  • The returned session.mcp.url is the MCP URL that your agent will use to access Elastic Email.
  • This approach keeps things lightweight and lets the agent request Elastic Email tools only when needed during the conversation.
8

Configure the agent

// Configure agent with MCP tool
const agent = new Agent({
  name: 'Assistant',
  model: 'gpt-5',
  instructions:
    'You are a helpful assistant that can access Elastic Email. Help users perform Elastic Email operations through natural language.',
  tools: [
    hostedMcpTool({
      serverLabel: 'tool_router',
      serverUrl: mcpUrl,
      headers: { 'x-api-key': composioApiKey },
      requireApproval: 'never',
    }),
  ],
});
What's happening:
  • We're creating an Agent instance with a name, model (gpt-5), and clear instructions about its purpose.
  • The agent's instructions tell it that it can access Elastic Email and help with queries, inserts, updates, authentication, and fetching database information.
  • The tools array includes a hostedMcpTool that connects to the MCP server URL we created earlier.
  • The headers object includes the Composio API key for secure authentication with the MCP server.
  • requireApproval: 'never' means the agent can execute Elastic Email operations without asking for permission each time, making interactions smoother.
9

Start chat loop and handle conversation

// Keep conversation state across turns
const conversationSession = new OpenAIConversationsSession();

// Simple CLI
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'You: ',
});

console.log('\nComposio Tool Router session created.');
console.log('\nChat started. Type your requests below.');
console.log("Commands: 'exit', 'quit', or 'q' to end\n");

try {
  const first = await run(agent, 'What can you help me with?', { session: conversationSession });
  console.log(`Assistant: ${first.finalOutput}\n`);
} catch (e) {
  console.error('Error:', e instanceof Error ? e.message : e, '\n');
}

rl.prompt();

rl.on('line', async (userInput) => {
  const text = userInput.trim();

  if (['exit', 'quit', 'q'].includes(text.toLowerCase())) {
    console.log('Goodbye!');
    rl.close();
    process.exit(0);
  }

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

  try {
    const result = await run(agent, text, { session: conversationSession });
    console.log(`\nAssistant: ${result.finalOutput}\n`);
  } catch (e) {
    console.error('Error:', e instanceof Error ? e.message : e, '\n');
  }

  rl.prompt();
});

rl.on('close', () => {
  console.log('\n👋 Session ended.');
  process.exit(0);
});
What's happening:
  • The program prints a session URL that you visit to authorize Elastic Email.
  • After authorization, the chat begins.
  • Each message you type is processed by the agent using run().
  • The responses are printed to the console.
  • Typing exit, quit, or q cleanly ends the chat.

Complete Code

Here's the complete code to get you started with Elastic Email and OpenAI Agents SDK:

import 'dotenv/config';
import { Composio } from '@composio/core';
import { OpenAIAgentsProvider } from '@composio/openai-agents';
import { Agent, hostedMcpTool, run, OpenAIConversationsSession } from '@openai/agents';
import * as readline from 'readline';

const composioApiKey = process.env.COMPOSIO_API_KEY;
const userId = process.env.USER_ID;

if (!composioApiKey) {
  throw new Error('COMPOSIO_API_KEY is not set. Create a .env file with COMPOSIO_API_KEY=your_key');
}
if (!userId) {
  throw new Error('USER_ID is not set');
}

// Initialize Composio
const composio = new Composio({
  apiKey: composioApiKey,
  provider: new OpenAIAgentsProvider(),
});

async function main() {
  // Create Tool Router session
  const session = await composio.create(userId as string, {
    toolkits: ['elastic_email'],
  });
  const mcpUrl = session.mcp.url;

  // Configure agent with MCP tool
  const agent = new Agent({
    name: 'Assistant',
    model: 'gpt-5',
    instructions:
      'You are a helpful assistant that can access Elastic Email. Help users perform Elastic Email operations through natural language.',
    tools: [
      hostedMcpTool({
        serverLabel: 'tool_router',
        serverUrl: mcpUrl,
        headers: { 'x-api-key': composioApiKey },
        requireApproval: 'never',
      }),
    ],
  });

  // Keep conversation state across turns
  const conversationSession = new OpenAIConversationsSession();

  // Simple CLI
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: 'You: ',
  });

  console.log('\nComposio Tool Router session created.');
  console.log('\nChat started. Type your requests below.');
  console.log("Commands: 'exit', 'quit', or 'q' to end\n");

  try {
    const first = await run(agent, 'What can you help me with?', { session: conversationSession });
    console.log(`Assistant: ${first.finalOutput}\n`);
  } catch (e) {
    console.error('Error:', e instanceof Error ? e.message : e, '\n');
  }

  rl.prompt();

  rl.on('line', async (userInput) => {
    const text = userInput.trim();

    if (['exit', 'quit', 'q'].includes(text.toLowerCase())) {
      console.log('Goodbye!');
      rl.close();
      process.exit(0);
    }

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

    try {
      const result = await run(agent, text, { session: conversationSession });
      console.log(`\nAssistant: ${result.finalOutput}\n`);
    } catch (e) {
      console.error('Error:', e instanceof Error ? e.message : e, '\n');
    }

    rl.prompt();
  });

  rl.on('close', () => {
    console.log('\nSession ended.');
    process.exit(0);
  });
}

main().catch((err) => {
  console.error('Fatal error:', err);
  process.exit(1);
});

Conclusion

This was a starter code for integrating Elastic Email MCP with OpenAI Agents SDK to build a functional AI agent that can interact with Elastic Email.

Key features:

  • Hosted MCP tool integration through Composio's Tool Router
  • SQLite session persistence for conversation history
  • Simple async chat loop for interactive testing
You can extend this by adding more toolkits, implementing custom business logic, or building a web interface around the agent.
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. OpenAI Agents SDK 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