Teams会议管理服务器

一个基于Microsoft Graph API的服务器,用于调度、重新调度、取消Microsoft Teams会议并管理日历事件。

  • by Girish10-AGENTIC-AI
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 Girish10-AGENTIC-AI/Teams-MCP-Server

使用说明

Microsoft Teams MCP 服务器

一个服务器,用于通过Microsoft Graph API安排、重新安排、取消Microsoft Teams面试以及管理日历事件。

特点

  • 安排新的 Microsoft Teams 会议,包括参会者、主题和会议内容。
  • 通过更新现有会议的开始和结束时间来重新安排会议。
  • 使用事件ID取消会议。
  • 列出团队日历事件,并支持时区功能。
  • 获取IANA支持的时区列表,用于安排和筛选事件。

先决条件

  • Python 3.8 或更高版本。
  • 一个具有Microsoft Graph API权限的Microsoft Azure AD应用程序(例如。, Calendars.ReadWrite, User.Read.All)。
  • git 并且 pip 已安装在您的系统上。
  • (可选) 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
    # On Unix/Linux/MacOS:
    source venv/bin/activate
    # On Windows (Command Prompt):
    venv\Scripts\activate
    # On 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进行部署(可选)

    使用.env文件拉取并运行Docker镜像

    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": "Tenant ID",
     "MS_CLIENT_ID": "Client ID",
     "MS_CLIENT_SECRET": "Client Secret",
     "MS_USER_ID": "User Id"
     
    })
    
    Run the command : python filename.py
    

Azure AD 设置用于 Microsoft Graph API

要使用 Microsoft Graph API,您需要在 Microsoft Azure AD 中注册一个应用程序并配置必要的权限。请按照以下步骤操作(摘自 MS-Teams-安装指南.md):

  1. 注册一个Azure AD应用程序:

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

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

    • 添加 Calendars.ReadWrite 权限(以及可选地 User.Read.All 为您的 Azure AD 应用程序授予(用于列出事件)的权限。
    • 确保已授予管理员同意的权限。
  4. Azure 机器人注册(可选):

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

如需详细说明,请参阅 MS-Teams-安装配置.md。

使用方法

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

重要注意事项

  • 微软的MCP服务器微软提供了一个MCP服务器用于管理Teams会议,但发现某些工具(如自定义参会者日程安排、重新安排、取消以及支持时区的日历事件列表)缺失或不足。本项目旨在填补这些空白,提供以下所述工具的自定义实现。
  • 存储事件ID当使用(某工具或平台)安排会议时 schedule_teams_meeting,响应中包含一个 event_id将此ID存储在数据库或本地文件(例如,JSON或CSV)中,因为重排程时需要用到它reschedule_teams_meeting)或取消(cancel_teams_meeting) 会议。例如,你可以保存 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

描述安排一场新的 Microsoft Teams 会议,指定主题、开始/结束时间(使用 UTC 时间,ISO 8601 格式)、会议内容以及必到参会者。

特点/功能:

  • 创建一个带有唯一加入链接的 Teams 会议。
  • 支持具有电子邮件地址和姓名的多名参会者。
  • 允许在会议正文中使用HTML或纯文本。
  • 成功安排后,返回活动ID和加入链接。 存储 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": "Technical Interview - Backend Engineer",
      "body": "Dear candidate,<br><br>Please join the Microsoft Teams meeting for your interview.<br><br>Regards,<br>Recruitment Team",
      "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": "Interview 'AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE2MjEzNzAwMQBGAAAAAADbWWPmN-qjQqZ5uOjCatRNBwD4kwMhw138Q6oKJi3U2FGBAAAAAAENAAD4kwMhw138Q6oKJi3U2FGBAAFJIBYCAAA' canceled in 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": "Technical Interview - Backend Engineer",
          "start": "2025-09-07 11:00",
          "end": "2025-09-07 12:00",
          "location": "Microsoft Teams Meeting",
          "organizer": "Recruitment Team",
          "event_id": "AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE2MjEzNzAwMQBGAAAAAADbWWPmN-qjQqZ5uOjCatRNBwD4kwMhw138Q6oKJi3U2FGBAAAAAAENAAD4kwMhw138Q6oKJi3U2FGBAAFJIBYCAAA",
          "attendees": [
            {
              "emailAddress": {
                "address": "example@domain.com",
                "name": "Alice Applicant"
              },
              "type": "required"
            }
          ]
        }
      ]
    },
    "results": "[...]"
  }
}

