omadiaomadia.ai
registry
integrationm365

Microsoft 365 Connector

@omadia/integration-microsoft365

Gemeinsamer Microsoft-Graph-Layer (Bot-Framework App-Registration) für alle Microsoft-365-Konsumenten. Stellt den Kernel-Service 'microsoft365.graph' (Microsoft365Accessor) bereit — konsumiert vom Teams-Channel und den Kalender-Tools.

latest
v0.8.2
license
MIT
versions
17
author
byte5 GmbH

install

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

registryhttps://hub.omadia.ai

setup guide

Get Microsoft 365 credentials

Register an app in Microsoft Entra ID (Azure AD) and grant Microsoft Graph permissions. You need three values: Tenant ID, App (Client) ID, App (Client) Secret. This app is also reused by the Teams channel.

1. Register the app

  1. Azure PortalMicrosoft Entra IDApp registrationsNew registration → name it → Register.
  2. Overview → copy Directory (tenant) ID → field Azure AD Tenant ID.
  3. Overview → copy Application (client) ID → field App (Client) ID.

2. Client secret

Certificates & secretsNew client secret → copy the Value immediately (not shown again) → field App (Client) Secret.

3. Graph permissions

  1. API permissionsAdd a permissionMicrosoft GraphApplication permissions.
  2. Add what your use case needs (e.g. Calendars.Read, Mail.Read, User.Read.All, Files.Read.All).
  3. Click Grant admin consent for <Tenant> (requires an admin).

For the Teams provisioning capability (teamsProvisioner@1) additionally add: Application.ReadWrite.OwnedBy, AppCatalog.ReadWrite.All, TeamsAppInstallation.ReadWriteForTeam.All, TeamsAppInstallation.ReadWriteAndConsentForTeam.All, Team.ReadBasic.All.

To install an agent into a group chat (since 0.7.0) also add TeamsAppInstallation.ReadWriteForChat.All and TeamsAppInstallation.ReadWriteAndConsentForChat.All. Not the …SelfForChat.All variant — that one only lets an app install itself, while the provisioner installs the per-agent app it generated.

The two …AndConsent… roles are not optional extras: the generated app packages declare seven resource-specific permissions, and an install that cannot consent to them is refused with 400 ResourceSpecificPermissionsMismatch (since 0.8.2 the connector sends the consent itself — the role is the half you grant).

Listing the teams an agent can be installed into (listTeams, since 0.8.0) needs no new permission: it reuses Team.ReadBasic.All from the list above. Listing CHATS is a different story — see the note at the end of the sign-in section below.

4. One-time admin sign-in for catalog publishing

Publishing a Teams app package (POST /appCatalogs/teamsApps) is the one step Microsoft Graph does not support with application permissions — the reference says "Not supported." for that verb. omadia therefore asks a tenant administrator to sign in once per tenant. Every agent provisioned afterwards publishes automatically; there is no manual upload per agent.

omadia registers a minimal helper app for this itself (public client, no client secret, one delegated permission: AppCatalog.ReadWrite.All). Start the sign-in from the omadia UI, open the shown URL, enter the code, and approve for your organization. If the sign-in page says approval is required, an admin must first open the consent link omadia displays.

Note: if your tenant blocks the OAuth device code flow via Conditional Access ("authentication flows"), the sign-in fails. Add an exception for the omadia publisher app — it holds two delegated permissions and no secret.

One more sign-in as of 0.8.0

The sign-in now also asks for the delegated Chat.ReadBasic, so omadia can OFFER the administrator's chats as install targets instead of asking an operator to paste a chat id. Microsoft Graph has no tenant-wide application-permission route for listing chats at all — bare GET /chats is delegated-only and the application form is the per-user GET /users/{id}/chats — so this is the only way to build the list.

Chat.ReadBasic reads names and members of chats, never messages, and needs no admin consent of its own. But an existing credential cannot acquire it by refreshing: an administrator who signed in before 0.8.0 has to sign in once more before the chat picker works. Publishing keeps working with the old credential in the meantime; only the chat list reports the gap, and it reports it as a typed "sign in again" rather than a permission error.

