返回市场
微软团队会议MCP服务器

微软团队会议MCP服务器

作者:alivnavc2 星标更新:2025-08-11

项目介绍

Microsoft Teams MCP Server

一个用于安排、重新安排、取消 Microsoft Teams 面试并使用 Microsoft Graph API 管理日历事件的服务器。

功能

  • 使用与会者、主题和正文安排新的 Microsoft Teams 会议。
  • 通过更新开始和结束时间来重新安排现有会议。
  • 使用事件ID取消会议。
  • 列出团队日历事件,支持时区。
  • 获取 IANA 支持的时间区域列表,用于安排和过滤事件。

先决条件

  • Python 3.8 或更高版本。
  • 具有 Microsoft Graph API 权限的 Microsoft Azure AD 应用程序(例如,Calendars.ReadWriteUser.Read.All)。
  • 系统上安装了 gitpip
  • (可选)uv 用于运行服务器(通过 pip install uv 安装)。
  • (可选)ngrok 用于通过 HTTPS 暴露本地服务器(集成 OpenAI API 所需)。

安装

使用仓库源代码

  1. 克隆仓库:

    git clone https://github.com/your-username/teams-mcp-server.git
    cd teams-mcp-server
    
  2. 创建并激活虚拟环境:

    python -m venv venv
    # 在 Unix/Linux/MacOS 上:
    source venv/bin/activate
    # 在 Windows(命令提示符)上:
    venv\Scripts\activate
    # 在 Windows(PowerShell)上:
    .\venv\Scripts\Activate.ps1
    
  3. 安装依赖项:

    pip install -r requirements.txt
    
  4. 配置环境变量:

    • 在项目根目录创建一个 .env 文件。
    • 添加您的 Microsoft Graph API 凭证:
      MS_TENANT_ID=your_tenant_id
      MS_CLIENT_ID=your_client_id
      MS_CLIENT_SECRET=your_client_secret
      MS_USER_ID=your_user_id
      
  5. 运行服务器:

    python server.py
    

    或者,如果使用 uv

    uv run server.py
    
  6. 通过 Docker 部署(可选)

    拉取并运行 Docker 镜像,带 .env 文件

    docker pull alivnavc/microsoft-teams-mcp
    
    docker run -d -p 4200:4200 --name teams-mcp-server --env-file /path/to/.env alivnavc/microsoft-teams-mcp
    
    

    --env-file /path/to/.env 将本地 .env 文件中的环境变量加载到容器中 (将 /path/to/.env 替换为您实际的 .env 文件路径)

    验证容器是否正在运行

    docker ps
    

使用 PIP

  1. pip install microsoft-teams-mcp==1.1.4
    
  2. 使用以下代码
    from microsoft_teams_mcp import server
    server.main({
     "MS_TENANT_ID": "租户ID",
     "MS_CLIENT_ID": "客户端ID",
     "MS_CLIENT_SECRET": "客户端密钥",
     "MS_USER_ID": "用户ID"
     
    })
    
    运行命令:python filename.py
    

Azure AD 设置用于 Microsoft Graph API

要使用 Microsoft Graph API,您需要在 Microsoft Azure AD 中注册一个应用程序,并配置必要的权限。请遵循以下步骤(总结自 MS-Teams-setup.md):

  1. 注册 Azure AD 应用程序

    • 在 Azure 门户中创建一个 Microsoft Entra ID 应用程序。
    • 记录应用程序 UUID(设置为 .env 文件中的 MS_CLIENT_ID)。
    • 配置应用程序为单租户或多租户:
      • 对于单租户,将租户 UUID 存储在 MS_TENANT_ID 并设置 MS_APP_TYPE=SingleTenant
      • 对于多租户,在 Azure 中相应调整设置。
  2. 添加客户端密钥

    • 为您的 Azure AD 应用程序生成客户端密钥。
    • 将密钥存储在 .env 文件中的 MS_CLIENT_SECRET
  3. 配置 Microsoft Graph API 权限

    • 向您的 Azure AD 应用程序添加 Calendars.ReadWrite 权限(以及可选的 User.Read.All 权限以列出事件)。
    • 确保权限已获得管理员同意。
  4. Azure Bot 注册(可选)

    • 如果要与 Microsoft Teams 通道集成,请使用相同的 MS_CLIENT_ID 注册一个 Azure Bot。
    • 将机器人连接到 Teams 通道,并配置其使用 Microsoft Graph API。

详细说明,请参阅 MS-Teams-setup.md

