How to integrate Discord MCP with CrewAI

This guide walks you through connecting Discord to CrewAI using the Composio tool router. By the end, you'll have a working Discord agent that can list all discord servers i belong to, show your connected accounts on discord, fetch your discord profile information through natural language commands. This guide will help you understand how to give your CrewAI agent real control over a Discord account through Composio's Discord MCP server. Before we dive in, let's take a quick look at the key ideas and tools involved.

Discord logoDiscord
Oauth2

Discord is a real-time messaging and VoIP platform for communities and teams. It lets users chat, share media, and collaborate across public and private channels.

27 Tools1 Triggers

Introduction

This guide walks you through connecting Discord to CrewAI using the Composio tool router. By the end, you'll have a working Discord agent that can list all discord servers i belong to, show your connected accounts on discord, fetch your discord profile information through natural language commands.

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

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

Also integrate Discord with

TL;DR

Here's what you'll learn:
  • Get a Composio API key and configure your Discord connection
  • Set up CrewAI with an MCP enabled agent
  • Create a Tool Router session or standalone MCP server for Discord
  • Build a conversational loop where your agent can execute Discord 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 Discord MCP server, and what's possible with it?

The Discord MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Discord account. It provides structured and secure access to your Discord profile, connected accounts, servers, and invites, so your agent can fetch user details, list your servers (guilds), retrieve invite info, and manage your Discord presence on your behalf.

  • Retrieve and manage user profile information: Your agent can fetch your Discord profile details, including email and connected third-party accounts, to help keep your data organized and up-to-date.
  • Server (guild) discovery and membership checks: Effortlessly list all servers you belong to and verify your membership status in any server.
  • Access invite details and server info: Instantly get information about specific Discord invite codes, including the destination server or channel details.
  • Guild member insights: Allow your agent to retrieve your own guild member information across servers, including permissions and roles.
  • OAuth2 application and authorization review: Let your agent fetch your app’s OAuth2 authorization details, so you always know what permissions are granted and when tokens expire.

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

Prerequisites

Before starting, make sure you have:
  • Python 3.9 or higher
  • A Composio account and API key
  • A Discord connection authorized in Composio
  • An OpenAI API key for the CrewAI LLM
  • Basic familiarity with Python
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

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

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
5

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 Discord MCP URL
6

Create a Composio Tool Router session for Discord

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

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

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.
8

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 Discord 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=["discord"],
)
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 Discord through Composio's Tool Router. The agent can perform Discord 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
TOOLS & TRIGGERS

Supported Tools and Triggers

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

Consume Entitlement

Marks a one-time purchase consumable entitlement as consumed for a given application.

Delete Test Entitlement

Deletes a currently active test entitlement for a given application.

Delete User Application Role Connection

Deletes the current user's application role connection for the specified application.

Edit Application Command Permissions

Edits the permissions for a specific application command in a guild.

Get Application Command Permissions

Retrieves the permissions for a specific application command in a guild.

Get Batch Application Command Permissions

Retrieves permissions for all commands of an application in a guild.

Get Current User Application Entitlements

Tool to retrieve entitlements for the current user for a given application.

Get Gateway

Tool to retrieve a valid WebSocket (wss) URL for establishing a Gateway connection to Discord.

Get Guild Template

Tool to retrieve information about a Discord guild template using its unique template code.

Get Guild Widget

Tool to retrieve the guild widget in JSON format.

Get Guild Widget PNG

Tool to retrieve a PNG image widget for a Discord guild.

Get my guild member

Retrieves the guild member object for the currently authenticated user within a specified guild, including roles, nickname, join date, and permissions.

Get my OAuth2 authorization

Retrieves current OAuth2 authorization details for the application, including app info, scopes, token expiration, and user data (contingent on scopes like 'identify').

Get My User

Fetches comprehensive profile information for the currently authenticated Discord user, including email if the 'email' scope is granted.

Get OpenID Connect userinfo

Retrieve OpenID Connect compliant user information for the authenticated user.

Get Public Keys

Tool to retrieve Discord OAuth2 public keys.

Get SKU Subscription

Retrieves a specific subscription by ID for a given SKU.

Get User

Retrieve information about a Discord user.

Get User Application Role Connection

Retrieves the application role connection for the currently authenticated user for a specified application.

Resolve Invite

Tool to resolve and retrieve information about a Discord invite code.

Leave Guild

Leaves a Discord guild (server) on behalf of the currently authenticated user.

List My Connections

Retrieves a list of the authenticated user's connected third-party accounts on Discord.

List My Guilds

Lists the current user's guilds, returning partial data for each; primarily used for displaying server lists or verifying memberships.

List SKU Subscriptions

Lists all subscriptions for a given SKU.

List Sticker Packs

Tool to retrieve all available Discord Nitro sticker packs.

Modify Current User

Modifies the currently authenticated Discord user's profile.

Update User Application Role Connection

Updates the application role connection for the currently authenticated user for a specified application.

FAQ

Frequently asked questions

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

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 Discord tools.

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

Start with Discord.It takes 30 seconds.

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

Start building