LABSCO SUMMARY
Scoped to one team and one default channel, on purpose.
The server reads and posts only in the channels of the TEAM_ID you configure, defaulting to TEAMS_CHANNEL_ID — so the blast radius of pointing an assistant at your workspace is one channel, not the tenant. The cost is the setup: the Entra application, bot registration and Teams app publishing are all real steps, and the repository's setup document is a map rather than a script.
What it is
A Teams integration that reads and writes messages in one channel: start threads, reply to them, mention members, and list who is in the team.
What you get
- Start a thread in a channel with a title and contents, mentioning users
- Reply into an existing thread, mentioning users
- Read the replies on a thread
- Read channel messages
- List the members of the channel's team
Requirements
Python 3.12 and uv. Five environment variables: TEAMS_APP_ID, TEAMS_APP_PASSWORD, TEAMS_APP_TENANT_ID, TEAM_ID and TEAMS_CHANNEL_ID. Behind those sits real Azure setup — a Microsoft Entra ID application with a client secret, an Azure Bot registered against it and connected to the Teams channel, and a Teams app installed into the group. No web app needs deploying. Runs over stdio by default, or streamable-http; a prebuilt image is published on ghcr.io.
Setup effort
Run a container — pull the image and point your client at it
USE CASES
01
Opening a thread that pulls the right people in
Start it with a title and body, mentioning the members who need to see it.
02
Following up on a discussion you missed
Read a thread's replies and add yours without switching to Teams.
03
Posting an update from a workflow
Have the agent that finished a job announce it in the channel that cares.
04
Working out who to mention
List the channel's team members first, then write the message.
BEFORE YOU INSTALL
What to know first
Requires
- Docker
- A Microsoft Entra ID application (its ID, client secret and tenant), an Azure Bot connected to the Teams channel, and a Teams app installed in the team — set up as in the repository's doc/MS-Teams-setup.md
- The Teams team ID and channel ID (channel ID with URL-escaped characters)
- TEAMS_APP_ID in your environment
- TEAMS_APP_PASSWORD in your environment
- TEAMS_APP_TENANT_ID in your environment
- TEAM_ID in your environment
- TEAMS_CHANNEL_ID in your environment
INSTALLATION
Connect your client
This one is configured rather than run — your client needs the configuration block, not a command.
Server setup
JSON
{
"mcpServers": {
"msteams": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"TEAMS_APP_ID",
"-e",
"TEAMS_APP_PASSWORD",
"-e",
"TEAMS_APP_TENANT_ID",
"-e",
"TEAM_ID",
"-e",
"TEAMS_CHANNEL_ID",
"ghcr.io/inditextech/mcp-teams-server"
],
"env": {
"TEAMS_APP_ID": "<YOUR_TEAMS_APP_ID>",
"TEAMS_APP_PASSWORD": "<YOUR_TEAMS_APP_PASSWORD>",
"TEAMS_APP_TENANT_ID": "<YOUR_TEAMS_APP_TENANT_ID>",
"TEAM_ID": "<YOUR_TEAM_ID>",
"TEAMS_CHANNEL_ID": "<YOUR_TEAMS_CHANNEL_ID>",
"DOCKER_HOST": "unix:///var/run/docker.sock"
}
}
}
}<YOUR_TEAMS_APP_ID> and <YOUR_TEAMS_APP_PASSWORD> are the Microsoft Entra ID application's ID and client secret, <YOUR_TEAMS_APP_TENANT_ID> its tenant, <YOUR_TEAM_ID> the Teams group or team ID, and <YOUR_TEAMS_CHANNEL_ID> the channel ID with URL-escaped characters. The repository's doc/MS-Teams-setup.md covers the Azure Bot and Teams app setup behind them.