使用方法

当本地运行时,默认情况下服务器运行在 http://localhost:4200/mcp/。它暴露了一个 JSON-RPC API 用于与 Microsoft Teams 会议和日历进行交互。

重要注意事项

  • Microsoft 的 MCP 服务器:Microsoft 提供了一个 MCP 服务器用于管理 Teams 会议,但某些工具(如带有自定义与会者的调度、重新安排、取消以及支持时区的日历事件列表)发现缺失或不足。此项目旨在解决这些差距,提供了一个带有上述工具的自定义实现。
  • 存储事件ID:使用 schedule_teams_meeting 调度会议时,响应包括一个 event_id。请将其存储在一个数据库或本地文件(如 JSON 或 CSV)中,因为重新安排 (reschedule_teams_meeting) 或取消 (cancel_teams_meeting) 会议时需要该 ID。例如,您可以将 event_id 和相关元数据(如会议主题、日期)保存在 SQLite 数据库或 JSON 文件中以便轻松检索。
  • OpenAI API 集成:如果您计划将此服务器与 OpenAI API 集成,请注意 OpenAI 需要 HTTPS 端点。本地服务器 (http://localhost:4200/mcp/) 不适用于 OpenAI。使用 ngrok 暴露本地服务器的 HTTPS URL:
    1. 安装 ngrok(例如,通过 npm install -g ngrok 或从 ngrok.com 下载)。
    2. 运行:
      ngrok http 4200
      
      以生成一个 HTTPS URL(例如,https://your-ngrok-subdomain.ngrok.io)。
    3. 使用 ngrok URL(例如,https://your-ngrok-subdomain.ngrok.io/mcp/)作为 OpenAI API 集成的端点。

在服务器上部署

  1. 将应用程序部署到服务器(例如,AWS EC2,Azure VM)。
  2. 更新客户端中的服务器 URL 为服务器的公共 IP 地址或域名(例如,http://your-server-ip:4200/mcp/)。
  3. 使用反向代理如 Nginx 为生产环境启用 HTTPS。
  4. 使用环境变量保护敏感数据(例如,API 凭证)。

API 使用

服务器使用 FastMCP 框架暴露 JSON-RPC 端点,用于管理 Microsoft Teams 会议和日历。以下是可用工具及其特性和如何使用它们的示例 JSON-RPC 负载。

1. schedule_teams_meeting

描述:根据指定的主题、开始/结束时间(UTC,ISO 8601 格式)、会议正文和必需的与会者安排一个新的 Microsoft Teams 会议。

特性

  • 创建一个具有唯一加入 URL 的 Teams 会议。
  • 支持多个具有电子邮件地址和姓名的与会者。
  • 允许 HTML 或纯文本的会议正文。
  • 成功安排后返回事件ID和加入URL。请存储 event_id 用于重新安排或取消会议。

使用方法

  • 方法tools/call
  • 参数
    • subject(字符串):会议标题。
    • body(字符串):会议描述(HTML 或纯文本)。
    • start_time(字符串):会议开始时间,ISO 8601 UTC 格式(例如,2025-09-10T18:00:00Z)。
    • end_time(字符串):会议结束时间,ISO 8601 UTC 格式。
    • required_attendees(列表):与会者对象列表,每个对象包含 email(有效电子邮件)和 name(字符串)。

示例负载

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "schedule_teams_meeting",
    "arguments": {
      "subject": "技术面试 - 后端工程师",
      "body": "尊敬的候选人:<br><br>请参加您的微软 Teams 面试。<br><br>敬礼,<br>招聘团队",
      "required_attendees": [
        {
          "email": "example@domain.com",
          "name": "Alice Applicant"
        }
      ],
      "start_time": "2025-09-10T18:00:00Z",
      "end_time": "2025-09-10T19:00:00Z"
    }
  }
}

示例响应

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "event_id": "AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE2MjEzNzAwMQBGAAAAAADbWWPmN-qjQqZ5uOjCatRNBwD4kwMhw138Q6oKJi3U2FGBAAAAAAENAAD4kwMhw138Q6oKJi3U2FGBAAFJIBYCAAA",
    "join_url": "https://teams.microsoft.com/l/meetup-join/..."
  }
}

2. reschedule_teams_meeting

描述:通过更新其开始和结束时间来重新安排现有的 Microsoft Teams 会议。

