Microsoft Teams API

io.github.Maxim-Mazurok由 GitHub 帳號 Maxim-Mazurok 發布v1.10.1更新於 Oct 29, 2026

AI-native Microsoft Teams integration — read chats, send messages, search people

發布方自己的服務:Microsoft Learn MCP

已驗證STDIO僅桌面效率與工作流溝通與協作

概覽

AI 產生的概覽

非官方的 Microsoft Teams 整合,讓助理讀取聊天與頻道、搜尋訊息和人員、傳送或編輯訊息,並取得會議逐字稿。

可以做什麼
  • 列出、尋找並解析對話,包括依人名定位的一對一聊天
  • 讀取訊息與頻道討論串,依寄件者與日期篩選搜尋訊息,並列出對話成員
  • 傳送、編輯和刪除訊息,以及新增或移除表情回應
  • 搜尋組織目錄和聊天,取得包含職稱與辦公地點的人員資料
  • 取得會議逐字稿、下載訊息附件,並用視覺模型描述內嵌圖片
適用情境
適合讓助理在企業 Teams 租用戶內工作:摘要或監看對話、代替使用者回覆、尋找同事,或取出會議逐字稿與附件。
執行需求
透過 npx 在本機執行,需要 Node.js 18 或更新版本。驗證方式包括瀏覽器登入(TEAMS_LOGIN)、macOS 上的 FIDO2 自動登入(TEAMS_AUTO)、Chrome 偵錯工作階段,或手動提供權杖(TEAMS_TOKEN、TEAMS_BEARER_TOKEN、TEAMS_SUBSTRATE_TOKEN,並需 TEAMS_REGION)。訊息搜尋需要 Substrate 權杖。圖片描述需要 TEAMS_IMAGE_DESCRIPTION_API_KEY 或 OPENAI_API_KEY。
安裝前請注意
它會擷取並快取使用者的 Teams 工作階段權杖,這些權杖可存取其聊天內容,應視為機密。傳送、編輯和刪除訊息會以真實使用者身分執行,且預設為永久刪除。可考慮設定 TEAMS_DELETE_MODE、TEAMS_EDIT_REPLY_GUARD、TEAMS_PROTECTED_CONVERSATIONS 和 TEAMS_AGENT_MARKER。圖片描述會把圖片資料傳送到外部視覺服務。TEAMS_TELEMETRY 會在本機記錄所有輸入與輸出。此專案為非官方、由 AI 產生。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Microsoft Teams API,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

teams-api

AI-native Microsoft Teams integration — read conversations, send messages, and manage members via the Teams Chat Service REST API.

Designed for autonomous AI agents that need to interact with Teams: read messages, reply to people, monitor conversations, and participate in team workflows.

[Install in VS Code] [Install in VS Code Insiders] [Install in Cursor] [npm version] [MCP Registry]

[!NOTE] This project was AI-generated using Claude Opus 4.6 with human guidance and review.

Getting Started

teams-api can be used in three ways:

  1. MCP server for editors and AI tools — the recommended path for most users.
  2. CLI for direct terminal use.
  3. Programmatic Node.js library — advanced, documented near the end.

Prerequisites

  • Node.js (v18 or later) — required for npx, which all MCP and CLI commands use.

Install in your editor

The quickest way to get started is to click one of the install badges above, or follow the instructions for your editor below.

Editor-specific instructions
VS Code / VS Code Insiders

Option 1 — One-click install:

[Install in VS Code] [Install in VS Code Insiders]

Option 2 — CLI:

macOS / Linux:

bash
# VS Codecode --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'
# VS Code Insiderscode-insiders --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'

Windows (PowerShell):

powershell
# VS Codecode --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'
# VS Code Insiderscode-insiders --add-mcp '{"name":"teams","command":"npx","args":["-y","-p","teams-api@latest","teams-api-mcp"],"env":{"TEAMS_LOGIN":"true"}}'

Windows (CMD):

