How to integrate Microsoft teams MCP with CrewAI

This guide walks you through connecting Microsoft teams to CrewAI using the Composio tool router. By the end, you'll have a working Microsoft teams agent that can add new member to project team, schedule an online meeting for sales, list all chats i’m part of through natural language commands. This guide will help you understand how to give your CrewAI agent real control over a Microsoft teams account through Composio's Microsoft teams MCP server. Before we dive in, let's take a quick look at the key ideas and tools involved.

Microsoft teams logoMicrosoft teams
Oauth2S2s Oauth2

Microsoft Teams is a collaboration platform that combines chat, meetings, and file sharing within Microsoft 365. It keeps distributed teams connected and productive through seamless virtual communication.

150 Tools

Introduction

This guide walks you through connecting Microsoft teams to CrewAI using the Composio tool router. By the end, you'll have a working Microsoft teams agent that can add new member to project team, schedule an online meeting for sales, list all chats i’m part of through natural language commands.

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

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

Also integrate Microsoft teams with

TL;DR

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

The Microsoft Teams MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Microsoft Teams account. It provides structured and secure access to your Teams workspace, so your agent can perform actions like managing chats, sending messages, creating meetings, and organizing teams on your behalf.

  • Automated chat and message management: Let your agent retrieve, read, and summarize messages from any Teams chat, or fetch all chats you’re part of for quick updates.
  • Team and channel organization: Easily create new teams, add members, get channel details, or archive and delete teams to keep your workspace organized.
  • Scheduling online meetings: Have your agent schedule standalone Teams meetings instantly, making it simple to coordinate with colleagues or clients without manual setup.
  • Granular access to team and chat details: Fetch full information about specific teams, channels, or even individual messages with precision, enabling rich contextual workflows.
  • Seamless membership and collaboration management: Add or update members in teams with a prompt, ensuring the right people always have access to the conversations and resources they need.

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 Microsoft teams 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 Microsoft teams 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 Microsoft teams MCP URL
6

Create a Composio Tool Router session for Microsoft teams

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

url = session.mcp.url
What's happening:
  • You create a Microsoft teams only session through Composio
  • Composio returns an MCP HTTP URL that exposes Microsoft teams 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 Microsoft teams 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=["microsoft_teams"],
)
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 Microsoft teams through Composio's Tool Router. The agent can perform Microsoft teams 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

Supported Tools

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

Add chat member

Tool to add a conversationMember to a Microsoft Teams chat.

Add tab to channel

Tool to add a new tab to a Microsoft Teams channel.

Add member to team

Tool to add a user to a Microsoft Teams team.

Add team members (bulk)

Tool to add multiple members to a Microsoft Teams team in a single operation.

Archive channel

Tool to archive a channel in a Microsoft Teams team.

Archive team channel

Tool to archive a channel in a Microsoft Teams team using the group ID.

Archive Teams team

Tool to archive a Microsoft Teams team.

Get all chats

Retrieves all Microsoft Teams chats a specified user is part of, supporting filtering, property selection, and pagination.

Clear Automatic Location

Tool to clear the automatic location from a user's presence in Microsoft Teams.

Clear User Preferred Presence

Tool to clear a user's preferred presence setting in Microsoft Teams.

Clear Presence

Tool to clear the presence information for a user's application presence session in Microsoft Teams.

Clear Presence Location

Tool to clear the authenticated user's presence location.

Clone Team

Tool to clone a Microsoft Teams team using the team ID.

Create Call Operation

Tool to create a new operation for a communications call.

Create a channel

Tool to create a new standard, private, or shared channel within a Microsoft Teams team.

Create Content Sharing Session

Tool to create a content sharing session in a Microsoft Teams call.

Create channel in group team

Tool to create a new channel in a group's associated team.

Create online meeting

Use to schedule a new standalone Microsoft Teams online meeting, i.

Create user offer shift request

Tool to create a new offer shift request in a user's joined team schedule.

Create open shifts

Tool to create a new open shift in a Microsoft Teams team schedule.

Create open shift change request

Tool to create a new open shift change request in a team schedule.

Create or get online meeting

Tool to create a new Microsoft Teams online meeting or retrieve an existing one based on externalId.

Create or update schedule

Tool to create or replace a schedule object for a Microsoft Teams team.

Create schedule day note

Tool to create a new day note in a team's schedule.

Create scheduling group

Tool to create a new scheduling group in a team's schedule.

Create team schedule shift

Tool to create a new shift in a Microsoft Teams team schedule.

Create Team

Tool to create a new Microsoft Teams team.

Create Team From Group

Tool to create a new team under an existing Microsoft 365 group.

Create time off

Tool to create a new timeOff instance in a team's schedule.

Create time off reason

Tool to create a new time off reason in a team's schedule.

Create time off request

Tool to create a new time off request in a team's schedule.

Create user online meeting

Tool to create a new Microsoft Teams online meeting for a specific user.

Delete Call Operation

