How to integrate ActiveTrail MCP with CrewAI

Framework Integration Gradient
ActiveTrail Logo
CrewAI Logo
divider

Introduction

This guide walks you through connecting ActiveTrail to CrewAI using the Composio tool router. By the end, you'll have a working ActiveTrail agent that can create a new email campaign for vip subscribers, add a contact to the 'newsletter' list, get open rates for last week's campaigns through natural language commands.

This guide will help you understand how to give your CrewAI agent real control over a ActiveTrail account through Composio's ActiveTrail MCP server.

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

TL;DR

Here's what you'll learn:
  • Get a Composio API key and configure your ActiveTrail connection
  • Set up CrewAI with an MCP enabled agent
  • Create a Tool Router session or standalone MCP server for ActiveTrail
  • Build a conversational loop where your agent can execute ActiveTrail operations

What is CrewAI?

CrewAI is a powerful framework for building multi-agent AI systems. It provides primitives for defining agents with specific roles, creating tasks, and orchestrating workflows through crews.

Key features include:

  • Agent Roles: Define specialized agents with specific goals and backstories
  • Task Management: Create tasks with clear descriptions and expected outputs
  • Crew Orchestration: Combine agents and tasks into collaborative workflows
  • MCP Integration: Connect to external tools through Model Context Protocol

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

The ActiveTrail MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your ActiveTrail account. It provides structured and secure access so your agent can perform ActiveTrail operations on your behalf.

Supported Tools & Triggers

