Kiro Crew can run as a Microsoft Teams bot. DM your agent from Teams and get a typing indicator while it works, then the final reply in one message.
The Microsoft Bot Framework pushes activities to an endpoint you host. Crew:
POST /api/messaging/teamsAuthorization: Bearer <jwt> against Bot Framework signing keys before processing200, runs the agent turn in the background, then sends the reply via the Bot Connector REST APIpip install "kirocrew[teams]"https://<your-host>/api/messaging/teamsThen side-load a Teams app package (Developer Portal → new app → Bot with your App ID, scope Personal) and DM the bot.
In ~/.kiro/crew/.env:
MICROSOFT_APP_ID=<your app id> MICROSOFT_APP_PASSWORD=<your client secret> MICROSOFT_APP_TENANT_ID=<tenant id or leave unset>
In ~/.kiro/crew/config.json:
{ "teams": { "enabled": true, "allowed_emails": ["you@yourcompany.com"] } }
Install the Teams extra: pip install "kirocrew[teams]"
Then: kirocrew restart
| Command | Effect |
|---|---|
/new | Fresh conversation |
/compact | Compress context |
/sessions | Continue a recent or matching dashboard session in this conversation (owner only) |
/steer <message> | Fold this message into the running turn |
/queue <message> | Hold this message until the current turn finishes |
/help | List commands |
Run /sessions to bind a Teams conversation to one of your dashboard sessions. It works only when teams.allowed_emails holds exactly one identity, so there is one clear owner; with a shared allowlist, the listing is refused to protect your dashboard transcripts. When a text message arrives while that session is already mid-turn, Kiro Crew keeps it rather than dropping it. It either steers the message into the running turn or queues it to run when the turn finishes. The conversation reports which happened: a steering reply says your message was folded into the running turn; a queued reply says it runs when the current turn finishes.
messaging.queue_mode in config.json sets the default: steer (the default) folds the message into the running reply; queue holds it for after the turn. A /steer or /queue prefix overrides the mode for that one message. A message with attachments is neither steered nor queued into the bound session; the reply asks you to send it again once the turn finishes. When no dashboard turn is in progress, the message runs as a fresh turn in the bound session.
| Key | Default | Purpose |
|---|---|---|
teams.enabled | false | Turns the channel on |
teams.allowed_emails | [] | UPNs/emails/object IDs allowed (empty = nobody) |
teams.soft_threshold_pct | 80 | Context % where bot suggests /compact |
teams.hard_threshold_pct | 95 | Force-compact threshold |
messaging.queue_mode | steer | How a message that arrives mid-turn is handled: steer folds it into the running reply, queue runs it after the turn (a shared messaging setting, not Teams-only) |
| Problem | Fix |
|---|---|
| 401 on inbound requests | App ID or secret is wrong; check Azure Bot registration |
| Bot doesn't respond | Confirm allowed_emails includes your UPN or object ID |
kirocrew[teams] not installed | Install with pip install "kirocrew[teams]" |
| No green badge in Settings | Outbound credential validation failed — check App ID/Password |
Teams