Microsoft Teams
WednesdayAI connects to Microsoft Teams through the Bot Framework. Teams ships as a plugin — it is not bundled with the core install — and requires an Azure Bot registration plus a Teams app package.Install the plugin
Setup overview
Create an Azure Bot
At Create Azure Bot, use Single Tenant (new multi-tenant bots were deprecated after 2025-07-31) and Create new Microsoft App ID. From the resource, collect the App ID, a client secret (App password), and the Directory (tenant) ID.
Set the messaging endpoint
In the Azure Bot Configuration, set the messaging endpoint to your webhook URL, e.g.
https://your-domain.com/api/messages. For local dev, tunnel port 3978 (see below). Then enable the Microsoft Teams channel under Channels.Build and upload a Teams app package
Reference the bot in a Teams app manifest with scopes
personal, team, groupChat, supportsFiles: true, the RSC permissions below, and 32x32 / 192x192 icons. The Teams Developer Portal can generate the package for you.Local development tunnel
Teams cannot reachlocalhost. Use a tunnel:
tailscale funnel 3978).
Access control
Use stable AAD object IDs in
allowFrom. UPNs and display names are mutable, so name matching is disabled by default — re-enable it only via the break-glass channels.msteams.dangerouslyAllowNameMatching: true. The configure wizard resolves names to IDs via Graph when permissions allow.groupPolicy: "allowlist" with no allowlist). Set groupAllowFrom, or use groupPolicy: "open" (still mention-gated). Channels are mention-gated by default; override per team/channel with requireMention.
RSC vs Graph permissions
Teams Resource-Specific Consent (RSC) permissions go in the app manifest and cover real-time text. Microsoft Graph Application permissions (with tenant admin consent) are needed for channel/group media and message history.| Capability | RSC only | RSC + Graph |
|---|---|---|
| Channel message text (read/send) | Yes | Yes |
| DM file attachments | Yes | Yes |
| Channel/group image and file contents | No (HTML stub only) | Yes |
| Message history | No (live webhook only) | Yes |
ChannelMessage.Read.Group, ChannelMessage.Send.Group, Member.Read.Group, ChatMessage.Read.Chat. For channel media and history, add Graph ChannelMessage.Read.All and Chat.Read.All (or ChatMessage.Read.All) and grant admin consent. After any permission change, bump the manifest version, re-upload, reinstall in the team, and fully quit and relaunch Teams.
Sending files in group chats
DMs use the FileConsentCard flow out of the box. Group chats and channels require a SharePoint upload (bots have no personal OneDrive). Add GraphSites.ReadWrite.All (and optionally Chat.Read.All for per-user sharing links), grant admin consent, fetch your SharePoint site ID, then set channels.msteams.sharePointSiteId. Inline images work everywhere without SharePoint.
Target formats
| Target | Format | Example |
|---|---|---|
| User by ID | user:<aad-object-id> | user:40a1a0ed-... |
| User by name | user:<display-name> | user:John Smith (requires Graph) |
| Group/channel | conversation:<conversation-id> | conversation:19:abc...@thread.tacv2 |
card parameter.
Reply style
Teams has two channel UI styles that share one data model, and the API does not expose which a channel uses. Setchannels.msteams.replyStyle (thread for classic Posts, top-level for Slack-like Threads), with per-team and per-channel overrides under channels.msteams.teams.<id>....
Troubleshooting
No responses in a channel
No responses in a channel
Mentions are required by default. Set
channels.msteams.requireMention: false or configure it per team/channel.Images not showing in channels
Images not showing in channels
Graph permissions or admin consent are missing. Add the Graph permissions, grant consent, reinstall the app, and fully quit/relaunch Teams.
401 Unauthorized from the webhook
401 Unauthorized from the webhook
Teams still shows the old manifest
Teams still shows the old manifest
Remove and re-add the app, then fully quit Teams (not just close the window) to clear cached metadata.
Webhook timeouts / duplicate replies
Webhook timeouts / duplicate replies
Teams retries slow webhooks. WednesdayAI returns quickly and replies proactively, but very slow model responses can still cause retries.