docs/agents/channels/microsoft-teams.mdx
Use Microsoft Teams as a messaging channel for your agent. Novu keeps conversation context, shows typing during the turn, can update a plan card in place, can attach files on replies, and posts Adaptive Card approvals for gated tools.
| Capability | Support |
|---|---|
| Full context history | Yes |
| Threaded replies | Yes |
| Live typing indicator (custom status text) | Yes |
| React with eyes on inbound messages | Yes |
| Plan card (markdown edit-in-place / Adaptive Card) | Yes |
| Rich text / markdown | Yes |
| Tap-to-respond buttons | Yes |
| Emoji reactions | Yes |
| Message edits in place | Yes |
| Action / MCP tool approval | Yes |
| MCP connect card | Yes |
| Resolve conversation | Yes |
| File sharing | Yes |
| Streaming word-by-word | Not yet |
Full matrix: Channels overview.
A user messages the agent in Teams. Novu adds an eyes reaction, shows typing, updates a plan card while tools run, then replies with action buttons.
Gated tools surface as an Adaptive Card (Deny, Approve once, Always allow this tool). The turn resumes after the user selects an option.
| Framework / Platform | Guide |
|---|---|
| Custom code agent | Follow a connect guide, then add Teams as another provider on the same agent |
| Managed agent | Claude or AWS Claude, then link Teams in the dashboard |
Teams provider credentials and app packaging are configured in the Novu dashboard when you add the Microsoft Teams provider.
Use MsTeamsConnectButton from @novu/react so end users can admin-consent and link Teams to your agent from your product UI. In subscriber mode, autoLinkUser defaults to true so the per-user Teams identity is linked after consent.
import { NovuProvider, MsTeamsConnectButton } from '@novu/react';
export function TeamsConnect() {
const subscriberId = 'subscriber-id';
const integrationIdentifier = 'msteams-integration-identifier';
return (
<NovuProvider
applicationIdentifier={process.env.NEXT_PUBLIC_NOVU_APPLICATION_IDENTIFIER!}
subscriberId={subscriberId}
>
<MsTeamsConnectButton
integrationIdentifier={integrationIdentifier}
connectionMode="subscriber"
connectLabel="Install agent ↗"
connectedLabel="Connected to MS Teams"
onConnectSuccess={() => {
// Workspace linked
}}
onConnectError={(error: unknown) => {
console.error(error);
}}
/>
</NovuProvider>
);
}
If auto-link fails after consent, use MsTeamsLinkUser as a follow-up step. Full prop reference: Connect components.