Tool to delete a navigation property operation for a communications call.

Delete team channel

Tool to delete a channel from a Microsoft Teams team.

Delete team schedule day note

Tool to delete a day note from a Microsoft Teams schedule.

Delete open shift

Tool to delete an open shift from a Microsoft Teams schedule.

Delete team scheduling group

Tool to delete a scheduling group from a Microsoft Teams team schedule.

Delete team schedule shift

Tool to delete a shift from a Microsoft Teams team schedule.

Soft-delete Teams channel message

Tool to soft-delete a message in a Teams channel.

Delete channel tab

Tool to delete a tab from a Microsoft Teams channel.

Delete Teams team

Tool to delete a Microsoft Teams team.

Delete time off

Tool to delete a timeOff from a team's schedule.

Delete time off reason

Tool to delete a time off reason from a team's schedule.

Delete time off request

Tool to delete a time off request from a Microsoft Teams team schedule.

Delete User Online Meeting

Tool to delete an online meeting for a user.

Get call operation

Tool to get a specific commsOperation for a call.

Get team channel

Tool to get a specific channel in a team.

Get Teams channel message

Retrieves a specific message from a Microsoft Teams channel using its Team, Channel, and Message IDs.

Get channel message reply

Tool to retrieve a single reply to a message in a channel.

Get chat

Tool to retrieve a single chat by ID.

Get chat member

Tool to get a specific conversation member from a Microsoft Teams chat.

Get chat message

Tool to get a specific chat message.

Get day note

Tool to retrieve a specific day note from a team's schedule.

Get channel files folder

Tool to get the files folder (DriveItem) metadata for a specific channel in a Microsoft Teams team.

Get User Profile

Tool to retrieve a user's profile (id/UPN/mail/displayName).

Get offer shift request

Tool to get a specific offer shift request from a Microsoft Teams schedule.

Get online meeting

Tool to retrieve details of a specific Microsoft Teams online meeting by its ID.

Get open shift

Tool to get a specific open shift from a Microsoft Teams schedule.

Get open shift change request

Tool to retrieve a specific open shift change request from a Microsoft Teams team's schedule.

Get User Presence

Tool to get a specific user's presence information.

Get primary channel

Tool to get the default (General) channel of a team.

Get schedule

Tool to retrieve the properties and relationships of a schedule object.

Get scheduling group

Tool to retrieve a specific scheduling group from a Microsoft Teams team's schedule.

Get shift

Tool to retrieve a shift by ID from a Microsoft Teams team schedule.

Get swap shifts change request

Tool to get a specific swap shift change request from a Microsoft Teams schedule.

Get channel tab

Tool to get a specific tab in a Microsoft Teams channel.

Get Team

Tool to get a specific team.

Get team member

Tool to get a specific conversation member from a team.

Get Team Operation Status

Tool to retrieve the status of a Teams async operation using teamId and operationId.

Get installed app in team

Tool to get an installed app in a Microsoft Teams team.

Get time off by ID

Tool to retrieve a specific time off entry from a Microsoft Teams team's schedule by ID.

Get time off reason

Tool to get a specific time off reason from a team's schedule.

Get time off request

Tool to retrieve a specific time off request from a team's schedule.

Get user chat

Tool to retrieve a specific chat for a user.

Get User Teamwork

Tool to get userTeamwork settings for a specified user, including Microsoft Teams region and locale.

Hide chat for user

Tool to hide a Microsoft Teams chat for a specific user.

List user's associated teams

Tool to list teams that a user is associated with in Microsoft Teams.

List channel tabs

Tool to list tabs from a Microsoft Teams channel.

List Communications Call Operations

Tool to list operations on a Microsoft Teams call.

List deleted teams

Tool to list deleted Microsoft Teams and their properties.

List Group Team Operations

Tool to list operations on a group's team.

List team incoming channels

Tool to list incoming channels shared with a Microsoft Teams team.

List installed apps in team

Tool to list apps installed in a Microsoft Teams team.

List channel message replies

Tool to list all replies to a specific message in a Microsoft Teams channel.

List offer shift requests

Tool to list offer shift requests in a Microsoft Teams schedule.

List user online meetings

Look up a Microsoft Teams online meeting for a user by identifier.

List open shift change requests

Tool to list open shift change requests in a Microsoft Teams schedule.

List open shifts

Tool to list open shifts in a Microsoft Teams schedule.

List People

Retrieves a list of people relevant to a specified user from Microsoft Graph, noting the `search` parameter is only effective if `user_id` is 'me'.

List pinned messages

Tool to retrieve the list of pinned messages in a Microsoft Teams chat.

List team schedule day notes

Tool to list all dayNotes from a team's schedule.

List scheduling groups

Tool to list scheduling groups in a team's schedule.

List shifts

Tool to list shifts in a Microsoft Teams schedule.

List swap shifts change requests

Tool to list swap shift change requests in a Microsoft Teams schedule.

List team members

