一个用于安排、重新安排、取消 Microsoft Teams 面试并使用 Microsoft Graph API 管理日历事件的服务器。
Calendars.ReadWrite,User.Read.All)。git 和 pip。uv 用于运行服务器(通过 pip install uv 安装)。ngrok 用于通过 HTTPS 暴露本地服务器(集成 OpenAI API 所需)。克隆仓库:
git clone https://github.com/your-username/teams-mcp-server.git
cd teams-mcp-server
创建并激活虚拟环境:
python -m venv venv
# 在 Unix/Linux/MacOS 上:
source venv/bin/activate
# 在 Windows(命令提示符)上:
venv\Scripts\activate
# 在 Windows(PowerShell)上:
.\venv\Scripts\Activate.ps1
安装依赖项:
pip install -r requirements.txt
配置环境变量:
.env 文件。MS_TENANT_ID=your_tenant_id
MS_CLIENT_ID=your_client_id
MS_CLIENT_SECRET=your_client_secret
MS_USER_ID=your_user_id
运行服务器:
python server.py
或者,如果使用 uv:
uv run server.py
通过 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 install microsoft-teams-mcp==1.1.4
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
要使用 Microsoft Graph API,您需要在 Microsoft Azure AD 中注册一个应用程序,并配置必要的权限。请遵循以下步骤(总结自 MS-Teams-setup.md):
注册 Azure AD 应用程序:
.env 文件中的 MS_CLIENT_ID)。MS_TENANT_ID 并设置 MS_APP_TYPE=SingleTenant。添加客户端密钥:
.env 文件中的 MS_CLIENT_SECRET。配置 Microsoft Graph API 权限:
Calendars.ReadWrite 权限(以及可选的 User.Read.All 权限以列出事件)。Azure Bot 注册(可选):
MS_CLIENT_ID 注册一个 Azure Bot。详细说明,请参阅 MS-Teams-setup.md。
当本地运行时,默认情况下服务器运行在 http://localhost:4200/mcp/。它暴露了一个 JSON-RPC API 用于与 Microsoft Teams 会议和日历进行交互。
schedule_teams_meeting 调度会议时,响应包括一个 event_id。请将其存储在一个数据库或本地文件(如 JSON 或 CSV)中,因为重新安排 (reschedule_teams_meeting) 或取消 (cancel_teams_meeting) 会议时需要该 ID。例如,您可以将 event_id 和相关元数据(如会议主题、日期)保存在 SQLite 数据库或 JSON 文件中以便轻松检索。http://localhost:4200/mcp/) 不适用于 OpenAI。使用 ngrok 暴露本地服务器的 HTTPS URL:
ngrok(例如,通过 npm install -g ngrok 或从 ngrok.com 下载)。ngrok http 4200
以生成一个 HTTPS URL(例如,https://your-ngrok-subdomain.ngrok.io)。https://your-ngrok-subdomain.ngrok.io/mcp/)作为 OpenAI API 集成的端点。http://your-server-ip:4200/mcp/)。服务器使用 FastMCP 框架暴露 JSON-RPC 端点,用于管理 Microsoft Teams 会议和日历。以下是可用工具及其特性和如何使用它们的示例 JSON-RPC 负载。
schedule_teams_meeting描述:根据指定的主题、开始/结束时间(UTC,ISO 8601 格式)、会议正文和必需的与会者安排一个新的 Microsoft Teams 会议。
特性:
event_id 用于重新安排或取消会议。使用方法:
tools/callsubject(字符串):会议标题。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/..."
}
}
reschedule_teams_meeting描述:通过更新其开始和结束时间来重新安排现有的 Microsoft Teams 会议。
特性:
event_id。使用方法:
tools/callevent_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": ""
}
}
cancel_teams_meeting描述:使用事件ID取消现有的 Microsoft Teams 会议。
特性:
event_id。使用方法:
tools/callevent_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 中取消。"
}
}
list_team_calendar_events描述:列出指定团队成员在给定日期范围内和时区内的日历事件。
特性:
America/Los_Angeles)。使用方法:
tools/callemails(列表):要获取事件的电子邮件地址列表。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