Tools
Add Group MemberTool to add a member to a group in ActiveTrail.
Get Contact GrowthTool to retrieve executive report on contact growth showing daily active and inactive contact growth.
Create or Update Group MemberTool to create or update a member in a group.
Create a New GroupTool to create a new group in ActiveTrail.
Create ContactTool to create a new contact in ActiveTrail.
Create Content CategoryTool to create a new content category in ActiveTrail account.
Create New Mailing ListTool to create a new mailing list in ActiveTrail.
Create OrderTool to create new orders in ActiveTrail commerce system.
Create Smart Code SiteTool to create a new Smart Code site in ActiveTrail.
Create WebhookTool to create a new webhook for event notifications in ActiveTrail.
Delete content categoryTool to delete a specific content category by ID.
Delete group memberTool to delete a group member by ID.
Delete AutomationsTool to delete one or more automations from Active Trail.
Delete CampaignTool to remove a campaign from ActiveTrail account.
Delete ContactTool to remove a contact from the ActiveTrail account.
Delete group by IDTool to delete a group by ID.
Delete Group MemberTool to remove a member from a group in ActiveTrail.
Delete Mailing ListTool to remove a mailing list from ActiveTrail account.
Delete Mailing List MemberTool to remove a member from a mailing list in ActiveTrail.
Delete Smart Code SiteTool to remove a Smart Code site from ActiveTrail.
Delete TemplateTool to remove a template from ActiveTrail account.
Delete template categoryTool to delete a template category by ID.
Delete webhook parameterTool to delete a given webhook parameter from your account's webhook configuration.
Get Account BalanceTool to retrieve email and SMS credit balance for the account.
Get specific content categoryTool to retrieve specific category details by ID.
Get ActiveCommerce Integration DataTool to retrieve the account's ActiveCommerce integration data.
Get Account Merge StatusTool to check if the account has awaited merges.
Get List of All SMS Campaign ClickersTool to retrieve all contacts who clicked on links in an SMS campaign.
Get All Campaign ReportsTool to retrieve a full overview of all campaign reports with comprehensive metrics.
Get All GroupsTool to retrieve the full list of account groups with pagination and filtering.
Get All Sent CampaignsTool to retrieve campaigns with optional filtering by date, mailing list, and search criteria.
Get SMS Campaign Delivered ListTool to get a specific SMS campaign's delivered list data.
Get SMS Campaign Recipient DataTool to get a specific SMS campaign's 'sent to' data as a list.
Get SMS Campaign Unsubscribed ListTool to get a specific SMS campaign's unsubscribed data as a list.
Get Automation LogTool to track contacts through automation journey by retrieving detailed logs.
Get Automation Queue LogsTool to retrieve contacts that did not finish a specific automation.
Get Automation SMS Campaign Summary ReportTool to retrieve SMS campaigns' summary reports for a specific automation.
Get AutomationsTool to list account automations with filtering and pagination.
Get Automation DetailsTool to retrieve detailed configuration of a specific automation excluding step-by-step execution details.
Get Automation Email Campaign StepsTool to retrieve all email campaign steps in an automation workflow.
Get Automation SMS Campaign StepsTool to retrieve all SMS campaign steps in an automation workflow.
Get Automation Trigger TypesTool to retrieve all available start trigger options for automations.
Get Campaign BouncesTool to retrieve bounce details by domain for a specific campaign.
Get Campaign Click-Through DataTool to access click-through data for a specific campaign.
Get Campaign ComplaintsTool to retrieve contacts who reported a specific campaign as spam.
Get Campaign DesignTool to retrieve campaign design configuration including visual layout and HTML content.
Get Campaign Domains ReportTool to retrieve a report by domain for a specific campaign.
Get Campaign OpensTool to retrieve contacts who opened a specific campaign.
Get Campaign ReportTool to retrieve an overview report for a specific campaign.
Get Campaign Bounced Emails by TypeTool to retrieve bounced email details filtered by bounce type for a specific campaign.
Get Campaign Click Details ReportTool to retrieve click details report for a specific campaign.
Get Campaign Spam ComplaintsTool to retrieve contacts who reported a specific campaign as spam.
Get Campaign Email Activity ReportTool to retrieve all contacts' activity on a specific campaign.
Get Campaign Sent EmailsTool to retrieve contacts who received a specific campaign email.
Get Campaign Unopened ContactsTool to retrieve contacts who did not open a specific campaign.
Get Campaign SchedulingTool to retrieve campaign schedule configuration including timing and delivery settings.
Get Campaign by IDTool to retrieve complete campaign information including send settings, design, template, and A/B test configuration.
Get Campaign DetailsTool to retrieve detailed campaign information including name, subject, and settings.
Get Campaign by ID (Copy)Tool to retrieve complete campaign information including send settings, design, template, and A/B test configuration.
Get Campaign Segment SettingsTool to retrieve campaign sending settings including target groups and sending restrictions.
Get Sent CampaignsTool to retrieve a list of all sent campaigns from ActiveTrail.
Get Campaign TemplateTool to retrieve template details associated with a specific campaign.
Get Campaign Unopened ContactsTool to retrieve contacts who did not open a specific campaign.
Get Campaign Unsubscribed ContactsTool to retrieve contacts who unsubscribed from a specific email campaign.
Get Click Details by Link IDTool to retrieve click details for a specific link within a campaign.
Get Contact ActivityTool to retrieve contact's email engagement history including opens and clicks.
Get Contact BouncesTool to retrieve bounce activity for a specific contact by contact ID.
Get Contact FieldsTool to retrieve account contact fields filtered by type.
Get Contact GroupsTool to retrieve all groups associated with a specific contact.
Get Contact ListTool to retrieve account contacts filtered by status and date range.
Get Contact's ErrorsTool to retrieve bounce and error history for a specific contact.
Get Contact's Mailing ListsTool to retrieve all mailing lists associated with a specific contact.
Get Contacts MergesTool to retrieve contacts experiencing merge conflicts with filtering options.
Get Contacts Subscription All ContactsTool to get contacts' subscription status and the source of their status (if known).
Get Contacts Subscription StatusTool to get statistics of contacts' statuses from specific dates.
Get Contacts Subscription UnsubscribersTool to retrieve all contacts who unsubscribed and the source of their unsubscription status.
Get Contacts Unsubscribers SMSTool to retrieve all contacts who unsubscribed from receiving SMS messages.
Get Contacts With SMS StateTool to retrieve account's contacts list with SMS subscription state.
Get Content CategoriesTool to retrieve all content categories from the ActiveTrail account.
Get Customer Stats for Transactional MessageTool to retrieve customer interaction statistics for a specific transactional message.
Get Executive ReportTool to retrieve executive performance reports for the ActiveTrail account.
Get Group DetailsTool to retrieve detailed information about a specific group by its unique identifier.
Get Group by IDTool to retrieve detailed information about a specific group by its unique identifier.
Get Group Contents by IDTool to retrieve all group members by group ID with pagination and filtering.
Get Group Information for ContactTool to retrieve all groups that a specific contact belongs to by contact ID.
Get Group EventsTool to retrieve all events for a specific group with optional filtering by event type, event date, and subscriber creation date.
Get Landing PagesTool to retrieve landing pages from the ActiveTrail account with pagination support.
Get Mailing ListTool to retrieve detailed information about a specific mailing list by its unique identifier.
Get Mailing List MembersTool to retrieve all members belonging to a specific mailing list.
Get Mailing ListsTool to retrieve all mailing lists from the ActiveTrail account.
Get OrderTool to retrieve complete details of a specific order from ActiveTrail commerce system.
Get Push Campaign OpensTool to retrieve contacts who opened a specific push notification campaign.
Get Push Campaign Delivered ReportTool to retrieve contacts who successfully received a specific push notification campaign.
Get Push Campaign Failed Delivery ReportTool to retrieve the failed delivery report for a specific push campaign.
Get Push Campaign ReportsTool to retrieve push notification campaign performance metrics and reports.
Get Push Campaign Sent ReportTool to retrieve contacts who were sent a specific push notification campaign.
Get Push Campaign Report SummaryTool to retrieve summary report information of Push campaigns by dates.
Get Push CampaignsTool to retrieve push notification campaigns with optional filtering by date, campaign ID, and search criteria.
Get Segmentation Rule Field TypesTool to retrieve dictionary of rule field types for segmentation.
Get Segmentation Rule OperationsTool to retrieve dictionary of rule operations for segmentation.
Get Segmentation Rule TypesTool to retrieve dictionary of segmentation rule types for automation.
Get SegmentationsTool to retrieve all segmentations from the ActiveTrail account.
Get Sending ProfilesTool to retrieve account email sending profiles.
Get Signup FormTool to retrieve detailed information about a specific signup form by its unique identifier.
Get Signup FormsTool to retrieve all signup forms from the ActiveTrail account.
Get Smart Code SitesTool to retrieve all Smart Code sites from the ActiveTrail account.
Get SMS Campaign by IDTool to retrieve detailed information about a specific SMS campaign by its unique identifier.
Get SMS Campaign ClickersTool to access link click data for SMS campaigns.
Get SMS Campaign Delivered ReportTool to retrieve delivery confirmations for a specific SMS campaign.
Get SMS Operational Message by IDTool to retrieve operational SMS message details by unique identifier.
Get SMS Campaign Report ClicksTool to retrieve SMS clicks (on links) reports for a specific campaign.
Get SMS Campaign Failed Delivery ReportTool to retrieve the failed delivery report for a specific SMS campaign.
Get SMS Campaign ReportsTool to retrieve SMS campaign performance metrics and reports with filtering options.
Get SMS Campaign Sent Contacts ReportTool to retrieve all contacts that an SMS campaign was sent to.
Get SMS Campaign Report SummaryTool to retrieve summary report information of SMS campaigns by dates.
Get SMS Campaign Unsubscribed ContactsTool to retrieve contacts who unsubscribed from a specific SMS campaign.
Get SMS Sending ProfilesTool to retrieve SMS sending profiles configured for the account.
Get TemplateTool to retrieve detailed information about a specific template from the account's saved templates.
Get Template ContentTool to retrieve HTML content of a specific template.
Get TemplatesTool to retrieve saved templates from the ActiveTrail account.
Get Template CategoriesTool to retrieve all template categories from 'my templates' section.
Get Transactional Messages ClassificationTool to retrieve all classification options for operational/transactional messages.
Get Transactional SMS MessageTool to retrieve detailed information about a specific transactional SMS message by its unique identifier.
Get Two-Way SMS RepliesTool to retrieve virtual number SMS replies with filtering options.
Get Automation Update ActionsTool to retrieve all types of actions that can update a contact in an automation.
Get User Bounces by Campaign IDTool to retrieve specific user details of users that got a bounce by Campaign ID, filtered by bounce type.
Get User Social AccountsTool to retrieve social media accounts connected to the ActiveTrail account.
Get Webhook by IDTool to retrieve detailed information about a specific webhook by its unique identifier.
Get WebhooksTool to list account webhooks with optional filtering.
Get Webhook ParametersTool to retrieve webhook parameters for a specified webhook ID.
Import New ContactsTool to import new contacts into a group in ActiveTrail.
List Landing PagesTool to retrieve landing pages from ActiveTrail.
List Mailing ListsTool to list mailing lists from ActiveTrail account.
List Members Of A Mailing ListTool to get all information of your mailing list members by page, limited to 50 contacts each time.
List Sign-Up FormsTool to retrieve signup forms from the ActiveTrail account.
List SMS CampaignsTool to retrieve SMS campaigns with optional filtering by date, search term, and type.
Get Specific SMS CampaignTool to retrieve a specific SMS campaign by ID including full details like content, status, targeting, and scheduling.
List Transactional SMS MessagesTool to retrieve all SMS transactional messages with pagination support.
Create Campaign from TemplateTool to create a campaign using a specific template.
Create Template CategoryTool to create a new template category in ActiveTrail.
Update Webhook ParameterTool to update a given webhook parameter configuration in your ActiveTrail account.
Send Test Webhook RequestTool to send a test webhook request with configurable URL and parameters.
Update content categoryTool to update a specific content category by ID.
Update Campaign DetailsTool to update campaign details in ActiveTrail.
Update Campaign Segment SettingsTool to update campaign sending settings including groups and sending restrictions.
Remove Contact from Mailing ListTool to remove a contact from a mailing list in ActiveTrail.
Remove external contacts from groupTool to remove contacts from a group via external ID.
Test WebhookTool to send a test request for a given webhook by its ID.
Update CampaignTool to update draft campaigns in ActiveTrail.
Update Campaign DesignTool to update the design and HTML content of an email campaign in ActiveTrail.
Update Campaign SchedulingTool to configure send schedule for draft campaigns.
Update Campaign DetailsTool to update a campaign's details by ID in ActiveTrail.
Update Campaign TemplateTool to update the template associated with an email campaign in ActiveTrail.
Update ContactTool to update an existing contact's information by ID.
Update Contact DetailsTool to update an existing contact's information in ActiveTrail.
Update GroupTool to update an existing group by ID.
Rename GroupTool to rename a group's name in ActiveTrail.
Update OrderTool to modify existing orders in ActiveTrail commerce system.
Update Smart Code SiteTool to update an existing Smart Code site in ActiveTrail.
Update TemplateTool to update an existing template in ActiveTrail account.
Update Template ContentTool to update the HTML content of an email template in ActiveTrail.
Update WebhookTool to update an existing webhook configuration in ActiveTrail.

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

