omadiaomadia.ai
registry
channelchannel.teams

Microsoft Teams Channel

@omadia/channel-teams

Microsoft Teams als First-Class-Channel für Omadia. Bot-Framework-Adapter, Adaptive-Card-Rendering, Roster + Mention-Resolution, Attachment-Persistenz mit HMAC-signiertem Proxy. Konsumiert den geteilten Graph-Client aus `@omadia/integration-microsoft365` für Attachment-Downloads + Roster-Lookups.

latest
v0.27.0
license
MIT
versions
28
author
byte5 GmbH

install

In your omadia instance, open Admin → Registries and add this registry, then install Microsoft Teams Channel from Admin → Plugins → Store.

registryhttps://hub.omadia.ai

setup guide

Connect Microsoft Teams

Teams runs as an Azure Bot that reuses the same Azure AD app as the Microsoft 365 integration. Install @omadia/integration-microsoft365 first — it owns the app credentials (client id / secret / tenant); this channel only adds Teams-specific knobs.

1. Register the Azure Bot

  1. Azure Portal → create an Azure Bot resource.
  2. Use the existing app registration from the Microsoft 365 integration (same Microsoft App ID).
  3. Configuration → Messaging endpoint: <your-public-base-url>/api/teams/messages.
  4. Channels → enable Microsoft Teams.

Multiple bots (optional)

One plugin install can run several Teams bots — one Entra app registration / Azure bot per omadia agent. Configure them as a JSON array in Teams Bots (JSON):

[{"botSlug": "default", "appId": "<entra-app-id>",
  "tenantId": "<entra-tenant-id>",
  "appPasswordSecretRef": "microsoft_app_password",
  "appType": "SingleTenant", "displayName": "Omadia"}]
  • appPasswordSecretRef names the vault secret holding that bot's app password — never put the password itself into config.
  • appType defaults to SingleTenant (Azure deprecated creating MultiTenant registrations 07/2025); legacy bots may set MultiTenant.
  • Each bot's Azure messaging endpoint is <your-public-base-url>/api/teams/<botSlug>/messages. The first entry is the default bot — it also serves the legacy /api/teams/messages and /api/messages endpoints, so existing Azure bot registrations keep working.
  • Leave the field empty to keep the classic single-bot setup: the Microsoft 365 integration's app credentials are used as bot default (app type from MICROSOFT_APP_TYPE, default MultiTenant).

2. Upload the Teams app

Upload the Teams app package (manifest.json + icons as a ZIP) in Teams under Apps → Manage your apps → Upload a custom app.

3. Optional knobs

  • OAuth Connection Name: if you add a v4 OAuth connection in the Azure Bot Service, put its name here to enable calendar SSO (OBO flow). Empty → calendar tools report sso_unavailable.
  • Notify Team ID: the AAD groupId of the team where bell notifications appear — get it via Teams → Team settings → Get link to team (groupId query param) or Graph Explorer (/teams). Empty → log-only.
  • Attachment prefix, topic URL and directory label have safe defaults.

4. Auto-invite agent apps (optional Graph consent)

With Agent Apps (JSON) (teams_agent_apps) configured, the channel auto-installs the listed omadia agent apps into a team when one of its bots is added there. That needs two extra Graph application permissions on the shared app registration (admin consent required — note that previously granted consent does not stretch to newly added scopes: re-grant admin consent on the existing registration, otherwise Graph keeps answering 403):

  • AppCatalog.ReadWrite.All — resolve the agent app in the tenant app catalog (/appCatalogs/teamsApps)
  • TeamsAppInstallation.ReadWriteForTeam.All — install the catalog app into the target team (POST /teams/{team-id}/installedApps)

Grant them under API permissions → Add a permission → Microsoft Graph → Application permissions, then Grant admin consent for <Tenant> — or send an admin through the tenant-wide admin-consent URL (public client id only, never a secret): https://login.microsoftonline.com/<tenant-id>/adminconsent?client_id=<application-client-id>

