Teams MCP服务器

一个独立的MCP服务器,提供Microsoft Teams、日历、语音/STT和Persona会议功能,支持原生模式(Graph API)和Persona模式(基于浏览器,无需Azure注册)。

  • by ruslanmv
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 ruslanmv/teams-mcp-server

使用说明

团队MCP服务器

独立 主控程序 暴露的服务器 微软Teams, 日历, 语音/STT,以及 Persona会议 能力。支持两种模式: 本土的 (图形API)和 角色 (基于浏览器,无Azure注册)。

专为 主页飞行员 但可与任何兼容MCP的客户端配合使用。


两种模式

本机模式 角色模式
Azure注册 必填项 不需要
运作原理 图形API读取您的会议聊天 无头浏览器以来宾身份加入
视频 N/A(仅限聊天) 静态人脸,带闲置动画
音频 通过ACS(支架) TTS通过虚拟麦克风输出
听力 通过ACS(支架) 标签音频捕获+耳语STT
聊天 图形API DOM自动化
最佳 企业版、完整的Graph API访问 快速入门、演示、人物角色会议
工具 27 8

快速入门——Persona模式(无Azure,无需注册)

将角色引入团队会议的最快方法:

1.安装

# Using make (auto-detects uv for faster installs)
make install
pip install -e ".[persona]"
playwright install chromium

# Or manually with uv
uv venv .venv --python python3.11
uv pip install --python .venv/bin/python -e ".[persona]"
playwright install chromium

2.配置(最小)

cp .env.example .env

编辑 .env --只需要加密密钥:

TEAMS_MCP_TOKEN_KEY=$(python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())")

对于角色模式, MS_CLIENT_ID 是 不需要.

3.跑步

teams-mcp
# Server starts on http://localhost:9106

4.加入会议

# Join as "Diana" with a face image
curl -s -X POST http://localhost:9106/rpc \
  -H 'Content-Type: application/json' \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "teams.persona.join",
      "arguments": {
        "join_url": "https://teams.microsoft.com/l/meetup-join/...",
        "display_name": "Diana",
        "face_image": "/path/to/diana.png"
      }
    },
    "id": 1
  }'

返回a session_id 用于所有后续呼叫。

5.互动

# Make the persona speak
curl -s -X POST http://localhost:9106/rpc \
  -H 'Content-Type: application/json' \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "teams.persona.speak",
      "arguments": {
        "session_id": "persona-1234567890",
        "text": "Hello everyone, I am Diana, your AI assistant."
      }
    },
    "id": 2
  }'

# Post in meeting chat
curl -s -X POST http://localhost:9106/rpc \
  -H 'Content-Type: application/json' \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "teams.persona.chat_post",
      "arguments": {
        "session_id": "persona-1234567890",
        "text": "Meeting notes will be shared after the call."
      }
    },
    "id": 3
  }'

# Listen to what others are saying
curl -s -X POST http://localhost:9106/rpc \
  -H 'Content-Type: application/json' \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "teams.persona.listen",
      "arguments": {
        "session_id": "persona-1234567890",
        "duration_ms": 5000
      }
    },
    "id": 4
  }'

# Leave
curl -s -X POST http://localhost:9106/rpc \
  -H 'Content-Type: application/json' \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "teams.persona.leave",
      "arguments": {"session_id": "persona-1234567890"}
    },
    "id": 5
  }'

Persona工作流(带HomePilot)

# Connect via HomePilot API (persona mode)
curl -X POST http://localhost:8000/v1/teams/bridge/connect \
  -H 'Content-Type: application/json' \
  -d '{
    "room_id": "room-abc-123",
    "join_url": "https://teams.microsoft.com/l/meetup-join/...",
    "mode": "persona",
    "display_name": "Diana",
    "face_image": "/data/faces/diana.png",
    "tts_voice": "en_US-amy-medium",
    "voice_enabled": true
  }'

快速启动-本机模式(Graph API)

对于具有完整Graph API访问权限的企业使用:

