关于 Microsoft Teams API
Microsoft Teams API 是面向需操作 Teams 对话和人员的 AI Agent 的 MCP 服务、命令行工具及 Node.js 库。它通过 Teams Chat Service REST API 支持读取和搜索消息、发送回复及管理成员。
主要功能
- 01读取对话和消息
- 02搜索聊天与频道帖子
- 03发送消息和回复
- 04管理对话成员
- 05通过浏览器流程进行身份验证
适用场景
- 01按内容、发件人或日期查找消息
- 02读取指定消息或对话线程
- 03在 Teams 中回复他人
- 04在 Agent 工作流中监控对话
MCP 相关
MCP 服务向 AI 客户端提供 Teams 操作,包括消息搜索和对话交互。它提供的操作与命令行工具和 Node.js 库相同。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y teams-apiTEAMS_EMAILCorporate email address for Teams authenticationTEAMS_AUTOSet to "true" to use auto-login (macOS + FIDO2)TEAMS_HEADLESSSet to "true" to run FIDO2 auto-login without a visible browserTEAMS_LOGINSet to "true" to use interactive browser login (all platforms)TEAMS_TOKEN密钥Pre-existing Skype token for direct authenticationTEAMS_REGIONAPI region (required with TEAMS_TOKEN, auto-detected otherwise)TEAMS_BEARER_TOKEN密钥Middle-tier bearer token for profile resolutionTEAMS_SUBSTRATE_TOKEN密钥Substrate bearer token for people/chat searchTEAMS_DEBUGSet to "true" to use Chrome debug session for token captureTEAMS_TELEMETRYSet to "true" to enable full debug telemetry logging (contributor use; logs all inputs and outputs locally)TEAMS_TELEMETRY_PATHOverride the telemetry output file path (default: platform-appropriate ~/Library/... or ~/.local/share/...)TEAMS_IMAGE_DESCRIPTION_API_KEY密钥API key for the OpenAI-compatible vision endpoint used by teams_describe_imageTEAMS_IMAGE_DESCRIPTION_MODELModel name for teams_describe_image (defaults to gpt-4o-mini)TEAMS_IMAGE_DESCRIPTION_BASE_URLOpenAI-compatible base URL for teams_describe_image本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
17收录的工具列表 · 更新于 2 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| string | 否 | 用于 Teams 登录的公司电子邮件地址。仅当服务端要求时才需要。 | |
| limit | number | 否 | 要返回的会话数上限 |
| format | enum | 否 | 输出格式。"concise"(默认):简洁的 Markdown,包含可操作的 ID 和关键决策字段;嵌套集合可能会进行摘要。"detailed":完整 JSON,适用于程序化处理或检查确切字段值。concise | detailed |
详细介绍
teams-api
原生支持 AI 的 Microsoft Teams 集成——通过 Teams Chat Service REST API 读取对话、发送消息和管理成员。
专为需要与 Teams 交互的自主 AI Agent 设计:读取消息、回复他人、监控对话,并参与团队工作流。
说明
此项目由 Claude Opus 4.6 在人工指导和审核下通过 AI 生成。
开始使用
teams-api 有三种使用方式:
- MCP 服务,用于编辑器和 AI 工具——这是大多数用户的推荐方式。
- CLI,用于直接在终端中使用。
- Node.js 编程库——适合高级用户,文档见本文末尾附近。
前提条件
- Node.js(v18 或更高版本)——
npx必需,而所有 MCP 和 CLI 命令都会使用它。
在编辑器中安装
最快的入门方式是点击上方的任一安装徽章,或按照下方适用于你所用编辑器的说明操作。
特定编辑器的说明
VS Code / VS Code Insiders
选项 1 — 一键安装:
选项 2 — 命令行:
macOS / Linux:
# VS Code
code --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'
# VS Code Insiders
code-insiders --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'
Windows (PowerShell):
# VS Code
code --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'
# VS Code Insiders
code-insiders --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'
Windows (CMD):
rem VS Code
code --add-mcp "{\"name\":\"teams\",\"command\":\"npx\",\"args\":[\"-y\",\"-p\",\"teams-api@latest\",\"teams-api-mcp\"],\"env\":{\"TEAMS_LOGIN\":\"true\"}}"
rem VS Code Insiders
code-insiders --add-mcp "{\"name\":\"teams\",\"command\":\"npx\",\"args\":[\"-y\",\"-p\",\"teams-api@latest\",\"teams-api-mcp\"],\"env\":{\"TEAMS_LOGIN\":\"true\"}}"
选项 3 — 手动配置:
添加到 VS Code MCP 配置(.vscode/mcp.json 或用户设置):
{
"mcpServers": {
"teams": {
"command": "npx",
"args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],
"env": {
"TEAMS_LOGIN": "true"
}
}
}
}
Cursor
或者添加到 ~/.cursor/mcp.json:
{
"mcpServers": {
"teams": {
"command": "npx",
"args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],
"env": {
"TEAMS_LOGIN": "true"
}
}
}
}
Claude Desktop
添加到 claude_desktop_config.json(如何查找):
{
"mcpServers": {
"teams": {
"command": "npx",
"args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],
"env": {
"TEAMS_LOGIN": "true"
}
}
}
}
Claude Code
claude mcp add teams -- npx -y -p teams-api@latest teams-api-mcp
然后在启动 Claude Code 前,在 shell 中设置环境变量 TEAMS_LOGIN=true。首次使用时,服务会以交互方式询问你的邮箱。
Windsurf
添加到 ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"teams": {
"command": "npx",
"args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],
"env": {
"TEAMS_LOGIN": "true"
}
}
}
}
提示
在 macOS 上使用 FIDO2 通行密钥时,将
TEAMS_LOGIN替换为TEAMS_AUTO,即可实现完全无人值守的身份验证。详情请参阅身份验证。
命令行工具
你也可以直接使用命令行工具,无需安装任何内容:
npx -y -p teams-api@latest teams-api auth --login
npx -y -p teams-api@latest teams-api list-conversations --login --limit 20
如果经常使用命令行工具,也可以选择全局安装:
npm install -g teams-api
teams-api auth --login
Agent 技能
兼容的编码 Agent 可以安装可选的 teams-api 技能,了解何时以及如何使用命令行工具或 SDK:
npx -y skills add Maxim-Mazurok/teams-api --skill teams-api
安装程序会检测受支持的 Agent,并询问是否要为当前项目或全局安装该技能。安装后,Agent 会在处理相关 Teams 任务时自动加载它。
高级主题
手动使用令牌、调试会话身份验证,以及以编程方式使用 Node.js 的内容将在本 README 后续部分介绍。
平台支持
| 功能 | macOS | Windows / Linux |
|---|---|---|
| 交互式登录 | 完全支持 | 完全支持 |
| 自动登录(FIDO2) | 完全支持 | 不支持 |
| 调试会话 | 完全支持 | 完全支持 |
| 直接使用令牌 | 完全支持 | 完全支持 |
| 令牌缓存 | macOS Keychain | Windows DPAPI / Linux secret-tool |
| CLI 和 MCP 服务 | 完全支持 | 完全支持 |
| 编程式 API | 完全支持 | 完全支持 |
说明
**Windows Defender 误报:**此软件包的旧版本使用内联 PowerShell 调用 Windows DPAPI,这种模式会被 Windows Defender 标记为类似勒索软件的行为。现已改用 keytar 通过原生 Windows Credential Manager 存储。如果你在旧版本上遇到问题,请升级并重新运行
teams-api auth --login。详情请参阅 SECURITY.md。
身份验证
大多数用户无需手动管理令牌。
如果你使用交互式登录、自动登录或 Chrome 调试会话,teams-api 会自动从 Teams 网页流量中捕获完整的令牌包。其中包括基础 skypeToken,以及用于解析个人资料和可靠搜索人员、聊天和频道的额外 bearer 令牌。
这些流程还会根据拦截到的请求 URL 自动检测 Teams 聊天区域,因此大多数用户无需设置 --region 或 TEAMS_REGION。
在 macOS 上,如果你已设置平台身份验证器 / FIDO2 通行密钥,请优先使用自动登录。在其他平台上,请使用交互式登录。
直接使用令牌属于高级 / 手动方式。
| 方法 | 说明 | 自动化程度 | 平台 |
|---|---|---|---|
| 自动登录 | Playwright 启动系统 Chrome 并捕获完整的令牌包 | 完全无人值守 | macOS |
| 交互式登录 | 打开浏览器窗口并捕获 skype、中间层和 Substrate 令牌 | 一次性手动操作 | 全部 |
| 调试会话 | 连接到正在运行的 Chrome 实例并捕获完整的令牌包 | 半手动 | 全部 |
| 直接使用令牌 | 明确提供先前捕获的令牌或令牌包 | 手动 | 全部 |
自动登录(仅限 macOS)
需要运行 macOS、配备平台身份验证器(例如 Intune Company Portal),并已注册 FIDO2 通行密钥。完全无人值守——不会显示浏览器窗口。
交互式登录(Windows / Linux 推荐)
最简单的跨平台选项。系统会打开浏览器窗口,你可以使用组织支持的任意方式登录(密码、MFA、通行密钥等),然后自动捕获令牌:
teams-api auth --login
也可以预先填入你的电子邮件地址:
teams-api auth --login --email [email protected]
说明
如果有已安装的浏览器,交互式登录会优先使用 Edge 或 Chrome;否则会回退到 Playwright 自带的 Chromium。
高级/手动方法
调试会话 — 使用 --remote-debugging-port=9222 启动 Chrome,导航到 Teams 并登录,然后运行:
teams-api auth --debug-port 9222
直接令牌 — 仅限高级/手动使用。从浏览器 DevTools(Network 标签页)中提取 x-skypetoken,并直接传入:
teams-api list-conversations --token "<paste-token-here>" --region emea
如果希望在直接令牌路径下可靠地查找人员/聊天/频道并解析个人资料,请同时传入从 Teams 请求中捕获的额外 bearer 令牌:
teams-api find-people \
--token "<paste-skype-token-here>" \
--bearer-token "<paste-api-spaces-skype-bearer-token-here>" \
--substrate-token "<paste-substrate-bearer-token-here>" \
--region emea \
--query "Jane Doe"
提示
如果使用
--login、--auto、TEAMS_LOGIN或TEAMS_AUTO,请跳过本节。这些模式会自动捕获完整的令牌包。
提示
直接令牌模式仍需要明确指定区域。请参阅下文的 API 区域。
CLI
无需安装时的首选方式:
npx -y -p teams-api@latest teams-api <command> [options]
频繁使用时,可选择全局安装:
npm install -g teams-api
teams-api <command> [options]
以下示例使用 teams-api 以便阅读。如果不进行全局安装,请将其替换为 npx -y -p teams-api@latest teams-api。
身份验证标志(所有命令均可用)
| 标志 | 描述 |
|---|---|
--login | 交互式浏览器登录(所有平台) |
--auto | 通过 FIDO2 密钥自动获取令牌(macOS) |
--headless | 在无可见浏览器的情况下运行 FIDO2 自动登录 |
--email <email> | 企业邮箱(使用 --auto 时必需,否则可选) |
--token <token> | 使用现有的 skype 令牌(高级/手动) |
--bearer-token <token> | 可选的中间层 bearer 令牌(高级/手动) |
--substrate-token <token> | 可选的 Substrate bearer 令牌(高级/手动) |
--debug-port <port> | Chrome 调试端口(默认:9222) |
--region <region> | API 区域覆盖。登录/调试身份验证时自动检测;使用 --token 时必需 |
--format <format> | 输出格式:concise、detailed |
--output <file> | 将输出导出到文件(默认格式:concise) |
示例
# Acquire a token (interactive — all platforms)
teams-api auth --login
# Acquire a token (headed auto-login — macOS with FIDO2)
teams-api auth --auto --email [email protected]
# Acquire a token (headless auto-login — explicit opt-in)
teams-api auth --auto --headless --email [email protected]
# List conversations
teams-api list-conversations --login --limit 20 --format detailed
# Find a conversation by topic
teams-api find-conversation --auto --email [email protected] --query "Design Review"
# Find a 1:1 chat by person name
teams-api find-one-on-one --auto --email [email protected] --person-name "Jane Doe"
# Find people, including office location when profile enrichment is available
teams-api find-people --auto --email [email protected] --query "Jane Doe"
# Get profiles for MRIs returned by people search or member listing
teams-api get-profiles --auto --email [email protected] \
--user-identifiers "8:orgid:00000000-0000-0000-0000-000000000000"
# Read messages (by topic name, person name, or direct ID)
teams-api get-messages --auto --email [email protected] --chat "Design Review"
teams-api get-messages --auto --email [email protected] --to "Jane Doe" --max-pages 5
teams-api get-messages --auto --email [email protected] --conversation-id "19:[email protected]" --format detailed
# Newest-first order (API returns newest-first; default is oldest-first/chronological)
teams-api get-messages --auto --email [email protected] --chat "General" --order newest-first
# Send a message
teams-api send-message --auto --email [email protected] --to "Jane Doe" --content "Hello!"
teams-api send-message --auto --email [email protected] --chat "Design Review" --content "Status update"
# List members
teams-api get-members --auto --email [email protected] --chat "Design Review"
# Get current user info
teams-api whoami --auto --email [email protected]
# Export messages to a file (default format: concise)
teams-api get-messages --auto --email [email protected] --chat "General" --output exports/general.md
# Export as JSON to a file
teams-api get-messages --auto --email [email protected] --chat "General" --format detailed --output exports/general.json
搜索消息
无需打开对话、发送消息或将消息标记为已读,即可搜索可访问的 Teams 聊天和频道帖子/回复中已编入索引的消息内容:
teams-api search-messages --login --query "release" --message-type channel
teams-api search-messages --query "*" --from [email protected] \
--sent-after 2026-10-01 --sent-before 2026-10-26 \
--page-size 25 --offset 0 --format detailed
选项:--query(必需;* 表示仅按筛选条件搜索)、--from(发送者邮箱)、--message-type(all、chat 或 channel)、--conversation-id、--sent-after、--sent-before、--page-size(1-100,默认值为 25)和 --offset(默认值为 0)。日期范围包含边界日期,格式为 YYYY-MM-DD。高级查询语法会传递给 Teams 搜索服务;结构化筛选条件会与其组合使用。
每次调用返回一页结果:messages、近似的 total、hasMore,以及有后续页面时的 nextOffset。将 nextOffset 作为下一次调用的 offset,并保留相同的查询和筛选条件。结果包含消息预览而非完整正文、发送者详情、对话/消息 ID、回复的父消息 ID,以及 Teams 永久链接。使用 get-messages 可完整获取已知消息或线程。
结果元数据为可选项:缺失值在 SDK 中保持为 undefined,并会从 JSON 中省略;显式空字符串则会保留。只有同时存在对话 ID 和消息 ID 时才提供永久链接。近似的 total 是服务器各结果集总数之和,未跨结果集去重;它不是唯一消息的数量。
import { TeamsClient } from "teams-api";
const client = await TeamsClient.connect({ email: "[email protected]" });
const page = await client.searchMessages({
query: "release",
messageType: "channel",
from: "[email protected]",
pageSize: 25,
});
MCP 通过 teams_search_messages 提供相同操作,参数采用驼峰命名,例如 messageType、sentAfter 和 pageSize。
消息搜索需要 Substrate bearer token。登录捕获流程会尝试执行中性的只读搜索,以防重新加载流量中未能获取该令牌。对于较早缓存的凭据,使用 --login 运行命令以捕获新的凭据包。如果浏览器搜索不可用或被阻止,消息搜索会报告身份验证错误,而不会返回空结果。使用直接令牌的用户必须提供 --substrate-token 或 TEAMS_SUBSTRATE_TOKEN。
搜索范围受已登录用户的权限、搜索索引和保留策略限制。未找到匹配项并不能证明消息不存在。HTTP 失败、无效查询和不完整的搜索响应都会作为错误报告,而不是作为空结果。
MCP 服务
MCP 服务通过 stdio 传输,将 Teams 操作作为供 AI Agent 使用的工具公开。有关针对编辑器的具体设置,请参阅入门。
高级:直接令牌配置
仅当你已通过其他流程获得令牌,或需要完全避免基于浏览器的身份验证时,才使用此方法:
{
"mcpServers": {
"teams": {
"command": "npx",
"args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],
"env": {
"TEAMS_TOKEN": "<paste-skype-token-here>",
"TEAMS_BEARER_TOKEN": "<optional-api-spaces-skype-bearer-token>",
"TEAMS_SUBSTRATE_TOKEN": "<optional-substrate-bearer-token>",
"TEAMS_REGION": "emea"
}
}
}
}
提示
如果你确实使用直接令牌,
teams-api auth --login会以 JSON 格式打印完整令牌对象。对于基本聊天操作,skypeToken已足够。要可靠地搜索人员/聊天/频道并解析个人资料,还需传入bearerToken和substrateToken。
环境变量
| 变量 | 描述 |
|---|---|
TEAMS_TOKEN | 预先存在的 skype 令牌 |
TEAMS_BEARER_TOKEN | 可选的中间层 bearer 令牌 |
TEAMS_SUBSTRATE_TOKEN | 可选的 Substrate bearer 令牌 |
TEAMS_REGION | API 区域覆盖值。与 TEAMS_TOKEN 一起使用时必填;否则可选 |
TEAMS_EMAIL | 公司邮箱。可选 — 如有需要,服务会提示 AI Agent |
TEAMS_AUTO | 设置为 true 以启用自动登录(macOS + FIDO2) |
TEAMS_HEADLESS | 设置为 true 以在不显示浏览器的情况下运行 FIDO2 自动登录 |
TEAMS_LOGIN | 设置为 true 以启用交互式浏览器登录(令牌有效时会重用缓存的令牌) |
TEAMS_DEBUG_PORT | Chrome 调试端口(默认值:9222) |
TEAMS_EDIT_REPLY_GUARD | 编辑回复保护:allow(默认值)、warn 或 block。见下文 |
TEAMS_AGENT_MARKER | 已发送/已编辑消息的 Agent 标记前缀(例如 Ⓜ)。见下文 |
TEAMS_DELETE_MODE | 删除模式:hard(默认值)、soft 或 block。见下文 |
TEAMS_DELETE_TOMBSTONE | 软删除模式的自定义墓碑文本。见下文 |
TEAMS_AUDIT_LOG | 审计日志:off(默认值)、stderr 或 file:<path>。见下文 |
TEAMS_PROTECTED_CONVERSATIONS | 以逗号分隔的 glob 模式,匹配禁止编辑/删除的对话。见下文 |
Agent 标记
当 AI Agent 代表用户发送或编辑消息时,很难分辨哪些消息由 Agent 撰写,哪些由用户本人撰写。TEAMS_AGENT_MARKER 环境变量(或 --agent-marker CLI 标志 / agentMarker MCP 参数)会自动在消息内容前添加可配置的字符串:
{
"env": {
"TEAMS_AGENT_MARKER": "Ⓜ", // or "🤖", "[Bot]", etc.
},
}
设置后,每次调用 send-message 和 edit-message 时,都会在内容前添加标记和一个空格。例如,设置 TEAMS_AGENT_MARKER=Ⓜ 后,发送“Hello world”会生成“Ⓜ Hello world”。
单次调用参数的优先级高于环境变量。传入空字符串可针对特定调用禁用标记。
编辑回复保护
编辑已有回复的消息时,原始上下文可能会丢失,导致回复不再合理。TEAMS_EDIT_REPLY_GUARD 环境变量(或 --reply-guard CLI 标志 / replyGuard MCP 参数)用于控制此行为:
| 值 | 行为 |
|---|---|
allow | 正常执行编辑(默认值,向后兼容) |
warn | 执行编辑,但会追加注释: "⚠️ This message was edited after…" |
block | 拒绝编辑,并显示列出回复数量的错误 |
单次调用参数的优先级高于环境变量。
删除模式(软删除)
硬删除会永久移除消息内容,这可能会影响群聊中的可审计性和对话流程。TEAMS_DELETE_MODE 环境变量(或 --delete-mode CLI 标志 / deleteMode MCP 参数)用于控制消息的删除方式:
| 值 | 行为 |
|---|---|
hard | 永久删除消息(默认,当前行为) |
soft | 将消息内容替换为墓碑标记,而非删除 |
block | 完全拒绝删除,并返回错误 |
使用 soft 模式时,消息内容默认会替换为 ~~This message was removed by an agent~~。使用 TEAMS_DELETE_TOMBSTONE(或 --delete-tombstone / deleteTombstone)自定义墓碑文本:
{
"env": {
"TEAMS_DELETE_MODE": "soft",
"TEAMS_DELETE_TOMBSTONE": "🗑️ [removed by automation]",
},
}
单次调用的参数优先于环境变量。
审计日志
修改状态的操作(编辑和删除)可以生成结构化审计事件,用于合规和追踪。TEAMS_AUDIT_LOG 环境变量用于控制事件的写入位置:
| 值 | 行为 |
|---|---|
off | 不记录审计日志(默认) |
stderr | 将 JSON Lines 写入 stderr |
file:<path> | 将 JSON Lines 追加到指定文件(按需创建) |
{
"env": {
"TEAMS_AUDIT_LOG": "file:/var/log/teams-audit.jsonl",
},
}
每个事件占一行 JSON,包含以下字段:
| 字段 | 说明 |
|---|---|
timestamp | ISO 8601 时间戳 |
action | "edit"、"delete" 或 "soft-delete" |
conversationId | 对话线程 ID |
conversationLabel | 易读的对话标签(主题或一对一联系人的名称) |
messageId | 目标消息 ID |
content | 编辑后的新内容、软删除时的墓碑文本;硬删除时为 null |
审计日志的设计原则是不产生干扰——审计流程中的错误不会影响工具执行。
受保护的对话
某些对话包含敏感信息或与合规相关的信息,意外编辑或删除可能造成危害。TEAMS_PROTECTED_CONVERSATIONS 环境变量(或 --protected-conversations CLI 标志 / protectedConversations MCP 参数)会阻止对匹配的对话执行编辑和删除操作:
{
"env": {
"TEAMS_PROTECTED_CONVERSATIONS": "Incident *,*compliance*,Architecture Decisions",
},
}
多个模式以逗号分隔,并支持将 * 用作通配符(匹配任意字符)。匹配不区分大小写。当对话名称与任一模式匹配时,edit-message 和 delete-message 都会在进行任何更改之前抛出错误,消息保持不变。
单次调用的参数优先于环境变量,因此在需要时,单个工具调用可以覆盖已配置的模式。
可用工具
所有 MCP 工具都接受可选的 format 参数(concise 或 detailed)。默认格式为 concise。
| 工具 | 描述 |
|---|---|
teams_list_conversations | 列出可用的对话 |
teams_find_conversation | 按主题或成员姓名查找对话 |
teams_find_one_on_one | 查找与某人的 1:1 聊天 |
teams_get_profiles | 获取用户个人资料,包括办公地点 |
teams_find_people | 搜索组织目录 |
teams_find_chats | 按名称或成员搜索聊天 |
teams_search_messages | 使用发送者、日期和范围筛选条件搜索消息 |
teams_get_messages | 获取对话中的消息 |
teams_send_message | 向对话发送消息 |
teams_get_members | 列出对话成员 |
teams_get_transcript | 获取录制对话中的会议文字记录 |
teams_download_file | 下载消息文件和内嵌图片 |
teams_describe_image | 使用视觉模型描述内嵌的 Teams 图片 |
teams_whoami | 获取已验证用户的显示名称 |
工作流指南、提示和重要说明会通过 MCP 服务的 instructions 字段自动提供,无需单独的技能文件。要在 CLI 中查看相同内容,请运行 teams-api guide。
图片描述
teams_describe_image 会复用现有的 Teams AMS 图片下载支持,并将图片字节发送到兼容 OpenAI 的视觉端点。使用 TEAMS_IMAGE_DESCRIPTION_API_KEY 或 OPENAI_API_KEY 进行配置。可选覆盖项:TEAMS_IMAGE_DESCRIPTION_MODEL 和 TEAMS_IMAGE_DESCRIPTION_BASE_URL。
示例:
teams-api describe-image --chat "Project Chat" --message-id 1773736076914 --image-index 0
teams-api describe-image --ams-object-id 0-eaua-d2-877b82634f4e978692f2243d445a6650
API 区域
Teams Chat Service URL 因区域而异。基于登录和调试会话的身份验证会自动检测区域。只有在直接提供令牌或想强制覆盖时,才需要设置 --region 或 TEAMS_REGION:
| 区域 | 基础 URL |
|---|---|
apac | https://apac.ng.msg.teams.microsoft.com/v1 |
emea | https://emea.ng.msg.teams.microsoft.com/v1 |
amer | https://amer.ng.msg.teams.microsoft.com/v1 |
已知限制
- 远程 AI 主机(例如 Claude.ai)不支持文件附件。MCP 服务在你的计算机本地运行,因此
--file/--image路径必须存在于本地文件系统中。云托管的 AI 客户端运行于隔离容器中,无法访问本地路径。请使用本地 MCP 客户端(Claude Desktop、Cursor、VS Code)或 CLI 添加文件附件。 - 令牌有效期约为 24 小时。过期后,必须重新获取。
- Teams Chat Service REST API 未公开文档,且可能随时变更,恕不另行通知。
- FIDO2 自动登录不会被自动选用。使用
--auto或TEAMS_AUTO=true启用;仅在需要无人值守的浏览器身份验证时,才添加--headless或TEAMS_HEADLESS=true。 - 自动登录需要 macOS、系统 Chrome、平台身份验证器和 FIDO2 密钥。其他平台请改用交互式登录(
--login)。 - 成员 API 会为 1:1 聊天参与者返回空显示名称。使用
findOneOnOneConversation()从消息历史记录中解析名称。 - 表情回应者的身份信息来自消息负载中的
emotions字段。解析时会处理 JSON 字符串和数组这两种格式。
编程式 API
这是面向高级用户的集成方式。大多数用户应从 MCP 或 CLI 开始。
在项目中安装软件包:
npm install teams-api
示例:
import { TeamsClient } from "teams-api";
// Interactive login — opens a browser, you log in manually (all platforms)
const client = await TeamsClient.fromInteractiveLogin();
// Or auto-login via platform authenticator (macOS + FIDO2 passkey)
const autoClient = await TeamsClient.fromAutoLogin({
email: "[email protected]",
});
// Advanced/manual: create a client from previously captured tokens
const manualClient = TeamsClient.fromToken("skype-token-here", "emea");
const restoredClient = TeamsClient.fromToken(client.getToken());
const conversations = await client.listConversations();
const messages = await client.getMessages(conversations[0].id, {
maxPages: 5,
onProgress: (count) => console.log(`Fetched ${count} messages`),
});
await client.sendMessage(conversations[0].id, "Hello from the API!");
const oneOnOne = await client.findOneOnOneConversation("Jane Doe");
const members = await client.getMembers(conversations[0].id);
const profiles = await client.getProfiles(members.map((member) => member.id));
console.log(profiles.map((profile) => profile.userLocation));
TeamsClient.fromToken(tokenBundle) 接受由 getToken() 返回的完整 TeamsToken,其中包括没有 Skype 令牌的账户所需的 chatBearerToken。字符串形式接受 Skype 令牌和区域。
对话分页
listConversations() 返回一页内容,并默认补全未命名聊天的名称。SDK 使用者可以传入 { enrichNames: false },以避免查询成员和个人资料。CLI 和 MCP 的行为及选项保持不变。
如需完整、轻量地枚举对话,请使用 listConversationsPage():
let backwardLink: string | undefined;
do {
const page = await client.listConversationsPage({
pageSize: 500,
enrichNames: false,
backwardLink,
});
for (const conversation of page.conversations) {
console.log(
conversation.id,
conversation.version,
conversation.lastMessageTime,
);
}
backwardLink = page.backwardLink ?? undefined;
} while (backwardLink);
即使某一页内容较少,或在过滤系统流后变为空,也要持续跟进 backwardLink,直到其值为 null。后续请求 URL 必须使用当前的 Chat Service 源站。两个 SDK 方法默认都启用名称补全。
使用 getMessages(id, { since }),可在达到创建时间截止点时停止消息分页。这不是编辑/删除增量数据流;检查点存储和协调策略由应用程序负责。
贡献
请参阅 CONTRIBUTING.md,了解开发环境设置、架构和实现说明。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。