cmd
rem VS Codecode --add-mcp "{\"name\":\"teams\",\"command\":\"npx\",\"args\":[\"-y\",\"-p\",\"teams-api@latest\",\"teams-api-mcp\"],\"env\":{\"TEAMS_LOGIN\":\"true\"}}"
rem VS Code Insiderscode-insiders --add-mcp "{\"name\":\"teams\",\"command\":\"npx\",\"args\":[\"-y\",\"-p\",\"teams-api@latest\",\"teams-api-mcp\"],\"env\":{\"TEAMS_LOGIN\":\"true\"}}"

Option 3 — Manual config:

Add to your VS Code MCP config (.vscode/mcp.json or User Settings):

json
{  "mcpServers": {    "teams": {      "command": "npx",      "args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],      "env": {        "TEAMS_LOGIN": "true"      }    }  }}
Cursor

[Install in Cursor]

Or add to ~/.cursor/mcp.json:

json
{  "mcpServers": {    "teams": {      "command": "npx",      "args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],      "env": {        "TEAMS_LOGIN": "true"      }    }  }}
Claude Desktop

Add to claude_desktop_config.json (how to find it):

json
{  "mcpServers": {    "teams": {      "command": "npx",      "args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],      "env": {        "TEAMS_LOGIN": "true"      }    }  }}
Claude Code
bash
claude mcp add teams -- npx -y -p teams-api@latest teams-api-mcp

Then set the environment variable TEAMS_LOGIN=true in your shell before starting Claude Code. The server will ask for your email interactively on first use.

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

json
{  "mcpServers": {    "teams": {      "command": "npx",      "args": ["-y", "-p", "teams-api@latest", "teams-api-mcp"],      "env": {        "TEAMS_LOGIN": "true"      }    }  }}

[!TIP] On macOS with a FIDO2 passkey, replace TEAMS_LOGIN with TEAMS_AUTO for fully unattended auth. See Authentication for details.

CLI

You can also use the CLI directly without installing anything:

bash
npx -y -p teams-api@latest teams-api auth --loginnpx -y -p teams-api@latest teams-api list-conversations --login --limit 20

If you use the CLI often, a global install is optional:

bash
npm install -g teams-apiteams-api auth --login

Agent skill

Compatible coding agents can install the optional teams-api skill to learn when and how to use the CLI or SDK:

bash
npx -y skills add Maxim-Mazurok/teams-api --skill teams-api

The installer detects supported agents and asks whether to install the skill for the current project or globally. Once installed, the agent loads it automatically for relevant Teams tasks.

Advanced Topics

Manual token usage, debug-session auth, and programmatic Node.js usage are covered later in this README.

Platform support

FeaturemacOSWindows / Linux
Interactive loginFull supportFull support
Auto-login (FIDO2)Full supportNot supported
Debug sessionFull supportFull support
Direct tokenFull supportFull support
Token cachingmacOS KeychainWindows DPAPI / Linux secret-tool
CLI & MCP serverFull supportFull support
Programmatic APIFull supportFull support

[!NOTE] Windows Defender false positive: Older versions of this package used inline PowerShell to call the Windows DPAPI — a pattern that Windows Defender flags as ransomware-like behavior. This has been replaced with native Windows Credential Manager storage via keytar. If you hit issues on an older version, upgrade and re-run teams-api auth --login. See SECURITY.md for details.

Authentication

Most users do not need to manage tokens manually.

If you use interactive login, auto-login, or a Chrome debug session, teams-api captures the full token bundle automatically from Teams web traffic. That includes the base skypeToken plus the extra bearer tokens used for profile resolution and reliable people/chat/channel search.

Those flows also detect the Teams chat region automatically from the intercepted request URLs, so most users do not need to set --region or TEAMS_REGION.

On macOS, prefer auto-login when you have a platform authenticator / FIDO2 passkey set up. On other platforms, use interactive login.

Direct token usage is the advanced/manual path.

MethodDescriptionAutomationPlatform
Auto-loginPlaywright launches system Chrome and captures the full token bundleFully unattendedmacOS
Interactive loginOpens a browser window and captures skype, middle-tier, and Substrate tokensOne-time manualAll
Debug sessionConnects to a running Chrome instance and captures the full token bundleSemi-manualAll
Direct tokenProvide a previously captured token or token bundle explicitlyManualAll

Auto-login (macOS only)

Requires macOS with a platform authenticator (e.g. Intune Company Portal) and a FIDO2 passkey enrolled. Fully unattended — no browser window appears.

Interactive login (recommended for Windows / Linux)

The easiest cross-platform option. A browser window opens, you log in with any method your organization supports (password, MFA, passkey, etc.), and the token is captured automatically:

bash
teams-api auth --login

Optionally pre-fill your email:

bash
teams-api auth --login --email [email protected]

[!NOTE] Interactive login prefers an installed browser (Edge or Chrome) when available, and falls back to Playwright's bundled Chromium.

Advanced / manual methods

Debug session — start Chrome with --remote-debugging-port=9222, navigate to Teams and log in, then run:

bash
teams-api auth --debug-port 9222

Direct token — advanced/manual only. Extract x-skypetoken from browser DevTools (Network tab) and pass it directly:

bash
teams-api list-conversations --token "<paste-token-here>" --region emea

If you want reliable people/chat/channel lookup and profile resolution on the direct-token path, also pass the extra bearer tokens captured from Teams requests:

bash
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"

[!TIP] Skip this section if you are using --login, --auto, TEAMS_LOGIN, or TEAMS_AUTO. Those modes capture the full token bundle automatically.

[!TIP] Direct-token mode still needs an explicit region. See API regions below.

CLI

Preferred without install:

bash
npx -y -p teams-api@latest teams-api <command> [options]

Optional global install for frequent use:

bash
npm install -g teams-apiteams-api <command> [options]

The examples below use teams-api for readability. If you are not installing globally, replace it with npx -y -p teams-api@latest teams-api.

Auth flags (available on all commands)

FlagDescription
--loginInteractive browser login (all platforms)
--autoAuto-acquire token via FIDO2 passkey (macOS)
--headlessRun FIDO2 auto-login without a visible browser
--email <email>Corporate email (required with --auto, optional otherwise)
--token <token>Use an existing skype token (advanced/manual)
--bearer-token <token>Optional middle-tier bearer token (advanced/manual)
--substrate-token <token>Optional Substrate bearer token (advanced/manual)
--debug-port <port>Chrome debug port (default: 9222)
--region <region>API region override. Auto-detected for login/debug auth; required with --token
--format <format>Output format: concise, detailed
--output <file>Export output to file (default format: concise)

Examples

bash
# 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 conversationsteams-api list-conversations --login --limit 20 --format detailed
# Find a conversation by topicteams-api find-conversation --auto --email [email protected] --query "Design Review"
# Find a 1:1 chat by person nameteams-api find-one-on-one --auto --email [email protected] --person-name "Jane Doe"
# Find people, including office location when profile enrichment is availableteams-api find-people --auto --email [email protected] --query "Jane Doe"
# Get profiles for MRIs returned by people search or member listingteams-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 5teams-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 messageteams-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 membersteams-api get-members --auto --email [email protected] --chat "Design Review"
# Get current user infoteams-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 fileteams-api get-messages --auto --email [email protected] --chat "General" --format detailed --output exports/general.json

Search messages

Search indexed message content across accessible Teams chats and channel posts/replies without opening conversations, sending messages, or marking messages read:

bash
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

Options: --query (required; * for filter-only searches), --from (sender email), --message-type (all, chat, or channel), --conversation-id, --sent-after, --sent-before, --page-size (1-100, default 25), and --offset (default 0). Date bounds are inclusive and use YYYY-MM-DD. Advanced query syntax is passed to the Teams search service; structured filters are combined with it.

Each call returns one page: messages, approximate total, hasMore, and nextOffset when another page is available. Pass nextOffset as the next call's offset, retaining the same query and filters. Results include previews rather than full message bodies, sender details, conversation/message IDs, reply parent IDs, and Teams permalinks. Use get-messages to retrieve a known message or thread in full.

Result metadata is optional: missing values remain undefined in the SDK and are omitted from JSON, while explicit empty strings are preserved. Permalinks are available only when both conversation and message IDs are present. The approximate total sums the server's result-set totals without deduplication across result sets; it is not a unique-message count.

typescript
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 exposes the same operation as teams_search_messages, with camelCase parameters such as messageType, sentAfter, and pageSize.

Message search requires a Substrate bearer token. Login capture attempts a neutral read-only search if reload traffic did not expose that token. For older cached credentials, run the command with --login to capture a fresh bundle. If browser search is unavailable or blocked, message search reports an authentication error instead of returning an empty result. Direct-token users must provide --substrate-token or TEAMS_SUBSTRATE_TOKEN.

Search is limited by the signed-in user's permissions, search indexing, and retention policies. Zero matches do not establish that no messages exist. HTTP failures, invalid queries, and incomplete search responses are reported as errors, not empty results.

MCP server

The MCP server exposes Teams operations as tools for AI agents via stdio transport. See Getting Started for editor-specific setup.

Advanced: direct token configuration

Use this only if you already have tokens from another flow or need to avoid browser-based auth entirely:

json
{  "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"      }    }  }}

[!TIP] If you do use direct tokens, teams-api auth --login prints the full token object as JSON. For basic chat operations, skypeToken is enough. For reliable people/chat/channel search and profile resolution, also pass bearerToken and substrateToken.

Environment variables

VariableDescription
TEAMS_TOKENPre-existing skype token
TEAMS_BEARER_TOKENOptional middle-tier bearer token
TEAMS_SUBSTRATE_TOKENOptional Substrate bearer token
TEAMS_REGIONAPI region override. Required with TEAMS_TOKEN; optional otherwise
TEAMS_EMAILCorporate email. Optional — the server prompts the AI agent if needed
TEAMS_AUTOSet to true to enable auto-login (macOS + FIDO2)
TEAMS_HEADLESSSet to true to run FIDO2 auto-login without a visible browser
TEAMS_LOGINSet to true to enable interactive browser login (reuses a cached token when valid)
TEAMS_DEBUG_PORTChrome debug port (default: 9222)
TEAMS_EDIT_REPLY_GUARDEdit reply guard: allow (default), warn, or block. See below
TEAMS_AGENT_MARKERAgent marker prefix for sent/edited messages (e.g. Ⓜ). See below
TEAMS_DELETE_MODEDelete mode: hard (default), soft, or block. See below
TEAMS_DELETE_TOMBSTONECustom tombstone text for soft-delete mode. See below
TEAMS_AUDIT_LOGAudit logging: off (default), stderr, or file:<path>. See below
TEAMS_PROTECTED_CONVERSATIONSComma-separated glob patterns of conversations where edit/delete is blocked. See below
Agent marker

When an AI agent sends or edits messages on behalf of a user, it can be hard to tell which messages were composed by the agent and which by the human. The TEAMS_AGENT_MARKER environment variable (or --agent-marker CLI flag / agentMarker MCP parameter) automatically prepends a configurable string to message content:

jsonc
{  "env": {    "TEAMS_AGENT_MARKER": "Ⓜ", // or "🤖", "[Bot]", etc.  },}

When set, every send-message and edit-message call prepends the marker followed by a space to the content. For example, with TEAMS_AGENT_MARKER=Ⓜ, sending "Hello world" produces "Ⓜ Hello world".

The per-call parameter takes precedence over the environment variable. Pass an empty string to disable the marker for a specific call.

Edit reply guard

When editing a message that already has replies, the original context can be lost — replies may no longer make sense. The TEAMS_EDIT_REPLY_GUARD environment variable (or --reply-guard CLI flag / replyGuard MCP parameter) controls this:

ValueBehavior
allowEdit proceeds normally (default, backward-compatible)
warnEdit proceeds but an annotation is appended: "⚠️ This message was edited after…"
blockEdit is refused with an error listing the reply count

The per-call parameter takes precedence over the environment variable.

Delete mode (soft-delete)

Hard-deleting messages removes content permanently, which can be problematic for auditability and conversation flow in group chats. The TEAMS_DELETE_MODE environment variable (or --delete-mode CLI flag / deleteMode MCP parameter) controls how message deletion is handled:

ValueBehavior
hardPermanently delete the message (default, current behavior)
softReplace message content with a tombstone marker instead of deleting
blockRefuse deletion entirely with an error

When using soft mode, the message content is replaced with ~~This message was removed by an agent~~ by default. Customize the tombstone text with TEAMS_DELETE_TOMBSTONE (or --delete-tombstone / deleteTombstone):

jsonc
{  "env": {    "TEAMS_DELETE_MODE": "soft",    "TEAMS_DELETE_TOMBSTONE": "🗑️ [removed by automation]",  },}

The per-call parameters take precedence over environment variables.

Audit logging

State-modifying actions (edit and delete) can emit structured audit events for compliance and traceability. The TEAMS_AUDIT_LOG environment variable controls where events are written:

ValueBehavior
offNo audit logging (default)
stderrWrite JSON Lines to stderr
file:<path>Append JSON Lines to the specified file (created on demand)
jsonc
{  "env": {    "TEAMS_AUDIT_LOG": "file:/var/log/teams-audit.jsonl",  },}

Each event is a single JSON line with the following fields:

FieldDescription
timestampISO 8601 timestamp
action"edit", "delete", or "soft-delete"
conversationIdConversation thread ID
conversationLabelHuman-readable conversation label (topic or 1:1 partner name)
messageIdTarget message ID
contentNew content for edits, tombstone text for soft-delete, null for hard delete

Audit logging is designed to be silent — errors in the audit pipeline never affect tool execution.

Protected conversations

Some conversations contain sensitive or compliance-relevant information where accidental edits or deletions could be harmful. The TEAMS_PROTECTED_CONVERSATIONS environment variable (or --protected-conversations CLI flag / protectedConversations MCP parameter) blocks edit and delete actions in matching conversations:

jsonc
{  "env": {    "TEAMS_PROTECTED_CONVERSATIONS": "Incident *,*compliance*,Architecture Decisions",  },}

Patterns are comma-separated and support * as a wildcard (matches any characters). Matching is case-insensitive. When a conversation's name matches any pattern, both edit-message and delete-message throw an error before making any changes — the message is left untouched.

The per-call parameter takes precedence over the environment variable, so individual tool invocations can override the configured patterns when needed.

Available tools

All MCP tools accept an optional format parameter (concise or detailed). Default format is concise.

ToolDescription
teams_list_conversationsList available conversations
teams_find_conversationFind a conversation by topic or member name
teams_find_one_on_oneFind a 1:1 chat with a person
teams_get_profilesGet user profiles, including office location
teams_find_peopleSearch the organization directory
teams_find_chatsSearch chats by name or member
teams_search_messagesSearch messages with sender, date, and scope filters
teams_get_messagesGet messages from a conversation
teams_send_messageSend a message to a conversation
teams_get_membersList members of a conversation
teams_get_transcriptGet a meeting transcript from a recorded conversation
teams_download_fileDownload message files and inline images
teams_describe_imageDescribe an inline Teams image with a vision model
teams_whoamiGet the authenticated user's display name

Workflow guidance, tips, and important notes are served automatically via the MCP server's instructions field — no separate skill file needed. For the same content on the CLI, run teams-api guide.

Image descriptions

teams_describe_image reuses the existing Teams AMS image download support and sends the image bytes to an OpenAI-compatible vision endpoint. Configure it with TEAMS_IMAGE_DESCRIPTION_API_KEY or OPENAI_API_KEY. Optional overrides: TEAMS_IMAGE_DESCRIPTION_MODEL and TEAMS_IMAGE_DESCRIPTION_BASE_URL.

Examples:

bash
teams-api describe-image --chat "Project Chat" --message-id 1773736076914 --image-index 0teams-api describe-image --ams-object-id 0-eaua-d2-877b82634f4e978692f2243d445a6650

API regions

The Teams Chat Service URL varies by region. Login-based and debug-session auth detect it automatically. You only need to set --region or TEAMS_REGION when you are supplying tokens directly or want to force an override:

RegionBase 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

Known limitations

  • File attachments are not supported from remote AI hosts (e.g. Claude.ai). The MCP server runs locally on your machine, so --file / --image paths must exist on your local filesystem. Cloud-hosted AI clients run in isolated containers and cannot access local paths. Use a local MCP client (Claude Desktop, Cursor, VS Code) or the CLI for file attachments.
  • Token lifetime is ~24 hours. After expiry, you must re-acquire.
  • The Teams Chat Service REST API is undocumented and may change without notice.
  • FIDO2 auto-login is never selected automatically. Enable it with --auto or TEAMS_AUTO=true; add --headless or TEAMS_HEADLESS=true only when unattended browser auth is wanted.
  • Auto-login requires macOS, system Chrome, a platform authenticator, and a FIDO2 passkey. On other platforms, use interactive login (--login) instead.
  • The members API returns empty display names for 1:1 chat participants. Use findOneOnOneConversation() to resolve names from message history.
  • Reaction actor identities come from the emotions field in message payloads. Parsing handles both JSON-string and array formats.

Programmatic API

This is the advanced integration path. Most users should start with MCP or CLI instead.

Install the package in your project:

bash
npm install teams-api

Example:

typescript
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 tokensconst 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) accepts the complete TeamsToken returned by getToken(), including chatBearerToken for accounts without a Skype token. The string form accepts a Skype token and region.

Conversation pagination

listConversations() returns one page and enriches untitled chat names by default. SDK consumers can pass { enrichNames: false } to avoid member and profile lookups. CLI and MCP behavior and options are unchanged.

For complete, lightweight enumeration, use listConversationsPage():

typescript
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);

Follow backwardLink until it is null, even when a page is short or becomes empty after system-stream filtering. Continuation URLs must use the current Chat Service origin. Name enrichment defaults to enabled on both SDK methods.

Use getMessages(id, { since }) to stop message pagination at a creation-time cutoff. This is not an edit/deletion delta feed; applications own checkpoint storage and reconciliation policy.

Contributing

See CONTRIBUTING.md for development setup, architecture, and implementation notes.

License

MIT

來源:README.md,提交 c149aa5

工具

18

teams_list_conversations

List Teams Conversations

List conversations (chats, group chats, meetings, channels). Returns conversation ID, topic, type, and last message time.

輸入參數emaillimitformat

teams_find_conversation

Find Teams Conversation

Find a conversation by topic name (case-insensitive partial match). When Substrate search is available, also matches by member names. For 1:1 chats (which have no topic), use find-one-on-one instead. Use the returned conversation ID for subsequent operations like get-messages or send-message.

輸入參數emailquery必填format

teams_find_one_on_one

Find 1:1 Conversation

Find or create a 1:1 conversation with a person by name. Uses Substrate people/chat search when available — if a conversation already exists it is returned; if the person is found in the org directory but no chat exists yet, a new 1:1 is started. Falls back to scanning message senders when Substrate is unavailable. Also finds the self-chat if the name matches the current user.

輸入參數emailformatpersonName必填

teams_get_profiles

Get User Profiles

Get Teams profiles for one or more people by MRI. Returns display name, email, job title, office location, and user type.

輸入參數emailformatuserIdentifiers必填

teams_find_people

Find People

Search for people in the organization directory by name. Uses the Substrate search API (requires authentication via auto-login or interactive). Returns matching people with emails, job titles, and departments.

輸入參數emailquery必填formatmaxResults

teams_find_chats

Find Chats

Search for chats by name or member name. Uses the Substrate search API (requires authentication via auto-login or interactive). Returns matching chats with member lists and thread IDs.

輸入參數emailquery必填formatmaxResults

teams_search_messages

Search Messages

Search message content across accessible Teams chats and channel posts/replies. Read-only; does not open chats, send messages, or mark messages read. Requires a Substrate search token. Returns one page with message IDs, previews, Teams links, total estimate, and nextOffset. Search visibility and retention policies apply; zero results do not prove no messages exist.

輸入參數fromemailquery必填formatoffsetpageSizesentAftersentBeforemessageTypeconversationId

teams_get_messages

Get Messages

Get messages from a conversation. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). At least one identifier is required. For channel threads, provide --message-id to read replies under a specific post. Messages include reactions, mentions, followers (thread subscribers), and quoted message references.

輸入參數tochatemaillimitordersinceformattextOnlymessageIdconversationId

teams_send_message

Send Message

Send a message to a conversation. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). At least one identifier is required. For channel thread replies, provide --message-id to reply under a specific post. Content is interpreted as Markdown by default and converted to rich HTML. To send images, provide file paths via --image. To send file attachments (documents, videos, etc.), provide file paths via --file. Use [image] placeholders in --content to interleave text and images (e.g. --content 'Before [image] after [image] done' --image a.png --image b.png). Without placeholders, text appears first followed by all images.

輸入參數tochatfileemailimageformatcontentsubjectmessageIdscheduleAtagentMarkermessageFormat另有 3 個

teams_edit_message

Edit Message

Edit an existing message in a conversation. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). At least one identifier is required. The message to edit is identified by --message-id. Content is interpreted as Markdown by default and converted to rich HTML.

輸入參數tochatemailformatcontent必填messageId必填replyGuardagentMarkermessageFormatconversationIdquoteMessageIdprotectedConversations

teams_delete_message

Delete Message

Delete a message from a conversation. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). At least one identifier is required. The message to delete is identified by --message-id.

輸入參數tochatemailformatmessageId必填deleteModeconversationIddeleteTombstoneprotectedConversations

teams_add_reaction

Add Reaction

Add a reaction (emoji) to a message. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). At least one identifier is required. Standard reaction keys: "like", "heart", "laugh", "surprised", "angry", "sad". User-friendly names are auto-resolved to Teams emoji IDs (e.g. "horse" → "1f40e_horse").

輸入參數tochatemailformatmessageId必填reactionKey必填conversationId

teams_remove_reaction

Remove Reaction

Remove a reaction (emoji) from a message. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). At least one identifier is required. Only removes the current user's reaction of the specified type. User-friendly names are auto-resolved to Teams emoji IDs (e.g. "horse" → "1f40e_horse").