1.安装

# Using make (auto-detects uv for faster installs)
make install

# Or manually with uv
uv venv .venv --python python3.11
uv pip install --python .venv/bin/python -e .

# Or with pip
pip install -e .

2.生成加密密钥

python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

3.配置

cp .env.example .env

编辑 .env:

TEAMS_MCP_MS_CLIENT_ID=<your Azure app client ID>
TEAMS_MCP_TOKEN_KEY=<the Fernet key from step 2>
TEAMS_MCP_MS_TENANT_ID=common    # or your org tenant ID

4.跑步

teams-mcp
# Server starts on http://localhost:9106

5.身份验证

curl -s -X POST http://localhost:9106/rpc \
  -H 'Content-Type: application/json' \
  -d '{"method":"tools/call","params":{"name":"teams.auth.device_code_start","arguments":{}},"id":1}'

打开URL,输入代码,登录。然后轮询:

curl -s -X POST http://localhost:9106/rpc \
  -H 'Content-Type: application/json' \
  -d '{"method":"tools/call","params":{"name":"teams.auth.device_code_poll","arguments":{"device_code":"YOUR_CODE"}},"id":2}'

6.验证

curl -s http://localhost:9106/health | python -m json.tool
# Should show 35 tools

概述

                    ┌──────────────────────────────────────────────┐
                    │           Teams MCP Server :9106              │
                    │                                              │
                    │  NATIVE MODE (27 tools)                      │
  MS Graph API ───>│    Auth · Chat · Calendar · Meetings          │<── Any MCP Client
                    │    Voice/STT · ACS Audio                     │
                    │                                              │
                    │  PERSONA MODE (8 tools)                      │
  Headless        >│    Join · Leave · Status · Set Face           │
  Chromium         │    Speak · Listen · Chat Post · Chat Read     │
                    │                                              │
                    │  Endpoints:   GET /health     POST /rpc      │
                    └──────────────────────────────────────────────┘
类别 工具 模式 你能做什么
认证 4 本机 设备代码登录、状态、注销
聊天 2 本地 读取和发送聊天消息
团队和渠道 3 本地 列出团队、频道、发送消息
日历 3 本地 今天的活动、日期范围、加入链接
呼叫 1 本地 加入会议脚手架
会议聊天 4 Native 解析加入URL、阅读/发布聊天、列出成员
会议环节 3 本机 连接、状态、断开连接
语音/STT 4 共享 切换、配置、状态、转录音频
ACS音频 3 本机 通过Azure通信服务加入/离开/状态
Persona会议 8 角色 以客人身份加入,面对面,说话,倾听,聊天

Persona模式——工作原理

HomePilot                              teams-mcp-server
   │
   │── teams.persona.join ────────────► Launch headless Chromium
   │   {url, name, face_image}          Navigate to meeting URL
   │                                    Click "Join as guest"
   │                                    ◄── {session_id}
   │
   │── teams.persona.speak ───────────► piper-tts generates WAV
   │   {session_id, text}               Play to virtual mic
   │                                    Meeting hears persona speak
   │
   │── teams.persona.listen ──────────► Capture tab audio
   │   {session_id}                     Whisper STT transcribes
   │                                    ◄── {transcript}
   │
   │── teams.persona.chat_post ───────► Type in chat via DOM
   │── teams.persona.chat_read ───────► Scrape chat via DOM
   │── teams.persona.leave ───────────► Click Leave, close browser

团队看到了什么

  • 名为“Diana”的参与者(或您设置的任何显示名称)
  • 带有微妙空闲动画(摇摆+眨眼)的静态人脸图像
  • 角色说话时的语音输出(TTS)
  • 角色发布的聊天消息

需求

组件 用途 安装
Chromium 会议浏览器 playwright install chromium
剧作家 浏览器自动化 pip install -e ".[persona]"
piper tts 本地tts pip install piper-tts 或系统包
PulseAudio/PipeWire 虚拟音频接收器 通常预装在Linux上
OpenCV(无头) 人脸视频生成 包含在 [persona] 额外
更快的耳语 STT(可选) pip install -e ".[whisper]"

