Microsoft Teams
ChannelBring your agent into Teams chats and channels.
At a glance
From Eve docs · synced Jul 22, 2026
Webhook route
POST /eve/v1/teamsEnvironment variables
- MICROSOFT_APP_ID
- MICROSOFT_APP_PASSWORD
- MICROSOFT_TENANT_ID
- optional, single-tenant bots
Capabilities
- Human-in-the-loop — A human-in-the-loop (HITL) input.requested event renders as an Adaptive Card.
- 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.
- Attachments — Inbound files are off by default.
Derived from Eve's Microsoft Teams docs.
Install
Install the framework:
npm install eve@latestQuick 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.