What is Tool Router?

Composio's Tool Router 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 Tool Router

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

How the Tool Router works

The Tool Router 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

Prerequisites

Before starting, make sure you have:
  • Python 3.9 or higher
  • A Composio account and API key
  • A ActiveTrail connection authorized in Composio
  • An OpenAI API key for the CrewAI LLM
  • Basic familiarity with Python

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
  • Log in to the Composio dashboard.
  • Navigate to your API settings and generate a new API key.
  • Store this key securely as you'll need it for authentication.

Install dependencies

bash
pip install composio crewai crewai-tools[mcp] python-dotenv
What's happening:
  • composio connects your agent to ActiveTrail via MCP
  • crewai provides Agent, Task, Crew, and LLM primitives
  • crewai-tools[mcp] includes MCP helpers
  • python-dotenv loads environment variables from .env

Set up environment variables

bash
COMPOSIO_API_KEY=your_composio_api_key_here
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 with Composio
  • USER_ID scopes the session to your account
  • OPENAI_API_KEY lets CrewAI use your chosen OpenAI model

Import dependencies

python
import os
from composio import Composio
from crewai import Agent, Task, Crew
from crewai_tools import MCPServerAdapter
import dotenv

dotenv.load_dotenv()

COMPOSIO_API_KEY = os.getenv("COMPOSIO_API_KEY")
COMPOSIO_USER_ID = os.getenv("COMPOSIO_USER_ID")

