MCP团队
一个模型上下文协议(MCP)服务器,提供与Microsoft Graph API的无缝集成,使AI助手能够与Microsoft Teams,用户,聊天,文件,和组织数据互动.
* 安装
要使用 Cursor/Claude/VS 代码中的 MCP 服务器,请添加以下配置 :
{
"mcpServers": {
"teams-mcp": {
"command": "npx",
"args": ["-y", "@floriscornel/teams-mcp@latest"]
}
}
}
* 特性
认证
- OAuth 2.0 设备代码认证流程与 Microsoft Graph
- 安全令牌管理、缓存持续和刷新令牌更新
- 认证状态检查和登录支持
- 缩小范围的只读模式
- 直接
AUTH_TOKEN支持预发的 Microsoft Graph 访问符
QQ 用户管理
- 获取当前用户信息
- 按名称或电子邮件搜索用户
- 获取详细的用户配置
- 访问组织目录数据
微软团队集成
-
团队管理
- 列表用户加入的团队
- 访问团队细节和元数据
-
频道操作
- 团队内部的列表渠道
- 获取频道消息和回复
- 向团队频道发送消息
- 对现有频道线索的答复
- 编辑和软删除频道消息及回复
- 支持信息重要性级别(
normal, (中文(简体) ),high, (中文(简体) ),urgent(中文(简体) ) - 通过 URL 或 base64 数据支持内置图像附件
-
小组成员
- 名单 小组成员及其作用
- 获取成员信息
- 搜索用户
@mentions
QQ 聊天和通讯
- 1:1和分组聊天
- 列表用户聊天
- 创建新的 1: 1 或小组对话
- 以过滤、排序和页码获取聊天消息历史
- 通过
@odata.nextLink标记 - 向已有聊天发送消息
- 编辑先前发送的聊天信息
- 软删除聊天信息
QQ 信件管理
- 编辑并删除( D)
- 在聊天和频道中更新( 编辑) 发送信件
- 在聊天和频道中软删除信件( 标记为删除而不永久删除)
- 只有信件发送者可以更新/删除自己的信件
- 支持编辑时的马克下调格式化、提及和重要级别
媒体附件( A)
-
主机内容
- 从聊天和频道消息下载主机内容(图像、文件)
- 访问对话中共享的内含图像和附件
- 可选地将主机内容直接保存到磁盘
-
文件上传
- 上传并发送任何文件类型(PDF、DOCX、XLSX、ZIP、图像等)到频道和聊天室
- 通过可更新的上传会话提供大文件支持( > 4 MB)
- 频道上传到SharePoint,聊天上传到OneDrive
- 可选信件文本、 自定义文件名、 格式化和重要级别
QQ 高级搜索和发现
- 信件搜索
- 使用 Microsoft 搜索 API 搜索所有团队频道和聊天
- 支持 KQL (关键字查询语言) 语法
- 通过发件人过滤、引用、附件、读取状态和日期范围
- 用高级过滤选项获取最近的消息
- 查找提及当前用户的信件
丰富的信件格式支持
以下工具支持团队频道和聊天中丰富的消息格式化:
send_channel_messagesend_chat_messagereply_to_channel_messageupdate_channel_messageupdate_chat_messagesend_file_to_channelsend_file_to_chat
格式选项
您可以指定 format 用于控制消息格式的参数 :
text(默认):纯文本markdown: 将 Markdown 格式化(粗体、斜体、列表、链接、代码等)转换为已消毒的 HTML
何时 format 设置为 markdown,信件内容会使用安全标记分解器被转换为 HTML ,并在发送到 Teams 之前将潜在危险内容去除.
若为 format 未指定,信件将作为纯文本发送.
示例使用
{
"teamId": "...",
"channelId": "...",
"message": "**Bold text** and _italic text_\n\n- List item 1\n- List item 2\n\n[Link](https://example.com)",
"format": "markdown",
"importance": "high"
}
{
"chatId": "...",
"message": "Simple plain text message",
"format": "text"
}
安全特性
- HTML 卫生:所有标记下的内容被转换为HTML并进行消毒去除潜在的危险元素(标语,事件处理器等)
- 允许的标记:只允许安全 HTML 标记(p, strong, em, a, ul, ol, li, h1- h6, code, pre等)
- 安全属性: 只允许安全属性
- SS 预防: 内容自动进行消毒以防止跨站点脚本攻击
支持的 Markdown 特性
- 文本格式化: 粗体( 粗体)
**text**),斜体(_text_),通过(~~text~~(中文(简体) ) - 链接数字 :
[text](url) - 名单: 有子弹
- item编号(1. item(中文(简体) ) - 代码: 内置
`code`和有栅栏的代码块 - 标题数字 :
# H1结束###### H6 - 块名数字 :
> quoted text - 表格: GitHub 喜欢的打分表
LLM 友好内容格式
从Microsoft Graph API中取回的信件作为含有Teams特定标记的原始 HTML 返回. 为了使这些内容更能被AI助手所消耗,以下工具支持HTML对Markdown的自动转换:
get_chat_messagesget_channel_messagesget_channel_message_repliessearch_messagesget_my_mentions
内容格式选项
使用 contentFormat 用于控制消息内容如何返回的参数 :
markdown(默认):转换 Teams HTML 以清理 Markdown , 优化为 LLM 消耗raw: 从 Microsoft Graph API 返回原始 HTML
转换什么
| HTML 元素 | 下调输出 |
|---|---|
<at id="0">Name</at> (团队提及) | @Name (多字名称合并使用提及元数据) |
<strong>text</strong> | **text** |
<em>text</em> | *text* |
<code>text</code> | `text` |
<a href="url">text</a> | [text](url) |
<ul><li>item</li></ul> | - item |
<table>...</table> | GFM 标记表 |
<attachment id="..."> | {attachment:id} |
<systemEventMessage/> | (删除) |
<hr> | --- |
, (中文(简体) ), &等 (中文(简体) ). | 解码为普通字符 |
附件元数据
包含文件附件或内含图像的信件包括 attachments 每个附件(id、名称、内容Type、内容Url、缩略图Url)的元数据响应中的数组。 内线 {attachment:id} 减记内容中的标记与该数组中的条目相关,使消费者可以通过 download_message_hosted_content 或者说 download_chat_hosted_content。 。 。 .
示例使用
{
"chatId": "19:meeting_...",
"limit": 10,
"contentFormat": "markdown"
}
要获得原始 HTML :
{
"chatId": "19:meeting_...",
"limit": 10,
"contentFormat": "raw"
}
* 安装
# Install dependencies
npm install
# Build the project
npm run build
# Set up authentication
npm run auth
QQ 配置
先决条件
- 节点.js 18+
- 有适当权限的微软365账户
- Microsoft Graph 授予以下范围的权限
需要的微软图形权限
全模式( 默认) :
User.Read- 阅读用户配置User.ReadBasic.All- 阅读基本用户信息Team.ReadBasic.All- 阅读团队信息Channel.ReadBasic.All- 阅读频道信息ChannelMessage.Read.All- 读取频道消息ChannelMessage.Send- 发送频道信息和答复ChannelMessage.ReadWrite- 编辑和删除频道消息Chat.Read- 阅读聊天信息(通过只读范围包含)Chat.ReadWrite- 创建和管理聊天、发送/编辑/删除聊天信息(超级)Chat.Read(中文(简体) )TeamMember.Read.All- 阅读小组成员Files.ReadWrite.All- 需要文件上传到频道和聊天室
只读模式 (单位:千美元)TEAMS_MCP_READ_ONLY=true——只要求这些范围:
User.ReadUser.ReadBasic.AllTeam.ReadBasic.AllChannel.ReadBasic.AllChannelMessage.Read.AllTeamMember.Read.AllChat.Read
认证模式
完全访问 :
npx @floriscornel/teams-mcp@latest authenticate
只读访问 :
npx @floriscornel/teams-mcp@latest authenticate --read-only
使用已存在的 Microsoft Graph JWT 进行直接符号注入 :
{
"mcpServers": {
"teams-mcp": {
"command": "npx",
"args": ["-y", "@floriscornel/teams-mcp@latest"],
"env": {
"AUTH_TOKEN": "<jwt-for-https://graph.microsoft.com>"
}
}
}
}
托肯存储
- 本地存储 Auth 元数据
~/.msgraph-mcp-auth.json - Token 缓存存储于本地
~/.teams-mcp-token-cache.json
使用量
启动服务器
# Development mode with hot reload
npm run dev
# Production mode
npm run build && node dist/index.js
# Start in read-only mode (disables all write tools)
TEAMS_MCP_READ_ONLY=true node dist/index.js
CLI 命令
npx @floriscornel/teams-mcp@latest authenticate # Authenticate with full scopes
npx @floriscornel/teams-mcp@latest authenticate --read-only # Authenticate with read-only scopes
npx @floriscornel/teams-mcp@latest check # Check authentication status
npx @floriscornel/teams-mcp@latest logout # Clear authentication
npx @floriscornel/teams-mcp@latest auth # Alias for authenticate
npx @floriscornel/teams-mcp@latest # Start MCP server (default)
环境变量
TEAMS_MCP_READ_ONLY=true- 以只读模式启动 MCP 服务器AUTH_TOKEN=<jwt>- 使用先前存在的微软Graph访问符而不是MSAL登录TEAMS_MCP_CLIENT_ID=<guid>- 认证您的 Azure AD 应用程序注册, 而不是默认的 Microsoft Graph CLI 应用程序TEAMS_MCP_TENANT_ID=<guid-or-domain>- 授权给特定租户(例如:.contoso.onmicrosoft.com); 单租户应用程序注册要求TEAMS_MCP_SCOPES="User.Read Chat.ReadWrite"- 覆盖认证期间请求的许可范围(相机或空格分离)
使用您的 Azure AD 应用程序注册
默认情况下,服务器通过微软的公用Graph CLI app认证. 使用自己的应用程序注册(例如,当租户需要注册时):
- 单位 应用程序注册设置 认证 → 允许公共客户流 → 对
- 添加所需内容 授权 微软图形权限( 见上文列表)
- 用你贴在房客身上的应用程序认证:
TEAMS_MCP_CLIENT_ID=<your-app-id> \
TEAMS_MCP_TENANT_ID=<your-tenant-id> \
npx @floriscornel/teams-mcp@latest authenticate
在 MCP 服务器进程上设置相同的环境变量,这样它就可以以相同的应用身份更新令牌.
解决问题
大多数团队权限( M)Team.ReadBasic.All, (中文(简体) ), ChannelMessage.*, (中文(简体) ), Chat.ReadWrite, (中文(简体) ), Files.ReadWrite.All需要行政部门的同意。 如果登录显示 "需要行政审批",行政部门必须同意该应用软件,一旦——通过 企业申请 —— 许可 —— 赠款管理同意,或打开:
https://login.microsoftonline.com/<tenant-id>/v2.0/adminconsent?client_id=<app-id>&scope=<space-separated scopes>&redirect_uri=<registered-redirect-uri>
行政同意后, authenticate 完成没有提示。 请求范围 未在应用程序注册上配置 将永远触发行政批准墙——验证应用程序 API 权限 列表涵盖每个请求的范围.
仅读模式
服务器支持一种只读模式来禁用所有写入操作(发送消息,创建聊天,上传文件,编辑/删除消息),并且只请求从Microsoft Graph中读取许可范围.
启用只读模式 使用其中之一:
- 环境变量:
TEAMS_MCP_READ_ONLY=true - CLI 旗帜 :
--read-only
缩小范围认证 :
npx @floriscornel/teams-mcp@latest authenticate --read-only
MCP 服务器配置( 只读) :
{
"mcpServers": {
"teams-mcp": {
"command": "npx",
"args": ["-y", "@floriscornel/teams-mcp@latest"],
"env": {
"TEAMS_MCP_READ_ONLY": "true"
}
}
}
}
切换模式 : 当从只读模式切换到全模式时,服务器会检测出范围不匹配,并警告您重新认证:
npx @floriscornel/teams-mcp@latest authenticate
只读工具( 16):
auth_status, (中文(简体) ), get_current_user, (中文(简体) ), search_users, (中文(简体) ), get_user, (中文(简体) ), list_teams, (中文(简体) ), list_channels, (中文(简体) ), get_channel_messages, (中文(简体) ), get_channel_message_replies, (中文(简体) ), list_team_members, (中文(简体) ), search_users_for_mentions, (中文(简体) ), download_message_hosted_content, (中文(简体) ), list_chats, (中文(简体) ), get_chat_messages, (中文(简体) ), download_chat_hosted_content, (中文(简体) ), search_messages, (中文(简体) ), get_my_mentions
在只读模式中禁用的工具( 15 ):
send_channel_message, (中文(简体) ), reply_to_channel_message, (中文(简体) ), update_channel_message, (中文(简体) ), delete_channel_message, (中文(简体) ), send_file_to_channel, (中文(简体) ), send_chat_message, (中文(简体) ), create_chat, (中文(简体) ), add_chat_member, (中文(简体) ), update_chat_message, (中文(简体) ), delete_chat_message, (中文(简体) ), send_file_to_chat, (中文(简体) ), set_channel_message_reaction, (中文(简体) ), set_chat_message_reaction, (中文(简体) ), unset_channel_message_reaction, (中文(简体) ), unset_chat_message_reaction
可用的 MCP 工具
认证
auth_status- 检查当前认证状态
用户操作
get_current_user- 获得经认证的用户信息search_users- 按姓名或电子邮件搜索用户get_user- 通过身份证或电子邮件获得详细的用户信息
团队业务
list_teams- 列表用户加入的团队list_channels- 列出特定小组的渠道get_channel_messages- 从团队频道获取带有附件摘要和内容格式选择的信息get_channel_message_replies- 获取对特定频道消息的答复send_channel_message- 向团队频道发送信息,其中可选提及、重要性和图像附件reply_to_channel_message- 对现有频道消息的答复update_channel_message- 编辑先前发送的频道消息或回复delete_channel_message- 软删除频道消息或回复set_channel_message_reaction- 在频道消息中添加反应unset_channel_message_reaction- 从频道消息中删除反应list_team_members- 列出具体小组成员名单search_users_for_mentions- 在信件中搜索团队成员到@mentionsend_file_to_channel- 上传本地文件并将其作为消息发送给频道
聊天操作
list_chats- 列表用户聊天(1:1和组)get_chat_messages- 从特定聊天中获取信息,包括页盖、过滤器、订购和fetchAllsend_chat_message- 给聊天发送信息create_chat- 创建新的 1:1 或分组聊天add_chat_member- 在现有分组聊天中添加一个或多个成员update_chat_message- 编辑先前发送的聊天信息delete_chat_message- 软删除聊天信息set_chat_message_reaction- 对聊天信息添加反应unset_chat_message_reaction- 从聊天信息中删除反应send_file_to_chat- 上传本地文件并将其作为一条消息发送给聊天
媒体业务
download_message_hosted_content- 从频道消息下载主机内容(图像、文件)download_chat_hosted_content- 从聊天信息下载主机内容(图像、文件)
搜索操作
search_messages- 使用 KQL 语法搜索所有团队的信息get_my_mentions- 查找最近提及当前用户的信件
实例
认证
首先,通过微软图表认证:
# Full access (default)
npx @floriscornel/teams-mcp@latest authenticate
# Read-only (reduced permission scopes)
npx @floriscornel/teams-mcp@latest authenticate --read-only
检查您的认证状态 :
npx @floriscornel/teams-mcp@latest check
需要时登录 :
npx @floriscornel/teams-mcp@latest logout
聊天插座示例
{
"chatId": "19:meeting_...",
"limit": 100,
"fetchAll": true,
"orderBy": "createdDateTime",
"descending": true,
"contentFormat": "markdown"
}
有提及和图像的频道消息
{
"teamId": "team-id",
"channelId": "channel-id",
"message": "Please review **today's update**",
"format": "markdown",
"importance": "high",
"mentions": [
{
"mention": "alex.chen",
"userId": "00000000-0000-0000-0000-000000000000"
}
],
"imageUrl": "https://example.com/status.png"
}
文件上传示例
{
"chatId": "19:meeting_...",
"filePath": "/absolute/path/to/report.pdf",
"message": "Please review the attached report",
"format": "markdown"
}
与光标/光标结合
这个MCP服务器的设计是通过"模型上下文协议"与Claude/Cursor/VS代码等AI助手合作.
{
"mcpServers": {
"teams-mcp": {
"command": "npx",
"args": ["-y", "@floriscornel/teams-mcp@latest"]
}
}
}
• 警卫
- 所有认证都通过微软的 OAuth 2.0 流程或调用提供的 Microsoft Graph 令牌处理
- 刷新符号支持: 访问令牌使用缓存刷新令牌自动更新, 所以你不需要每小时重新认证
- Token 缓存存储于本地
~/.teams-mcp-token-cache.json - 本地存储 Auth 元数据
~/.msgraph-mcp-auth.json - 在将 HTML 发送给 Teams 之前, 标记下的内容被静态化
AUTH_TOKEN被验证以确保其目标https://graph.microsoft.com- 没有记录或暴露任何敏感数据
- 遵循Microsoft Graph API 安全最佳做法
许可证
麻省理工学院许可证 - 详情见LICENSE文件
捐款
- 叉子存储器
- 创建特性分支
- 做你的改变
- 运行构建、 内衣和测试
- 提交拉动请求
++ 辅助
关于议题和问题清单:
- 检查现有的 GitHub 问题
- 审查微软图形 API 文档
- 确保适当的认证和权限配置