5. get_teams_timezones

描述获取IANA支持的所有时区列表,用于安排或过滤日历事件。

特点/功能:

  • 返回由该(系统/工具)支持的IANA时区的完整列表 pytz 图书馆。
  • 对于确保其他API调用(例如,)的有效时区输入很有用。, list_team_calendar_events)。

使用方法:

  • 方法: tools/call
  • 参数无。

示例有效载荷:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_teams_timezones",
    "arguments": {}
  }
}

示例回复:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "message": "List of IANA-supported time zones. You can also check at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones",
    "timezones": [
      "Africa/Abidjan",
      "Africa/Accra",
      "America/Los_Angeles",
      ...
    ]
  }
}

列出可用工具

要检索所有可用工具的列表(例如,以发现 schedule_teams_meeting, reschedule_teams_meeting等),使用 tools/list 方法。

示例有效载荷:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {
    "cursor": "optional-cursor-value"
  }
}

示例回复:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "name": "schedule_teams_meeting",
        "description": "Schedule a Microsoft Teams meeting by specifying the subject, start/end times (ISO 8601 UTC), meeting body, and a list of required attendees..."
      },
      {
        "name": "reschedule_teams_meeting",
        "description": "Reschedule an existing interview in Microsoft Teams"
      },
      {
        "name": "cancel_teams_meeting",
        "description": "Cancel an interview in Microsoft Teams"
      },
      {
        "name": "list_team_calendar_events",
        "description": "List calendar events for team members between specified dates and times with timezone support"
      },
      {
        "name": "get_teams_timezones",
        "description": "List all IANA-supported time zones (used for scheduling and filtering calendar events)"
      }
    ],
    "next_cursor": null
  }
}

将您的大型语言模型(LLM)连接到MCP服务器

示例:OpenAI API

from openai import OpenAI

client = OpenAI(api_key="your_api_key_here")

resp = client.responses.create(
    model="gpt-4.1",
    tools=[
        {
            "type": "mcp",
            "server_label": "meetings_scheduler",
            "server_url": "https://yourdomain.com/mcp/",
            "require_approval": "never",
        },
    ],
    input="""
"Schedule a meeting titled 'Project Sync' starting at 2025-09-01T14:00:00Z ending at 2025-09-01T15:00:00Z. The body is 'Discuss project updates'. "
Please scheduel and let ,me know .
required Attendee name is Naveen and email is example@email.com

"""
)
print(resp)
print(resp.output_text)

# "Schedule a meeting titled 'Project Sync' starting at 2025-09-01T14:00:00Z ending at 2025-09-01T15:00:00Z. The body is 'Discuss project updates'. "
# Please scheduel and let ,me know .
# required Attendee name is Naveen and email is email@email.com

#could you please give me the event id of the meeting scheduled on August 9th, 2025 PST timezone with email@email.com """

#Can you please reschedule the meeting  event id 
# ET4NwOuYku0EHBwC7MkKjdoRHQ4cHEDY3mToXAAAAAAENAAC7MkKjdoRHQ4cHEDY3mToXAAFPchCwAAA=
#  to sept 20, 2025 same time.
# """
# Can you please cancel the interview  event id  is
# AAMAyMy04ZTk2LTljOTI4OWRjYjg5MABGAAAAAABaL71tdJQET4NwOuYku0EHBwC7MkKjdoRHQ4cHEDY3mToXAAAAAAENAAC7MkKjdoRHQ4cHEDY3mToXAAFPchCwAAA=

API 文档

有关端点和参数的更多详细信息,请参阅 Microsoft Graph API 文档.

做出贡献

欢迎贡献!我们鼓励您通过添加新工具或增强现有工具来进一步提升此MCP服务器的功能。请通过GitHub提交问题或拉取请求。详见(以下链接或说明) CONTRIBUTING.md 翻译为中文是:“贡献指南.md” 或 “如何贡献.md”(具体翻译可能根据上下文略有调整,但基本意思是文件名表明了这是关于如何向项目做出贡献的指南或说明) 作为指南。

许可证

这个项目采用MIT许可证授权。请参阅 许可证 详情见下文。