if not COMPOSIO_API_KEY:
    raise ValueError("COMPOSIO_API_KEY is not set")
if not COMPOSIO_USER_ID:
    raise ValueError("COMPOSIO_USER_ID is not set")
What's happening:
  • CrewAI classes define agents and tasks, and run the workflow
  • MCPServerHTTP connects the agent to an MCP endpoint
  • Composio will give you a short lived ActiveTrail MCP URL

Create a Composio Tool Router session for ActiveTrail

python
composio_client = Composio(api_key=COMPOSIO_API_KEY)
session = composio_client.create(user_id=COMPOSIO_USER_ID, toolkits=["active_trail"])

url = session.mcp.url
What's happening:
  • You create a ActiveTrail only session through Composio
  • Composio returns an MCP HTTP URL that exposes ActiveTrail tools

Initialize the MCP Server

python
server_params = {
    "url": url,
    "transport": "streamable-http",
    "headers": {"x-api-key": COMPOSIO_API_KEY},
}

with MCPServerAdapter(server_params) as tools:
    agent = Agent(
        role="Search Assistant",
        goal="Help users search the internet effectively",
        backstory="You are a helpful assistant with access to search tools.",
        tools=tools,
        verbose=False,
        max_iter=10,
    )
What's Happening:
  • Server Configuration: The code sets up connection parameters including the MCP server URL, streamable HTTP transport, and Composio API key authentication.
  • MCP Adapter Bridge: MCPServerAdapter acts as a context manager that converts Composio MCP tools into a CrewAI-compatible format.
  • Agent Setup: Creates a CrewAI Agent with a defined role (Search Assistant), goal (help with internet searches), and access to the MCP tools.
  • Configuration Options: The agent includes settings like verbose=False for clean output and max_iter=10 to prevent infinite loops.
  • Dynamic Tool Usage: Once created, the agent automatically accesses all Composio Search tools and decides when to use them based on user queries.