Azure Entra应用程序设置(仅限本机模式)

Personal / Free Account Setup

对于个人Microsoft帐户或测试:

  1. 首选 Azure门户>应用程序注册
  2. 新注册 >姓名: HomePilot Teams
  3. 支持的帐户类型: 仅限个人Microsoft帐户 (或“任何组织目录和个人账户”)
  4. 重定向URI:跳过
  5. 创建后> 认证 > 允许公共客户端流 =是
  6. API权限 >添加委托权限(见下表)
  7. 集 TEAMS_MCP_MS_TENANT_ID=common 在 .env
Enterprise / Organization Setup

对于贵公司具有企业功能的团队:

  1. 首选 Azure门户>应用程序注册
  2. 新注册 >姓名: HomePilot Teams
  3. 支持的帐户类型: 仅此组织目录中的帐户
  4. 重定向URI:跳过
  5. 创建后> 认证 > 允许公共客户端流 =是
  6. API权限 >添加委托权限(见下表)
  7. 授予[您的组织]管理员同意 (需要管理员)
  8. 集 TEAMS_MCP_MS_TENANT_ID=<your-tenant-id> 在 .env

查找您的租户ID:Azure门户>Microsoft Entra ID>概述>租户ID

要求的API权限(委派)

许可 风险 目的
User.Read 低 阅读您的个人资料
Chat.Read 低 阅读聊天消息
ChatMessage.Read 低 读取会议聊天消息
ChatMember.Read 低 列出会议参与者
Calendars.Read 低 读取日历事件
OnlineMeetings.Read 低 访问会议元数据
Chat.ReadWrite 中等 发送聊天消息
ChannelMessage.Send 中等 发送频道消息
Team.ReadBasic.All 低 列出已加入的团队
Channel.ReadBasic.All 低 列出频道

企业:与公司团队建立联系

如果您有一个企业Teams帐户和在本地运行的HomePilot:

运作原理

Your Company's Teams Meeting
    |
    |  Microsoft Graph API (reads YOUR chat as YOU)
    v
teams-mcp-server (localhost:9106)
    |
    |  JSON-RPC
    v
HomePilot (localhost)
    |
    └── Personas read meeting chat, react, post responses back

安全模型

  • 以您的身份进行身份验证 通过设备代码流(支持MFA、条件访问)
  • 仅访问您的数据 --您被邀请参加的会议、您正在进行的聊天、您加入的团队
  • 无法访问随机会议 -Graph API强制您的帐户权限
  • 所有数据都保留在本地 -聊天文本从Graph API发送到您的机器,没有任何外部转发
  • 您所在组织的身份验证策略适用 --SSO、MFA、条件接收均正常工作

您的IT管理员需要做什么(一次)

  1. 在Azure Entra ID中注册应用程序(请参阅上面的企业设置)
  2. 授予管理员对委派权限的同意
  3. 与您共享客户端ID

向IT推销:“这是一个本地应用程序,可以读取我自己的会议聊天记录,这样我的人工智能助理就可以在会议期间提供帮助。它使用我的凭据,在我的机器上运行,并遵循我们组织的所有身份验证政策。”

每个用户需要什么

  • 具有Teams访问权限的Microsoft 365帐户(工作或学校)
  • 这 MS_CLIENT_ID 从单一应用程序注册
  • 跑 teams.auth.device_code_start 一次验证

成本

组件 成本
Azure Entra应用程序注册 自由
设备代码认证流程 自由
Microsoft Graph API(聊天、日历) 自由 (包含在M365许可证中)
Persona模式(浏览器加入) 自由 (不需要Azure)
piper tts(当地tts) 自由 (在CPU上运行)
Whisper(当地STT) 自由 (在CPU上运行)
深度克(云STT) ~0.0043美元/分钟
Azure语音(云STT) 每月免费5小时,然后约1美元/小时
ACS音频捕获(未来) ~0.004美元/分钟(~0.24美元/小时)

