mcpField
M
Microsoft Teams API

Microsoft Teams API

本地服务
github.com/Maxim-Mazurok通信协作92 天前更新

关于 Microsoft Teams API

Microsoft Teams API 是面向需操作 Teams 对话和人员的 AI Agent 的 MCP 服务、命令行工具及 Node.js 库。它通过 Teams Chat Service REST API 支持读取和搜索消息、发送回复及管理成员。

主要功能

  1. 01读取对话和消息
  2. 02搜索聊天与频道帖子
  3. 03发送消息和回复
  4. 04管理对话成员
  5. 05通过浏览器流程进行身份验证

适用场景

  1. 01按内容、发件人或日期查找消息
  2. 02读取指定消息或对话线程
  3. 03在 Teams 中回复他人
  4. 04在 Agent 工作流中监控对话

MCP 相关

MCP 服务向 AI 客户端提供 Teams 操作,包括消息搜索和对话交互。它提供的操作与命令行工具和 Node.js 库相同。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"maxim-mazurok-teams-api": {
"command": "npx",
"args": [
"-y",
"teams-api"
],
"env": {
"TEAMS_EMAIL": "<TEAMS_EMAIL>",
"TEAMS_AUTO": "<TEAMS_AUTO>",
"TEAMS_HEADLESS": "<TEAMS_HEADLESS>",
"TEAMS_LOGIN": "<TEAMS_LOGIN>",
"TEAMS_TOKEN": "<TEAMS_TOKEN>",
"TEAMS_REGION": "<TEAMS_REGION>",
"TEAMS_BEARER_TOKEN": "<TEAMS_BEARER_TOKEN>",
"TEAMS_SUBSTRATE_TOKEN": "<TEAMS_SUBSTRATE_TOKEN>",
"TEAMS_DEBUG": "<TEAMS_DEBUG>",
"TEAMS_TELEMETRY": "<TEAMS_TELEMETRY>",
"TEAMS_TELEMETRY_PATH": "<TEAMS_TELEMETRY_PATH>",
"TEAMS_IMAGE_DESCRIPTION_API_KEY": "<TEAMS_IMAGE_DESCRIPTION_API_KEY>",
"TEAMS_IMAGE_DESCRIPTION_MODEL": "<TEAMS_IMAGE_DESCRIPTION_MODEL>",
"TEAMS_IMAGE_DESCRIPTION_BASE_URL": "<TEAMS_IMAGE_DESCRIPTION_BASE_URL>"
}
}
}
}
启动命令npx -y teams-api
需要配置的环境变量
TEAMS_EMAILCorporate email address for Teams authentication
TEAMS_AUTOSet to "true" to use auto-login (macOS + FIDO2)
TEAMS_HEADLESSSet to "true" to run FIDO2 auto-login without a visible browser
TEAMS_LOGINSet to "true" to use interactive browser login (all platforms)
TEAMS_TOKEN密钥Pre-existing Skype token for direct authentication
TEAMS_REGIONAPI region (required with TEAMS_TOKEN, auto-detected otherwise)
TEAMS_BEARER_TOKEN密钥Middle-tier bearer token for profile resolution
TEAMS_SUBSTRATE_TOKEN密钥Substrate bearer token for people/chat search
TEAMS_DEBUGSet to "true" to use Chrome debug session for token capture
TEAMS_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_image
TEAMS_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmteams-api1.10.1

工具

17

收录的工具列表 · 更新于 2 天前

参数类型必填说明
emailstring否用于 Teams 登录的公司电子邮件地址。仅当服务端要求时才需要。
limitnumber否要返回的会话数上限
formatenum否输出格式。"concise"(默认):简洁的 Markdown,包含可操作的 ID 和关键决策字段;嵌套集合可能会进行摘要。"detailed":完整 JSON,适用于程序化处理或检查确切字段值。concise | detailed

详细介绍

teams-api

原生支持 AI 的 Microsoft Teams 集成——通过 Teams Chat Service REST API 读取对话、发送消息和管理成员。

专为需要与 Teams 交互的自主 AI Agent 设计:读取消息、回复他人、监控对话,并参与团队工作流。

在 VS Code 中安装 在 VS Code Insiders 中安装 在 Cursor 中安装 npm 版本 MCP Registry

说明

此项目由 Claude Opus 4.6 在人工指导和审核下通过 AI 生成。

开始使用

teams-api 有三种使用方式:

  1. MCP 服务,用于编辑器和 AI 工具——这是大多数用户的推荐方式。
  2. CLI,用于直接在终端中使用。
  3. Node.js 编程库——适合高级用户,文档见本文末尾附近。
前提条件
  • Node.js(v18 或更高版本)——npx 必需,而所有 MCP 和 CLI 命令都会使用它。
在编辑器中安装

最快的入门方式是点击上方的任一安装徽章,或按照下方适用于你所用编辑器的说明操作。

特定编辑器的说明
VS Code / VS Code Insiders

选项 1 — 一键安装:

在 VS Code 中安装 在 VS Code Insiders 中安装

选项 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 中安装

或者添加到 ~/.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 后续部分介绍。

平台支持

功能macOSWindows / Linux
交互式登录完全支持完全支持
自动登录(FIDO2)完全支持不支持
调试会话完全支持完全支持
直接使用令牌完全支持完全支持
令牌缓存macOS KeychainWindows 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_REGIONAPI 区域覆盖值。与 TEAMS_TOKEN 一起使用时必填;否则可选
TEAMS_EMAIL公司邮箱。可选 — 如有需要,服务会提示 AI Agent
TEAMS_AUTO设置为 true 以启用自动登录(macOS + FIDO2)
TEAMS_HEADLESS设置为 true 以在不显示浏览器的情况下运行 FIDO2 自动登录
TEAMS_LOGIN设置为 true 以启用交互式浏览器登录(令牌有效时会重用缓存的令牌)
TEAMS_DEBUG_PORTChrome 调试端口(默认值: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,包含以下字段:

字段说明
timestampISO 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
apachttps://apac.ng.msg.teams.microsoft.com/v1
emeahttps://emea.ng.msg.teams.microsoft.com/v1
amerhttps://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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。