Create a CLI Chatloop and define the Crew

python
print("Chat started! Type 'exit' or 'quit' to end.\n")

conversation_context = ""

while True:
    user_input = input("You: ").strip()

    if user_input.lower() in ["exit", "quit", "bye"]:
        print("\nGoodbye!")
        break

    if not user_input:
        continue

    conversation_context += f"\nUser: {user_input}\n"
    print("\nAgent is thinking...\n")

    task = Task(
        description=(
            f"Conversation history:\n{conversation_context}\n\n"
            f"Current request: {user_input}"
        ),
        expected_output="A helpful response addressing the user's request",
        agent=agent,
    )

    crew = Crew(agents=[agent], tasks=[task], verbose=False)
    result = crew.kickoff()
    response = str(result)

    conversation_context += f"Agent: {response}\n"
    print(f"Agent: {response}\n")
What's Happening:
  • Interactive CLI Setup: The code creates an infinite loop that continuously prompts for user input and maintains the entire conversation history in a string variable.
  • Input Validation: Empty inputs are ignored to prevent processing blank messages and keep the conversation clean.
  • Context Building: Each user message is appended to the conversation context, which preserves the full dialogue history for better agent responses.
  • Dynamic Task Creation: For every user input, a new Task is created that includes both the full conversation history and the current request as context.
  • Crew Execution: A Crew is instantiated with the agent and task, then kicked off to process the request and generate a response.
  • Response Management: The agent's response is converted to a string, added to the conversation context, and displayed to the user, maintaining conversational continuity.

