内容
# 微软Teams MCP服务器
用于调度、重新调度、取消微软Teams面试,并使用微软图API管理日历事件的服务器。
## 功能
- 安排新的微软Teams会议,包含与会者、主题和正文。
- 通过更新开始和结束时间重新调度现有会议。
- 使用事件ID取消会议。
- 列出团队日历事件,支持时区。
- 检索用于调度和筛选事件的IANA支持的时区列表。
## 先决条件
- Python 3.8或更高版本。
- 具有微软图API权限的微软Azure AD应用程序(例如,`Calendars.ReadWrite`,`User.Read.All`)。
- 系统上安装了`git`和`pip`。
- (可选)`uv`用于运行服务器(通过`pip install uv`安装)。
- (可选)`ngrok`用于通过HTTPS公开本地服务器(与OpenAI API集成所需)。
## 安装
### 使用仓库源代码
1. 克隆仓库:
```bash
git clone https://github.com/alivnavc/Microsoft-Teams-Meetings-MCP-Server.git
cd Microsoft-Teams-Meetings-MCP-Server
```
2. 创建并激活虚拟环境:
```bash
python -m venv venv
# 在Unix/Linux/MacOS上:
source venv/bin/activate
# 在Windows(命令提示符):
venv\Scripts\activate
# 在Windows(PowerShell):
.\venv\Scripts\Activate.ps1
```
3. 安装依赖项:
```bash
pip install -r requirements.txt
```
4. 配置环境变量:
- 在项目根目录中创建一个`.env`文件。
- 添加您的微软图API凭证:
```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
```
5. 运行服务器:
```bash
python server.py
```
或,如果使用`uv`:
```bash
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. ```bash
pip install microsoft-teams-mcp==1.1.4
```
2. 使用以下代码
```bash
from microsoft_teams_mcp import server
server.main({
"MS_TENANT_ID": "租户ID",
"MS_CLIENT_ID": "客户端ID",
"MS_CLIENT_SECRET": "客户端密钥",
"MS_USER_ID": "用户ID"
})
运行命令:python 文件名.py
```
## Azure AD设置微软图API
要使用微软图API,您需要在微软Azure AD中注册一个应用程序并配置必要的权限。按照以下步骤(从[MS-Teams-setup.md](https://github.com/InditexTech/mcp-teams-server/blob/master/doc/MS-Teams-setup.md)总结):
1. **注册Azure AD应用程序**:
- 在Azure门户中创建一个Microsoft Entra ID应用程序。
- 记下应用程序UUID(设置为.env文件中的`MS_CLIENT_ID`)。
- 为单一租户或多租户配置应用程序:
- 对于单一租户,请在`MS_TENANT_ID`中存储租户UUID,并设置`MS_APP_TYPE=SingleTenant`。
- 对于多租户,请在Azure中相应地调整设置。
2. **添加客户端密钥**:
- 为您的Azure AD应用程序生成客户端密钥。
- 将密钥存储在.env文件中的`MS_CLIENT_SECRET`。
3. **配置微软图API权限**:
- 将`Calendars.ReadWrite`权限(和可选的`User.Read.All`用于列出事件)添加到您的Azure AD应用程序。
- 确保权限已授予管理员同意。
4. **Azure Bot注册(可选)**:
- 如果与微软Teams通道集成,请使用相同的`MS_CLIENT_ID`注册Azure Bot。
- 将Bot连接到Teams通道并配置为使用微软图API。
有关详细说明,请参阅[MS-Teams-setup.md](https://github.com/InditexTech/mcp-teams-server/blob/master/doc/MS-Teams-setup.md)。
## 用法
服务器默认在本地运行时在`http://localhost:4200/mcp/`上运行。它公开了一个JSON-RPC API,用于与微软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](https://ngrok.com)下载)。
2. 运行:
```bash
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端点,用于管理微软Teams会议和日历。下面是可用的工具、功能以及如何使用示例JSON-RPC有效载体。
### 1. `schedule_teams_meeting`
**描述**:使用指定的主题、开始/结束时间(UTC,ISO 8601格式)、会议正文和必填与会者,安排新的微软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`(字符串)。
**示例有效载体**:
```json
{
"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"
}
}
}
```
**示例响应**:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"event_id": "AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE2MjEzNzAwMQBGAAAAAADbWWPmN-qjQqZ5uOjCatRNBwD4kwMhw138Q6oKJi3U2FGBAAAAAAENAAD4kwMhw138Q6oKJi3U2FGBAAFJIBYCAAA",
"join_url": "https://teams.microsoft.com/l/meetup-join/..."
}
}
```
### 2. `reschedule_teams_meeting`
**描述**:通过更新现有会议的开始和结束时间,重新调度现有的微软Teams会议。
**功能**:
- 使用事件ID更新现有会议的开始和结束时间。
- 保留其他会议详情(例如,与会者、主题)。
- 成功重新调度后返回事件ID。
- 需要来自先前调度的会议的`event_id`。
**用法**:
- **方法**:`tools/call`
- **参数**:
- `event_id`(字符串):要重新调度的会议的微软图事件ID。
- `start_time`(字符串):新的开始时间,ISO 8601 UTC格式。
- `end_time`(字符串):新的结束时间,ISO 8601 UTC格式。
**示例有效载体**:
```json
{
"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"
}
}
}
```
**示例响应**:
```json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"event_id": "AAMkADE1MzJlYTAwLWRkZTMtNDAyMy04ZTk2LTljOTI8OWRjYjg5MABGAAAAAABaL71tdJQET4NwOuYku0EHBwC7MkKjdoRHQ4cHEDY3mToXAAAAAAENAAC7MkKjdoRHQ4cHEDY3mToXAAFPchCuAAA=",
"join_url": ""
}
}
```
### 3. `cancel_teams_meeting`
**描述**:使用事件ID取消现有的微软Teams会议。
**功能**:
- 从日历中删除会议。
- 成功取消后返回确认消息。
- 需要来自先前调度的会议的`event_id`。
**用法**:
- **方法**:`tools/call`
- **参数**:
- `event_id`(字符串):要取消的会议的微软图事件ID。
**示例有效载体**:
```json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "cancel_teams_meeting",
"arguments": {
"event_id": "AAMkADg0OWNmYTNjLTJlZmQtNDc2Ny1hNjAyLWNlZDE6
```
连接信息
猜你喜欢
everything-claude-code
完整的 Claude Code 配置集合 - agents、skills、hooks、commands、rules、MCPs。来自 Anthropic...
MarkItDown
将文件和办公文档转换为Markdown的Python工具。
awesome-claude-skills
一份精心整理的 Claude Skills、资源和工具列表,用于定制 Claude AI 工作流程
stacklit
10.8万行代码,4000个索引标记。 一条命令即可使任何仓库具备AI代理能力。
figma-pilot
Figma Pilot MCP
SwiftAgent
一个类型安全、声明式的 Swift AI 代理框架。使用 Steps、Agents、结构化输出和工具集成来构建可组合的 AI 管道。具有 FIFO...