Two field-tested gotchas: portal/CLI consent sometimes silently fails to apply (command succeeds, Graph keeps answering 403) — then grant the app roles directly via REST POST /servicePrincipals/{app-sp-object-id}/appRoleAssignments, one call per missing permission. And acquired tokens are cached: restart the middleware after granting consent, or the 403s persist even though consent is in place. Without consent the feature degrades gracefully — the bot posts a fallback card with per-agent install deep links (https://teams.microsoft.com/l/app/<teamsAppId>, public app ids only).

versions

v0.27.0
>=1.0 <2.0262.2 KB2026-09-04
.zip4c8585a5b2ce
v0.26.2
>=1.0 <2.0261.7 KB2026-09-04
.zipd0f12191b0c9
v0.26.1
>=1.0 <2.0260.9 KB2026-09-04
.zip59af5b8498e9
v0.26.0
>=1.0 <2.0260.0 KB2026-09-04
.zip5517ca44fa5c
v0.25.0
>=1.0 <2.0258.8 KB2026-09-01
.zip7c1908ffe406
v0.24.0
>=1.0 <2.0258.4 KB2026-09-01
.zipf732a6855145
v0.23.0
>=1.0 <2.0255.8 KB2026-08-31
.zipe34339fd9ead
v0.22.0
>=1.0 <2.0252.2 KB2026-08-31
.zipb4dcd81015a5
v0.21.0
>=1.0 <2.0248.8 KB2026-08-26
.zip2924fe0bacbb
v0.20.0
>=1.0 <2.0172.4 KB2026-08-25
.zip9c8d7567f10e
v0.19.3
>=1.0 <2.0170.8 KB2026-08-25
.zip20a17ec6b34a
v0.19.2
>=1.0 <2.0169.7 KB2026-08-25
.zipa930a75fd856
v0.19.1
>=1.0 <2.0167.7 KB2026-08-24
.zip890e197b3547
v0.18.0
>=1.0 <2.0156.6 KB2026-08-24
.zip93189f3e8b27
v0.17.0
>=1.0 <2.0155.6 KB2026-08-23
.zip9fdd52e806e9
v0.16.0
>=1.0 <2.0151.0 KB2026-08-22
.zipa373927984cd
v0.15.0
>=1.0 <2.0149.8 KB2026-08-22
.zipc702bfa77270
v0.14.0
>=1.0 <2.0148.9 KB2026-08-21
.zip9c512c620b28
v0.13.0
>=1.0 <2.0148.4 KB2026-08-21
.zip84db7e0c9678
v0.12.7
>=1.0 <2.0137.6 KB2026-08-17
.zipcd442b12033f
v0.11.0
>=1.0 <2.0127.2 KB2026-06-18
.zip6f6cb8bd07a9
v0.10.7
>=1.0 <2.0121.6 KB2026-06-03
.zip0f7a9a65fd2f
v0.10.6
>=1.0 <2.0121.5 KB2026-06-03
.zipde6cacc9ac4e
v0.10.5
>=1.0 <2.0120.6 KB2026-06-03
.zipebf231724e44
v0.10.4
>=1.0 <2.0117.3 KB2026-06-01
.zip20b187b4bdfa
v0.10.3
>=1.0 <2.0116.5 KB2026-05-30
.zip7567876214df
v0.10.2
>=1.0 <2.0117.2 KB2026-05-29
.zipd29b0b48e80c
v0.10.1
>=1.0 <2.0117.3 KB2026-05-29
.zip2b6b1c07fd73

setup fields

Values the operator fills in at install-time.

teams_botsstring
Teams Bots (JSON)Optionale Multi-Bot-Konfiguration (#860): JSON-Array von Bot-Identitäten [{botSlug, appId, tenantId, appPasswordSecretRef, appType?, displayName?}]. appPasswordSecretRef referenziert das Vault-Secret mit dem App-Passwort des Bots (niemals das Passwort inline). appType: MultiTenant | SingleTenant | UserAssignedMSI, Default SingleTenant. Eintrag 0 ist der Default-Bot (bedient auch /api/messages + /api/teams/messages); jeder Bot empfängt unter /api/teams/<botSlug>/messages. Leer lassen → Single-Bot-Betrieb über die Credentials der Microsoft-365-Integration (microsoft_app_id / microsoft_tenant_id / microsoft_app_password, App-Typ aus MICROSOFT_APP_TYPE, Default MultiTenant).
optional
teams_agent_appsstring
Auto-Invite Agenten-Apps (JSON)Optionale Auto-Invite-Konfiguration (#860 W2): JSON-Array [{agentSlug, teamsAppExternalId, teamsAppId?, displayName?}]. Wird einer unserer Bots in ein Team eingeladen, installiert er die gelisteten Agenten-Apps automatisch über die teamsProvisioner@1-Capability des M365-Connectors (Graph-Consent siehe Setup-Guide Abschnitt 4). agentSlug ist der Omadia-Conductor-Slug (nur Label/Status, kein Routing). teamsAppId (Graph-Katalog-ID) überspringt den Katalog-Lookup; ohne sie wird getCatalogApp des Connectors (>= 0.3.1) genutzt, sofern vorhanden. Alle IDs sind öffentliche App-IDs — niemals Secrets. Leer lassen → Feature komplett aus.
optional
teams_sso_connection_namestring
Bot Framework OAuth Connection NameName der im Azure Bot Service konfigurierten OAuth-Connection (v4). Wenn gesetzt, versucht der Bot pro Turn ein UserTokenClient.getUserToken() — das resultierende JWT wird als ssoAssertion an die Kalender-Tools weitergereicht (OBO-Flow für delegierte Graph-Scopes). Leer lassen → Kalender-Tools surface 'sso_unavailable'.
optional
teams_attachment_key_prefixstring
Tigris-Key-Präfix für AttachmentsNamespace-Präfix für persistierte Teams-Attachments im gemeinsamen Tigris-Bucket. Erlaubt Co-Existenz mit den Diagram-Renderings (`diagrams/`). Default 'teams-attachments'.
optional
teams_notify_team_idstring
Teams-Team-ID für Bell-NotificationsGroup-ID des Microsoft Teams Teams (AAD groupId), in dem plugin-emittierte Notifications als Activity-Feed-Bell erscheinen sollen. Holst du via Teams → Team-Settings → Get link to team → groupId-Query-Param ODER via Graph Explorer (/teams). Leer lassen → Fallback auf log-only.
optional
teams_notify_topic_urlstring
Topic-URL für Activity-NotificationBrowser-Url die Teams öffnet, wenn der User auf die Bell-Notification klickt. Default: Omadia-Hub. Plugin-spezifische Deep-Links überschreiben das pro Notification.
optional
teams_directory_labelstring
Dashboard-Label für Channel-RoutingOptionales operator-freundliches Label für /operator/channels (statt 'Teams · <bot-app-id-short>'). Beispiel: 'Teams · Production · Marketing'. Leer lassen → generiertes Default-Label.
optional

permissions

events

emit: true

memory

reads: [0] · writes: [0]

graph

reads: [0] · writes: [0]

network

outbound: [2]

filesystem

scratch: false