Complete Code

Here's the complete code to get you started with ActiveTrail and CrewAI:

python
from crewai import Agent, Task, Crew, LLM
from crewai_tools import MCPServerAdapter
from composio import Composio
from dotenv import load_dotenv
import os

load_dotenv()

GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
COMPOSIO_API_KEY = os.getenv("COMPOSIO_API_KEY")
COMPOSIO_USER_ID = os.getenv("COMPOSIO_USER_ID")

if not GOOGLE_API_KEY:
    raise ValueError("GOOGLE_API_KEY is not set in the environment.")
if not COMPOSIO_API_KEY:
    raise ValueError("COMPOSIO_API_KEY is not set in the environment.")
if not COMPOSIO_USER_ID:
    raise ValueError("COMPOSIO_USER_ID is not set in the environment.")

# Initialize Composio and create a session
composio = Composio(api_key=COMPOSIO_API_KEY)
session = composio.create(
    user_id=COMPOSIO_USER_ID,
    toolkits=["active_trail"],
)
url = session.mcp.url

# Configure LLM
llm = LLM(
    model="gpt-5",
    api_key=os.getenv("OPENAI_API_KEY"),
)

server_params = {
    "url": url,
    "transport": "streamable-http",
    "headers": {"x-api-key": COMPOSIO_API_KEY},
}

with MCPServerAdapter(server_params) as tools:
    agent = Agent(
        role="Search Assistant",
        goal="Help users with internet searches",
        backstory="You are an expert assistant with access to Composio Search tools.",
        tools=tools,
        llm=llm,
        verbose=False,
        max_iter=10,
    )

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

    conversation_context = ""

    while True:
        user_input = input("You: ").strip()

        if user_input.lower() in ["exit", "quit", "bye"]:
            print("\nGoodbye!")
            break

        if not user_input:
            continue

        conversation_context += f"\nUser: {user_input}\n"
        print("\nAgent is thinking...\n")

        task = Task(
            description=(
                f"Conversation history:\n{conversation_context}\n\n"
                f"Current request: {user_input}"
            ),
            expected_output="A helpful response addressing the user's request",
            agent=agent,
        )

        crew = Crew(agents=[agent], tasks=[task], verbose=False)
        result = crew.kickoff()
        response = str(result)

        conversation_context += f"Agent: {response}\n"
        print(f"Agent: {response}\n")

Conclusion

You now have a CrewAI agent connected to ActiveTrail through Composio's Tool Router. The agent can perform ActiveTrail operations through natural language commands.

Next steps:

  • Add role-specific instructions to customize agent behavior
  • Plug in more toolkits for multi-app workflows
  • Chain tasks for complex multi-step operations

How to build ActiveTrail MCP Agent with another framework

FAQ

What are the differences in Tool Router MCP and ActiveTrail MCP?

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

Can I use Tool Router MCP with CrewAI?

Yes, you can. CrewAI 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 ActiveTrail tools.

Can I manage the permissions and scopes for ActiveTrail while using Tool Router?

Yes, absolutely. You can configure which ActiveTrail 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.

How safe is my data with Composio Tool Router?

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 ActiveTrail data and credentials are handled as safely as possible.

Used by agents from

Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai
Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai
Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai

Never worry about agent reliability

We handle tool reliability, observability, and security so you never have to second-guess an agent action.