Microsoft Teams
Unlike Discord and WhatsApp, Teams delivers messages by webhook: Microsoft POSTs each activity to your Elowen instance over HTTPS. That means the daemon's /hooks/ path must be reachable from the internet on your domain with a valid certificate. Installs provisioned by elowen install already route /hooks/ to the daemon in the generated nginx/Apache vhost; for a hand-written proxy config, add the location from the Deployment guide.
For what every channel shares — reactions, reasoning, service language, and the security model — see Channels.
1. Register the app in Microsoft Entra
- Open the Entra admin center → App registrations → New registration.
- Name it (e.g. "Elowen"), pick Accounts in this organizational directory only (single tenant), and register.
- From the Overview page, copy the Application (client) ID and the Directory (tenant) ID.
- Under Certificates & secrets → New client secret, create a secret and copy its value (shown only once).
2. Create the Azure Bot
- In the Azure portal, create an Azure Bot resource.
- Under Type of app, choose Single Tenant and enter the Application (client) ID from step 1 — the bot identity must be the same app registration.
- In the bot's Configuration, set the Messaging endpoint to:
https://<your-domain>/hooks/msteams/messages - Under Channels, add the Microsoft Teams channel.
3. Configure the plugin
In Elowen: Settings → Plugins → Microsoft Teams →
- Paste the Microsoft App ID, Client secret, and Tenant ID.
- Map at least one role policy (see below).
- Enable the plugin. It validates the credentials immediately — a typo'd secret shows up in the plugin logs right away.
4. Install the bot in Teams
Teams only talks to bots installed from an app package. The plugin builds one for you:
- On the plugin's Connection card, click Download app package (a ZIP with the Teams manifest and icons, including the slash-command list for the compose box).
- Upload it in the Teams admin center → Teams apps → Manage apps → Upload new app (org-wide), or sideload it into a single team via Apps → Manage your apps → Upload an app if sideloading is allowed.
- Add the bot to a personal chat, group chat, or team channel and say hello.
Role policies
Each policy maps a sender to an Elowen project scope and an optional role prompt. First match wins; unmapped senders are silently ignored. The ID can be:
- Entra object ID — the user's directory GUID (exact match)
- UPN / email —
alex@contoso.com(case-insensitive) - Conversation ID — a whole chat or channel; grants access to everyone in it
Mark a policy Admin to allow model switching and the Teams chat tools. Each policy can also narrow the allowed tools.
Commands and cards
| Command | What it does |
|---|---|
/model | Pick the model for this chat (Adaptive Card picker) |
/reasoning | Pick the reasoning effort |
/display | Configure live tool activity and answer delivery |
/context | Continue one of your existing conversations in this chat |
/new | Start a fresh conversation |
/status | Model + context usage of the live session |
/help | Show available commands |
AskUserQuestion renders as an Adaptive Card with tappable options (single-select answers on tap, multi-select with a Submit button, plus a free-text "Other" field). Only the person the question was addressed to — or an admin — can answer.
Mentions
Team-channel posts always require an @mention — Teams only delivers mentioned messages to bots. In group chats, respondWithoutMention (default on) makes the bot answer every message from a mapped sender; personal chats always get an answer.
Proactive pushes
Set Notification conversation to a conversation ID the bot has already seen and cron/tick results are posted there. A user's Entra object ID also works — the bot opens the personal chat itself.