All integrations

Microsoft Teams

Channel

Bring your agent into Teams chats and channels.

At a glance

From Eve docs · synced Jul 22, 2026

Webhook route

POST /eve/v1/teams

Environment variables

MICROSOFT_APP_ID
MICROSOFT_APP_PASSWORD
MICROSOFT_TENANT_ID
optional, single-tenant bots

Capabilities

  • Human-in-the-loopA human-in-the-loop (HITL) input.requested event renders as an Adaptive Card.
  • Proactive sessionsProactive sessions need an existing conversation reference, because the Bot Framework v1 surface cannot create new chats by Azure Active Directory (AAD) user id.
  • AttachmentsInbound files are off by default.

Derived from Eve's Microsoft Teams docs.

Install

Install the framework:

npm install eve@latest

Quick start

Create agent/channels/teams.ts:

// agent/channels/teams.tsimport { teamsChannel } from "eve/channels/teams";export default teamsChannel({  appId: () => process.env.TEAMS_APP_ID!,  appPassword: () => process.env.TEAMS_APP_PASSWORD!,});

Configure

Register an Azure Bot, configure the messaging endpoint to eve's route (/eve/v1/teams), and supply the app ID and password via environment variables. See the Teams channel docs for the full provisioning checklist.

How it behaves

Excerpts from Eve's Microsoft Teams docs. Prefer the source when something looks out of date.

Dispatch

The default onMessage handles two cases: personal-chat messages, and channel or group-chat messages that mention the bot directly. Ambient resource-specific-consent messages are dropped unless you override it. Before dispatch, eve strips the mention, adds a <teams_context> block, and scopes channel and group threads by root activity id (replyToId ?? id).

import { defaultTeamsAuth, teamsChannel } from "eve/channels/teams";

export default teamsChannel({
  onMessage(ctx, message) {
    if (message.scope !== "personal" && !message.isBotMentioned) return null;
    return { auth: defaultTeamsAuth(message) };
  },
});
Delivery

Replies post as Markdown (textFormat: "markdown"), with oversized text split across messages and a typing indicator sent on turn start and action requests.

Human-in-the-loop (HITL)

A human-in-the-loop (HITL) input.requested event renders as an Adaptive Card. Approval cards show the tool input in the card and fallback text. Buttons and options map to Action.Submit, selects to Input.ChoiceSet, and freeform to Input.Text. Teams may return a submission as a message or invoke; eve handles both before the normal message mention gate and resumes the thread recorded in the card.

By default, submissions use the Teams identity of the user who clicked the card. If you customize onMessage for an allowlist, configure the same policy in onInputResponse; eve otherwise rejects HITL submissions rather than bypassing the message gate.

For invokes that aren't HITL, handle them in onInvoke(ctx, activity).

Proactive sessions

Proactive sessions need an existing conversation reference, because the Bot Framework v1 surface cannot create new chats by Azure Active Directory (AAD) user id. Pass serviceUrl, conversationId, and the other reference fields to receive(teams, { target }).

Attachments

Inbound files are off by default. Opt in to allow personal-scope downloads and public media URLs:

export default teamsChannel({
  files: { enabled: true, allowedHosts: ["contoso.sharepoint.com"] },
});

Agents using Microsoft Teams

No catalog agents reference this integration yet.