原生模式和角色模式都是 完全免费 当使用本地STT/TTS时。


环境变量

变量 必填 默认 描述
TEAMS_MCP_TOKEN_KEY 是 -- 用于令牌加密的Fernet密钥
TEAMS_MCP_MS_CLIENT_ID 仅限本机 -- Azure应用程序客户端ID
TEAMS_MCP_MS_TENANT_ID 没有 common 您所在组织的租户ID
TEAMS_MCP_HOST 没有 0.0.0.0 服务器绑定地址
TEAMS_MCP_PORT 没有 9106 服务器端口
TEAMS_MCP_LOG_LEVEL 没有 INFO 日志级别
TEAMS_MCP_PERSONA_CHROME_PATH 否 自动 自定义Chromium路径
TEAMS_MCP_PERSONA_FACE_DIR 没有 ./data/faces 人脸图像目录
TEAMS_MCP_PERSONA_TTS_VOICE 没有 en_US-amy-medium 默认TTS语音
TEAMS_MCP_PERSONA_HEADLESS 没有 true 浏览器无头模式
TEAMS_MCP_PERSONA_STT_BACKEND 没有 whisper STT后端用于监听

工具参考

身份验证(本机模式)

工具 说明
teams.auth.device_code_start 通过设备代码流启动Microsoft登录
teams.auth.device_code_poll 轮询,直到发放访问令牌
teams.auth.status 检查身份验证状态
teams.auth.logout 清除存储的令牌

聊天(原生模式)

工具 说明
teams.chats.list_recent 列出最近的聊天记录(top 参数)
teams.chats.send_message 向聊天室发送消息

团队和频道(原生模式)

工具 说明
teams.teams.list_joined 列出所有加入的团队
teams.channels.list 列出团队中的频道
teams.channels.send_message 向频道发送消息

日历(本机模式)

工具 说明
teams.meetings.list_today 今天的日历事件(UTC)
teams.meetings.list_range 时间窗口中的事件(ISO时间戳)
teams.meetings.get_join_link 从事件ID获取会议加入URL

呼叫(本机模式)

工具 说明
teams.calls.join_meeting 以机器人身份加入会议(需要Azure infra)

会议聊天(本机模式)

工具 说明
teams.meeting_chat.resolve 解析团队加入URL以提取聊天线程ID
teams.meeting_chat.read 阅读会议聊天中的最新N条消息
teams.meeting_chat.post 在会议聊天中发布消息
teams.meeting_chat.members 列出具有角色的会议参与者

会议会话(本机模式)

工具 说明
teams.meeting.connect 连接到实时会议(创建跟踪会话)
teams.meeting.status 检查会话状态(或列出所有会话)
teams.meeting.disconnect 断开与会议会话的连接

语音/STT(共享)

工具 说明
teams.voice.toggle 启用/禁用语音转文本(默认:关闭)
teams.voice.status 当前语音配置(后端、语言、型号)
teams.voice.configure 更新STT设置(部分更新正常)
teams.voice.transcribe_chunk 将base64音频转录为文本片段

支持的STT后端:

后端 类型 安装 注意事项
Whisper 本地(CPU/GPU) pip install -e ".[whisper]" faster-whisper,型号:微型/底座/小型/中型/大型-v3
Deepgram 云 pip install -e ".[deepgram]" WebSocket流媒体,Nova-2型号
Azure语音 云 pip install -e ".[azure_speech]" Azure认知服务SDK
全部 -- pip install -e ".[stt]" 安装所有后端

ACS音频采集(本机模式)

工具 说明
teams.acs.join 通过Azure通信服务加入会议
teams.acs.status 检查ACS会话状态
teams.acs.leave 离开ACS会话

ACS工具目前是一个脚手架。完整的音频捕获需要 azure-communication-calling SDK和Azure中配置的ACS资源。

人物角色会议(人物角色模式)