輸入參數tochatemailformatmessageId必填reactionKey必填conversationId

teams_get_members

Get Conversation Members

List members of a conversation. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). At least one identifier is required. Display names are resolved via the Teams profile API when available, with message history as fallback. Note: 1:1 chat members may have empty display names if profile resolution is unavailable.

輸入參數tochatemailformatconversationId

teams_whoami

Current User Info

Get the display name and region of the currently authenticated user.

輸入參數emailformat

teams_get_transcript

Get Meeting Transcript

Get the meeting transcript from a conversation that contains a recorded meeting. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). Use --raw-vtt to get the original VTT file instead of parsed output.

輸入參數tochatemailformatrawVttconversationId

teams_download_file

Download File

Download file attachment(s) from a message. Identify the conversation by topic name (--chat), person name for 1:1 chats (--to), or direct ID (--conversation-id). Specify the message containing the file(s) via --message-id. Use --output-directory to save files to a specific directory. Without --output-directory, files are saved to a temporary directory. Text file contents and images are returned inline in the response. Other binary files (PDFs, videos, archives, etc.) are saved to disk only; the response reports the local save path.

輸入參數tochatemailformatmessageId必填conversationIdoutputDirectory

teams_describe_image

Describe Image

Describe an inline Teams image using a configured OpenAI-compatible vision model. Use amsObjectId directly, or identify a message by chat/to/conversationId plus messageId. Set TEAMS_IMAGE_DESCRIPTION_API_KEY or OPENAI_API_KEY before using this tool.

輸入參數tochatemailformatpromptfullSizemessageIdimageIndexamsObjectIdconversationId

版本歷史

2
  1. v1.10.1最新Oct 26, 2026
  2. v1.7.1Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Microsoft 整合