特性

  • 使用事件ID更新现有会议的开始和结束时间。
  • 维持其他会议详情(例如,与会者、主题)。
  • 成功重新安排后返回事件ID。
  • 需要从之前安排的会议获取 event_id

使用方法

  • 方法tools/call
  • 参数
    • event_id(字符串):要重新安排的会议的 Microsoft Graph 事件ID。
    • start_time(字符串):新开始时间,ISO 8601 UTC 格式。
    • end_time(字符串):新结束时间,ISO 8601 UTC 格式。

示例负载

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "reschedule_teams_meeting",
    "arguments": {
      "event_id": "AAMkADE1MzJlYTAwLWRkZTMtNDAyMy04ZTk2LTljOTI4OWRjYjg5MABGAAAAAABaL71tdJQET4NwOuYku0EHBwC7MkKjdoRHQ4cHEDY3mToXAAAAAAENAAC7MkKjdoRHQ4cHEDY3mToXAAFPchCuAAA=",
      "start_time": "2025-09-07T14:00:00Z",
      "end_time": "2025-09-07T16:00:00Z"
    }
  }
}

示例响应

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "event_id": "AAMkADE1MzJlYTAwLWRkZTMtNDAyMy04ZTk2LTljOTI4OWRjYjg5MABGAAAAAABaL71tdJQET4NwOuYku0EHBwC7MkKjdoRHQ4cHEDY3mToXAAAAAAENAAC7MkKjdoRHQ4cHEDY3mToXAAFPchCuAAA=",
    "join_url": ""
  }
}

3. cancel_teams_meeting

描述:使用事件ID取消现有的 Microsoft Teams 会议。

特性

  • 从日历中删除会议。
  • 成功取消后返回确认消息。
  • 需要从之前安排的会议获取 event_id

使用方法

  • 方法tools/call
  • 参数
    • event_id(字符串):要取消的会议的 Microsoft Graph 事件ID。

示例负载

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "cancel_teams_meeting",
    "arguments": {
      "event_id": "AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE2MjEzNzAwMQBGAAAAAADbWWPmN-qjQqZ5uOjCatRNBwD4kwMhw138Q6oKJi3U2FGBAAAAAAENAAD4kwMhw138Q6oKJi3U2FGBAAFJIBYCAAA"
    }
  }
}

示例响应

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "message": "面试 'AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE2MjEzNzAwMQBGAAAAAADbWWPmN-qjQqZ5uOjCatRNBwD4kwMhw138Q6oKJi3U2FGBAAAAAAENAAD4kwMhw138Q6oKJi3U2FGBAAFJIBYCAAA' 已在 Teams 中取消。"
  }
}

4. list_team_calendar_events

描述:列出指定团队成员在给定日期范围内和时区内的日历事件。

特性

  • 为多个电子邮件地址获取事件。
  • 支持自定义日期范围和时间,带有时区转换(IANA 时区,例如 America/Los_Angeles)。
  • 过滤事件以仅包括指定时间段内的事件。
  • 返回详细的事件信息(主题、开始/结束时间、地点、组织者、与会者、事件ID)。

使用方法

  • 方法tools/call
  • 参数
    • emails(列表):要获取事件的电子邮件地址列表。
    • start_date(字符串):开始日期,YYYY-MM-DD 格式。
    • end_date(字符串,可选):结束日期,YYYY-MM-DD 格式(如果没有提供,则默认为 start_date)。
    • start_time(字符串,可选):开始时间,HH:MM 格式(默认为 00:00)。
    • end_time(字符串,可选):结束时间,HH:MM 格式(默认为 23:59)。
    • time_zone(字符串,可选):IANA 时区(默认为 UTC)。

示例负载

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_team_calendar_events",
    "arguments": {
      "emails": ["example@domain.com"],
      "start_date": "2025-09-07",
      "time_zone": "America/Los_Angeles"
    }
  }
}

示例响应

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "status": "success",
    "start_date": "2025-09-07",
    "end_date": "2025-09-07",
    "start_time": "00:00",
    "end_time": "23:59",
    "time_zone": "America/Los_Angeles",
    "events": {
      "example@domain.com": [
        {
          "subject": "技术面试 - 后端工程师",
          "start": "2025-09-07 11:00",
          "end": "2025-09-07 12:00",
          "location": "Microsoft Teams 会议",
          "organizer": "招聘团队",
          "event_id": "AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE2MjEzNzAwMQBGAAAAAADbWWPmN-qjQqZ5uOjCatRNBwD4kwMhw138Q6oKJi3U2FGBAAAAAAENA