工具 说明
teams.persona.join 通过无头浏览器以指定访客身份加入团队会议
teams.persona.leave 离开会议并关闭浏览器
teams.persona.status 会话健康检查(或列出所有角色会话)
teams.persona.set_face 为虚拟相机加载静态人脸图像
teams.persona.speak TTS文本和通过虚拟麦克风播放
teams.persona.listen 捕获会议音频并通过STT转录
teams.persona.chat_post 在会议聊天中发布消息(DOM自动化)
teams.persona.chat_read 读取最近的会议聊天消息(DOM抓取)

测试

# Using make (creates venv + installs deps automatically)
make test

# Or manually
pip install -e ".[test]"
pytest -v

测试包括:工具注册(35个工具)、URL解析、会话生命周期、, 语音状态、STT管道路由、ACS会话、OAuth作用域、模式 验证和角色工具论证验证。


HomePilot集成

在MCP网关配置中注册:

- name: hp-teams
  url: "http://localhost:9106/rpc"
  transport: "HTTP"
  description: "Microsoft Teams MCP server"

或添加到 server_catalog.yaml:

- id: hp-teams
  port: 9106
  description: "Microsoft Teams chats, channels, calendar, meetings, and persona join"
  category: communication
  auth_type: "Device Code"
  source:
    type: external
    git: https://github.com/ruslanmv/teams-mcp-server
    ref: master

建筑

┌──────────────────────────────────────────────────────────────────┐
│                     Teams MCP Server :9106                        │
│                                                                  │
│  NATIVE MODE                           PERSONA MODE              │
│  ┌─────────┐ ┌────────┐ ┌──────────┐  ┌──────────────────────┐  │
│  │  Auth    │ │  Chat  │ │ Calendar │  │  Persona Meeting     │  │
│  │ 4 tools │ │ 2 tools│ │ 3 tools  │  │  8 tools             │  │
│  └────┬────┘ └───┬────┘ └────┬─────┘  │                      │  │
│       │          │           │         │  join · leave · face  │  │
│  ┌────┴──────────┴───────────┴──┐      │  speak · listen      │  │
│  │   Microsoft Graph Client     │      │  chat_post/read      │  │
│  │   (auth/ + graph/)           │      └──────────┬───────────┘  │
│  └──────────────────────────────┘                  │              │
│                                                    ▼              │
│  ┌─────────┐ ┌──────────┐ ┌──────────┐  ┌────────────────────┐  │
│  │ Voice   │ │ Meeting  │ │   ACS    │  │  Browser Engine    │  │
│  │ 4 tools │ │ Sessions │ │ 3 tools  │  │  (Playwright)      │  │
│  └────┬────┘ │ 3 tools  │ └──────────┘  │                    │  │
│       │      └──────────┘                │  Headless Chromium │  │
│       ▼                                  │  + Virtual Cam     │  │
│  ┌────────────────────┐                  │  + Virtual Mic     │  │
│  │   STT Pipeline     │◄────────────────►│  + Tab Audio Cap   │  │
│  │  Whisper|Deepgram  │   (shared)       │  + DOM Chat I/O    │  │
│  └────────────────────┘                  └────────────────────┘  │
│                                                                  │
│  ┌────────────────────┐                  ┌────────────────────┐  │
│  │   TTS Pipeline     │                  │  Face Video Gen    │  │
│  │   Piper (local)    │                  │  OpenCV (idle anim)│  │
│  └────────────────────┘                  └────────────────────┘  │
│                                                                  │
│  Endpoints:   GET /health     POST /rpc                          │
└──────────────────────────────────────────────────────────────────┘
         ▲                              ▲
         │  MS Graph API / Chromium     │  JSON-RPC
         │                              │
    MS Teams                    HomePilot / MCP Client

码头工人

cd docker
docker compose up -d

贡献

  1. 分叉回购
  2. 创建要素分支
  3. 为新工具添加测试
  4. 跑 make test
  5. 提交PR

许可证

Copyright 2026 Teams MCP Server Contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.