How to integrate Mx toolbox MCP with LangChain

This guide walks you through connecting Mx toolbox to LangChain using the Composio tool router. By the end, you'll have a working Mx toolbox agent that can check if your domain is blacklisted, get current mx records for example.com, run a ping test on our mail server through natural language commands. This guide will help you understand how to give your LangChain agent real control over a Mx toolbox account through Composio's Mx toolbox MCP server. Before we dive in, let's take a quick look at the key ideas and tools involved.

Mx toolbox logoMx toolbox
Api Key

MxToolbox is a network diagnostic and monitoring service with advanced DNS, blacklist, and email health tools. It helps IT teams quickly troubleshoot and ensure reliable email and network performance.

13 Tools

Introduction

This guide walks you through connecting Mx toolbox to LangChain using the Composio tool router. By the end, you'll have a working Mx toolbox agent that can check if your domain is blacklisted, get current mx records for example.com, run a ping test on our mail server through natural language commands.

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

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

Also integrate Mx toolbox with

TL;DR

Here's what you'll learn:
  • Get and set up your OpenAI and Composio API keys
  • Connect your Mx toolbox project to Composio
  • Create a Tool Router MCP session for Mx toolbox
  • Initialize an MCP client and retrieve Mx toolbox tools
  • Build a LangChain agent that can interact with Mx toolbox
  • Set up an interactive chat interface for testing

What is LangChain?

LangChain is a framework for developing applications powered by language models. It provides tools and abstractions for building agents that can reason, use tools, and maintain conversation context.

Key features include:

  • Agent Framework: Build agents that can use tools and make decisions
  • MCP Integration: Connect to external services through Model Context Protocol adapters
  • Memory Management: Maintain conversation history across interactions
  • Multi-Provider Support: Works with OpenAI, Anthropic, and other LLM providers

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

The Mx toolbox MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Mx toolbox account. It provides structured and secure access to network diagnostic and email health tools, so your agent can perform actions like DNS lookups, blacklist checks, email authentication analysis, and connectivity testing on your behalf.

  • Automated DNS and MX record lookups: Instantly retrieve DNS, MX, DKIM, DMARC, and MTA-STS records for any domain to verify configuration and troubleshoot email delivery issues.
  • Blacklist monitoring and alerting: Check if your domain or IP is listed on common blacklists, helping you stay ahead of email deliverability problems and security risks.
  • Email authentication validation: Validate BIMI, DKIM, and DMARC records to ensure your domain's outgoing emails are properly authenticated and protected against spoofing.
  • Network and SMTP diagnostics: Run ping, HTTP, and SMTP lookups to diagnose connectivity issues, measure latency, or assess mail server responsiveness—no manual testing required.
  • Brand and security checks: Use BIMI and MTA-STS lookups to confirm your brand indicators and mail transport security policies are correctly published and compliant.

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 step10 STEPS
1

Prerequisites

Before starting this tutorial, make sure you have:
  • Python 3.10 or higher installed on your system
  • A Composio account with an API key
  • An OpenAI API key
  • Basic familiarity with Python and async programming
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
  • 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.
3

Install dependencies

npm install @composio/langchain @langchain/core @langchain/openai @langchain/mcp-adapters dotenv

Install the required packages for LangChain with MCP support.

What's happening:

  • @composio/langchain provides Composio integration for LangChain
  • @langchain/mcp-adapters enables MCP client connections
  • @langchain/core is the core agent framework
  • dotenv/config loads environment variables
4

Set up environment variables

bash
COMPOSIO_API_KEY=your_composio_api_key_here
COMPOSIO_USER_ID=your_composio_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's API
  • COMPOSIO_USER_ID identifies the user for session management
  • OPENAI_API_KEY enables access to OpenAI's language models
5

Import dependencies

import { Composio } from '@composio/core';
import { LangchainProvider } from '@composio/langchain';
import { MultiServerMCPClient } from "@langchain/mcp-adapters";
import { createAgent } from "langchain";
import * as readline from 'readline';
import 'dotenv/config';

dotenv.config();
What's happening:
  • We're importing LangChain's MCP adapter and Composio SDK
  • The dotenv/config import loads environment variables from your .env file
  • This setup prepares the foundation for connecting LangChain with Mx toolbox functionality through MCP
6

Initialize Composio client

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

if (!composioApiKey) throw new Error('COMPOSIO_API_KEY is not set');
if (!userId) throw new Error('COMPOSIO_USER_ID is not set');

