MCP团队
](https://www.npmjs.com/package/@floriscornel/teams-mcp) ](https://www.npmjs.com/package/@floriscornel/teams-mcp)   ](https://github.com/floriscornel/teams-mcp/stargazers)
一种模型上下文协议(MCP)服务器,提供与Microsoft Graph API的无缝集成,使AI助手能够与Microsoft Teams、用户、聊天、文件和组织数据进行交互。
📦 安装
要在Cursor/Claude/VS Code中使用此MCP服务器,请添加以下配置:
{
"mcpServers": {
"teams-mcp": {
"command": "npx",
"args": ["-y", "@floriscornel/teams-mcp@latest"]
}
}
}🚀 特性
🔐 认证
- 使用Microsoft Graph的OAuth 2.0设备代码身份验证流程
- 安全令牌管理、缓存持久性和刷新令牌更新
- 身份验证状态检查和注销支持
- 范围缩小的只读模式
- 直接的
AUTH_TOKEN支持预先发行的Microsoft Graph访问令牌
👥 用户管理
- 获取当前用户信息
- 按姓名或电子邮件搜索用户
- 检索详细的用户配置文件
- 访问组织目录数据
🏢 Microsoft团队集成
- 团队管理
- 列出用户加入的团队 - 访问团队详细信息和元数据
- 渠道运营
- 列出团队内的频道 - 检索频道消息和回复 - 向团队频道发送消息 - 对现有通道线程的回复 - 编辑和软删除频道消息和回复 - 支持消息重要性级别(normal, high, urgent) - 通过URL或base64数据支持内联图像附件
- 团队成员
- 列出团队成员及其角色 - 访问会员信息 - 搜索用户 @mentions
💬 聊天和消息
- 1:1和小组聊天
- 列出用户的聊天记录 - 创建新的1:1或群组对话 - 通过过滤、排序和分页检索聊天消息历史记录 - 通过获取所有可用消息 @odata.nextLink 分页 - 向现有聊天室发送消息 - 编辑以前发送的聊天消息 - 软删除聊天信息
✏️ 消息管理
- 编辑和删除
- 更新(编辑)聊天和频道中发送的消息 - 软删除聊天和频道中的消息(标记为已删除,不永久删除) - 只有邮件发件人可以更新/删除自己的邮件 - 支持Markdown格式、提及和编辑重要性级别
📎 媒体和附件
- 托管内容
- 从聊天和频道消息下载托管内容(图像、文件) - 访问对话中共享的内联图像和附件 - 可选择将托管内容直接保存到磁盘
- 文件上传
- 上传并发送任何文件类型(PDF、DOCX、XLSX、ZIP、图像等)到频道和聊天室 - 通过可恢复的上传会话支持大文件(>4 MB) - 频道上传转到SharePoint,聊天上传转到OneDrive - 可选消息文本、自定义文件名、格式和重要性级别
🔍 高级搜索和发现
- 邮件搜索
- 使用Microsoft Search API搜索所有团队频道和聊天 - 支持KQL(关键字查询语言)语法 - 按发件人、提及、附件、阅读状态和日期范围筛选 - 使用高级筛选选项获取最近的邮件 - 查找提及当前用户的消息
丰富的邮件格式支持
以下工具支持Teams频道和聊天中的丰富消息格式:
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,消息内容使用安全的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净化:所有markdown内容都转换为HTML并经过净化,以删除潜在的危险元素(脚本、事件处理程序等)
- 允许的标签:只允许使用安全的HTML标签(p、strong、em、a、ul、ol、li、h1-h6、code、pre等)
- 安全属性:只允许使用安全属性
- XSS预防:内容会自动净化,以防止跨站点脚本攻击
支持的Markdown功能
- 文字格式:粗体(
**text**),斜体(_text_),罢工(~~text~~) - 链接:
[text](url) - 列表:子弹(
- item)并编号(1. item) - 代码:内联 `
code` 和围栏代码块 - 标题:
# H1通过###### H6 - 引用:
> quoted text - 表格:GitHub风格的降价表
LLM友好内容格式
从Microsoft Graph API检索到的消息将作为包含特定于团队的标记的原始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元素 | Markdown输出 |
|---|---|
Name (团队提及) | @Name (使用提及元数据合并的多单词名称) |
text | **text** |
text | *text* |
text | ` text ` |
text | [text](url) |
| ` |
item
| - item | | ... |GFM Markdown表格| | | {attachment:id} | | | *(已删除)* | | | --- | | , &`等等。|解码为普通字符|
附件元数据
包含文件附件或内联图像的邮件包括 attachments 响应中的数组,其中包含每个附件的元数据(id、名称、contentType、contentUrl、thumbnailUrl)。内联 {attachment:id} markdown内容中的标记与此数组中的条目相关联,允许消费者通过以下方式识别和下载附件 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🔧 配置
先决条件
- Node.js 18+
- 具有适当权限的Microsoft 365帐户
- Microsoft Graph为以下范围委派了权限
所需的Microsoft图形权限
全模式(默认):
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": ""
}
}
}
}令牌存储
- 身份验证元数据存储在本地
~/.msgraph-mcp-auth.json - 令牌缓存存储在本地
~/.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.jsCLI命令
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=-使用预先存在的Microsoft Graph访问令牌,而不是使用SQL登录
只读模式
服务器支持只读模式,该模式禁用所有写入操作(发送消息、创建聊天、上传文件、编辑/删除消息),并仅请求Microsoft Graph的读取权限范围。
启用只读模式 使用以下任一方法:
- 环境变量:
TEAMS_MCP_READ_ONLY=true - CLI标志:
--read-only
使用缩小的范围进行身份验证:
npx @floriscornel/teams-mcp@latest authenticate --read-onlyMCP服务器配置(只读):
{
"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
在只读模式下禁用写入工具(10): send_channel_message, reply_to_channel_message, update_channel_message, delete_channel_message, send_file_to_channel, send_chat_message, create_chat, update_chat_message, delete_chat_message, send_file_to_chat
可用的MCP工具
认证
auth_status-检查当前身份验证状态
用户运营
get_current_user-获取经过身份验证的用户信息search_users-按姓名或电子邮件搜索用户get_user-通过ID或电子邮件获取详细的用户信息
团队运营
list_teams-列出用户加入的团队list_channels-列出特定团队中的频道get_channel_messages-使用附件摘要和内容格式选择从团队频道检索邮件get_channel_message_replies-获取特定频道消息的回复send_channel_message-向团队频道发送包含可选提及、重要性和图像附件的消息reply_to_channel_message-回复现有频道消息update_channel_message-编辑以前发送的频道消息或回复delete_channel_message-软删除频道消息或回复list_team_members-列出特定团队的成员search_users_for_mentions-搜索要在邮件中@提及的团队成员send_file_to_channel-上传本地文件并将其作为消息发送到通道
聊天操作
list_chats-列出用户的聊天记录(1:1和组)get_chat_messages-使用分页、过滤器、排序和fetchAllsend_chat_message-向聊天室发送消息create_chat-创建新的1:1或群聊update_chat_message-编辑以前发送的聊天消息delete_chat_message-软删除聊天消息send_file_to_chat-上传本地文件并将其作为消息发送到聊天室
媒体运营
download_message_hosted_content-从频道消息中下载托管内容(图像、文件)download_chat_hosted_content-从聊天消息中下载托管内容(图像、文件)
搜索操作
search_messages-使用KQL语法在所有团队消息中搜索get_my_mentions-查找最近提及当前用户的消息
📋 例子
认证
首先,使用Microsoft Graph进行身份验证:
# 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"
}与Cursor/Claude集成
此MCP服务器旨在通过模型上下文协议与Claude/Cursor/VS Code等AI助手协同工作。
{
"mcpServers": {
"teams-mcp": {
"command": "npx",
"args": ["-y", "@floriscornel/teams-mcp@latest"]
}
}
}🔒 安全
- 所有身份验证都是通过Microsoft的OAuth 2.0流程或调用者提供的Microsoft Graph令牌处理的
- 刷新令牌支持:访问令牌会使用缓存的刷新令牌自动续订,因此您不需要每小时重新进行身份验证
- 令牌缓存存储在本地
~/.teams-mcp-token-cache.json - 身份验证元数据存储在本地
~/.msgraph-mcp-auth.json - 在将HTML发送给团队之前,对Markdown内容进行净化
AUTH_TOKEN经过验证,以确保其目标https://graph.microsoft.com- 没有记录或暴露敏感数据
- 遵循Microsoft Graph API安全最佳实践
📝 许可证
MIT许可证-有关详细信息,请参阅许可证文件
🤝 贡献
- 分叉存储库
- 创建要素分支
- 进行更改
- 运行构建、linting和测试
- 提交拉取请求
📞 支持
对于问题和疑问:
- 检查现有的GitHub问题
- 查看Microsoft Graph API文档
- 确保配置了正确的身份验证和权限