Extending an existing app registration requires renewed admin consent: click Grant admin consent for <Tenant> again. If Graph still answers 403 afterwards, grant the app roles via REST appRoleAssignments and restart the middleware — portal/CLI consent sometimes silently fails to apply.

App-only (client-credentials) flow: no user sign-in, access is tenant-wide within the granted permissions.

versions

v0.8.2
>=1.0 <2.0286.1 KB2026-08-31
.zipd2d98acc509c
v0.8.1
>=1.0 <2.0277.7 KB2026-08-31
.zip8fbf712f6dfb
v0.8.0
>=1.0 <2.0276.6 KB2026-08-29
.zip5167ef7b85f3
v0.7.0
>=1.0 <2.0249.8 KB2026-08-29
.zipaaf5714ea626
v0.6.0
>=1.0 <2.0232.5 KB2026-08-28
.zip89cd3ee49dc6
v0.5.4
>=1.0 <2.0179.2 KB2026-08-28
.zipf9ef082721cb
v0.5.3
>=1.0 <2.0176.6 KB2026-08-28
.zip8357a86ab273
v0.5.2
>=1.0 <2.0170.0 KB2026-08-28
.zipa8a6232898ab
v0.5.1
>=1.0 <2.0169.8 KB2026-08-28
.zip327170bd5bbe
v0.5.0
>=1.0 <2.0169.6 KB2026-08-28
.zip659da869ce1b
v0.4.0
>=1.0 <2.0145.3 KB2026-08-27
.zipd3a0e6be99f4
v0.3.1
>=1.0 <2.0141.4 KB2026-08-26
.zip67c82252d3e9
v0.2.4
>=1.0 <2.038.3 KB2026-08-17
.zipf6fed8f19f80
v0.2.3
>=1.0 <2.030.3 KB2026-06-03
.zip975cae0a0ec4
v0.2.2
>=1.0 <2.030.2 KB2026-06-03
.zipdeca9e410dd9
v0.2.1
>=1.0 <2.029.4 KB2026-05-29
.zip03a3f74739fd
v0.2.0
>=1.0 <2.029.4 KB2026-05-29
.zip5f11423726df

setup fields

Values the operator fills in at install-time.

microsoft_tenant_idstring
Azure AD Tenant IDGUID der Tenant-Registration, z.B. 11111111-2222-3333-4444-555555555555.
required
microsoft_app_idstring
App (Client) IDGUID der Bot-Framework App-Registration.
required
microsoft_app_passwordsecret
App (Client) SecretRotierbar im Azure Portal → App Registration → Certificates & secrets.
required
azure_subscription_idstring
Azure Subscription IDGUID der Azure-Subscription, in der die Azure-Bot-Ressourcen angelegt werden. Leer lassen für Registration-only-Modus (kein automatisches Bot-Provisioning).
optional
azure_resource_groupstring
Azure Resource GroupName der Resource Group für Microsoft.BotService/botServices. Leer lassen für Registration-only-Modus.
optional
azure_regionstring
Azure RegionARM-Location der Bot-Ressourcen, für Azure Bot Services üblicherweise 'global'. Leer lassen für Registration-only-Modus.
optional
azure_sp_client_idstring
ARM Service Principal Client IDClient-ID eines dedizierten Service Principals für management.azure.com. Leer lassen, um die Bot-Framework-App (App (Client) ID + Secret) für ARM wiederzuverwenden.
optional
azure_sp_client_secretsecret
ARM Service Principal Client SecretClient-Secret des dedizierten ARM Service Principals. Leer lassen, um das App (Client) Secret der Bot-Framework-App wiederzuverwenden.
optional

permissions

memory

reads: [0] · writes: [0]

graph

reads: [0] · writes: [0]

network

outbound: [3]

filesystem

scratch: false

secrets

runtime_write: true