async function main() {
    const composio = new Composio({
        apiKey: composioApiKey as string,
        provider: new LangchainProvider()
    });
What's happening:
  • We're loading the COMPOSIO_API_KEY from environment variables and validating it exists
  • Creating a Composio instance that will manage our connection to Mx toolbox tools
  • Validating that COMPOSIO_USER_ID is also set before proceeding
7

Create a Tool Router session

const session = await composio.create(
    userId as string,
    {
        toolkits: ['mx_toolbox']
    }
);

const url = session.mcp.url;
What's happening:
  • We're creating a Tool Router session that gives your agent access to Mx toolbox tools
  • The create method takes the user ID and specifies which toolkits should be available
  • The returned session.mcp.url is the MCP server URL that your agent will use
  • This approach allows the agent to dynamically load and use Mx toolbox tools as needed
8

Configure the agent with the MCP URL

const client = new MultiServerMCPClient({
    "mx_toolbox-agent": {
        transport: "http",
        url: url,
        headers: {
            "x-api-key": process.env.COMPOSIO_API_KEY
        }
    }
});

const tools = await client.getTools();

const agent = createAgent({ model: "gpt-5", tools });
What's happening:
  • We're creating a MultiServerMCPClient that connects to our Mx toolbox MCP server via HTTP
  • The client is configured with a name and the URL from our Tool Router session
  • getTools() retrieves all available Mx toolbox tools that the agent can use
  • We're creating a LangChain agent using the GPT-5 model
9

Set up interactive chat interface

let conversationHistory: any[] = [];

console.log("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
console.log("Ask any Mx toolbox related question or task to the agent.\n");

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

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;
    }

    conversationHistory.push({ role: "user", content: trimmedInput });
    console.log("\nAgent is thinking...\n");

    const response = await agent.invoke({ messages: conversationHistory });
    conversationHistory = response.messages;

    const finalResponse = response.messages[response.messages.length - 1]?.content;
    console.log(`Agent: ${finalResponse}\n`);
        
        rl.prompt();
    });

    rl.on('close', () => {
        console.log('\n👋 Session ended.');
        process.exit(0);
    });
What's happening:
  • We initialize an empty conversationHistory list to maintain context across interactions
  • A readline interface is used to continuously accept user input from the command line
  • When a user types a message, it's added to the conversation history and sent to the agent
  • The agent processes the request using the invoke() method with the full conversation history
  • Users can type 'exit', 'quit', or 'bye' to end the chat session gracefully
10

Run the application

main().catch((err) => {
    console.error('Fatal error:', err);
    process.exit(1);
});
What's happening:
  • We call the main() function to start the application

Complete Code

Here's the complete code to get you started with Mx toolbox and LangChain:

import { Composio } from '@composio/core';
import { LangchainProvider } from '@composio/langchain';
import { MultiServerMCPClient } from "@langchain/mcp-adapters";  
import { createAgent } from "langchain";
import * as readline from 'readline';
import 'dotenv/config';

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

if (!composioApiKey) throw new Error('COMPOSIO_API_KEY is not set');
if (!userId) throw new Error('COMPOSIO_USER_ID is not set');

async function main() {
    const composio = new Composio({
        apiKey: composioApiKey as string,
        provider: new LangchainProvider()
    });

    const session = await composio.create(
        userId as string,
        {
            toolkits: ['mx_toolbox']
        }
    );

    const url = session.mcp.url;
    
    const client = new MultiServerMCPClient({
        "mx_toolbox-agent": {
            transport: "http",
            url: url,
            headers: {
                "x-api-key": process.env.COMPOSIO_API_KEY
            }
        }
    });
    
    const tools = await client.getTools();
  
    const agent = createAgent({ model: "gpt-5", tools });
    
    let conversationHistory: any[] = [];
    
    console.log("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
    console.log("Ask any Mx toolbox related question or task to the agent.\n");
    
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
        prompt: 'You: '
    });

    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;
        }
        
        conversationHistory.push({ role: "user", content: trimmedInput });
        console.log("\nAgent is thinking...\n");
        
        const response = await agent.invoke({ messages: conversationHistory });
        conversationHistory = response.messages;
        
        const finalResponse = response.messages[response.messages.length - 1]?.content;
        console.log(`Agent: ${finalResponse}\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

You've successfully built a LangChain agent that can interact with Mx toolbox through Composio's Tool Router.

Key features of this implementation:

  • Dynamic tool loading through Composio's Tool Router
  • Conversation history maintenance for context-aware responses
  • Async Python provides clean, efficient execution of agent workflows
You can extend this further by adding error handling, implementing specific business logic, or integrating additional Composio toolkits to create multi-app workflows.
TOOLS

Supported Tools

Every Mx toolbox action and event your agent gets out of the box.

Lookup BIMI Record

Retrieves BIMI (Brand Indicators for Message Identification) record and diagnostic information for a domain.

Lookup Blacklist

Tool to perform a blacklist check on a domain or IP.

Lookup DKIM Record

Tool to retrieve DKIM (DomainKeys Identified Mail) records for a domain.

Lookup DMARC Record

Retrieves DMARC (Domain-based Message Authentication, Reporting & Conformance) records for a domain and performs validation checks.

Lookup DNS Records

Performs comprehensive DNS health check and retrieves name server records for a domain.

HTTP Lookup

Tool to perform an HTTP test on a domain.

Lookup MTA-STS Record

Tool to lookup MTA-STS record for a domain.

Lookup MX Records

Retrieves MX (Mail Exchange) records for a domain.

Ping Lookup

Performs a ping test to check network connectivity and measure round-trip time to a domain or IP address.

SMTP Lookup

Tool to perform an SMTP connectivity test on a domain.

Lookup SPF Record

Tool to retrieve SPF records for a specified domain.

Monitor Status

Retrieves the current status of all monitors configured in the MX Toolbox account.

Check Usage

Retrieve API usage statistics for DNS and network lookups.

FAQ

Frequently asked questions

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

Yes, you can. LangChain 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 Mx toolbox tools.

Yes, absolutely. You can configure which Mx toolbox 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 Mx toolbox data and credentials are handled as safely as possible.

Start with Mx toolbox.It takes 30 seconds.

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

Start building