Tool to list members of a Microsoft Teams team.

List Team Operations

Tool to list operations from a team.

List teams permission grants

Tool to list all resource-specific permission grants for a team with support for filtering, pagination, and sorting.

List team time off entries

Tool to list time off entries from a Microsoft Teams team's schedule.

List team schedule time off reasons

Tool to get time off reasons from a team's schedule.

List time off requests

Tool to retrieve a list of time off requests from a Microsoft Teams team's schedule.

List user's chat members

Tool to list members of a specific chat for a user in Microsoft Teams.

List user chat messages

Tool to retrieve messages from a specific chat for a given user.

List user joined teams

Tool to list the Teams that a specified user is a direct member of (joined teams).

List users

Tool to list all users in the organization.

Mark chat as read for user

Tool to mark a chat as read for a specific user in Microsoft Teams.

Mark chat as unread for user

Marks a specific chat as unread for a user by setting the last read message timestamp.

Pin message in chat

Tool to pin a message in a Microsoft Teams chat.

Reply to Teams channel message

Sends a reply to an existing message, identified by `message_id`, within a specific `channel_id` of a given `team_id` in Microsoft Teams.

Provision channel email address

Tool to provision an email address for a Microsoft Teams channel.

Remove channel email address

Tool to remove the email address of a channel in Microsoft Teams.

Remove chat member

Tool to remove a member from a Microsoft Teams chat.

Remove team member

Tool to remove a member from a Microsoft Teams team.

Remove team members

Tool to remove multiple members from a Microsoft Teams team in bulk.

Search Teams files

Search files in Microsoft Teams using KQL syntax.

Search Teams messages

Search Microsoft Teams messages using powerful KQL syntax.

Send Activity Notification to Recipients

Tool to send activity notifications to specified recipients in Microsoft Teams.

Set Presence

Tool to set the presence information for a user's application presence session.

Set Presence Automatic Location

Tool to set the automatic presence location (office/remote/timeOff) for a specified user.

Set User Preferred Presence

Tool to set the preferred availability and activity status for a user.

Set User Presence Manual Location

Tool to set the manual presence location (office/remote/timeOff) for a specific user.

Share Team Schedule

Tool to share a Microsoft Teams schedule for a specified time range.

Create Chat

Creates a new chat; if a 'oneOnOne' chat with the specified members already exists, its details are returned, while 'group' chats are always newly created.

List Teams

Retrieves Microsoft Teams accessible by the authenticated user, allowing filtering, property selection, and pagination.

List channel messages

Tool to list messages in a Teams channel when team_id and channel_id are known (no chat_id required).

List team channels

Retrieves channels for a specified Microsoft Teams team ID (must be valid and for an existing team), with options to include shared channels, filter results, and select properties.

Send Channel Message

Posts a new top-level message to a channel in Microsoft Teams (does NOT reply to an existing message).

Send message to Teams chat

Sends a non-empty message (text or HTML) to a specified, existing Microsoft Teams chat; content must be valid HTML if `content_type` is 'html'.

Unarchive channel

Tool to unarchive a channel in a Microsoft Teams team.

Unarchive group team channel

Tool to unarchive a channel in a Microsoft Teams group's team.

Unarchive Teams team

Tool to unarchive a Microsoft Teams team.

Unhide Chat For User

Tool to unhide a chat for a specific user.

Unpin chat message

Tool to unpin a message from a Microsoft Teams chat.

Update Call

Tool to update the navigation property calls in Microsoft Teams communications.

Update Call Operation

Tool to update the navigation property operations in communications.

Update Call Participant

Tool to update a participant in a Microsoft Teams call.

Update Teams channel

Tool to update channel properties in a Microsoft Teams group.

Update Teams channel message

Tool to update a message in a channel.

Update Chat

Tool to update the properties of a chat.

Update Teams chat message

Tool to update a specific message in a chat.

Update Content Sharing Session

Tool to update a content sharing session in a Microsoft Teams call.

Update schedule day note

Tool to update an existing day note in a team's schedule.

Update online meeting

Tool to update the properties of an existing Microsoft Teams online meeting.

Update open shift

Tool to update an existing open shift in a Microsoft Teams team schedule.

Update scheduling group

Tool to replace/update a scheduling group in a team's schedule.

Update Teams channel tab

Tool to update the properties of a tab in a Microsoft Teams channel.

Update Team

Tool to update the properties of a team.

Update team member

Tool to update a team member's roles or properties in Microsoft Teams.

Update team schedule shift

Tool to update an existing shift in a Microsoft Teams team schedule.

Update time off

Tool to replace an existing timeOff entry in a team's schedule.

Update time off reason

Tool to update a time off reason in a team's schedule.

FAQ

Frequently asked questions

With a standalone Microsoft teams MCP server, the agents and LLMs can only access a fixed set of Microsoft teams tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Microsoft teams 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 Microsoft teams tools.

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

Start with Microsoft teams.It takes 30 seconds.

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

Start building