--- tags: [it-management, integration, teams, graph] status: aktiv date: 2026-05-06 --- # Meeting Auto-Import via MS Graph ## Was ist das? Erweiterung von [[Obsidian O365 Kalender Integration]]: Nach Ende eines Jour-Fixe-Meetings zieht der Befehl `/meeting-end` automatisch **Transkript** und **Copilot-Recap** aus Teams via Microsoft Graph, mergt sie mit den live mitgeschriebenen Notizen und führt die Ergebnisse in die Agenda zurück (Historie, Archiv, Postponed). ## Workflow 1. Meeting läuft in Teams (mit aktivem Facilitator → Aufzeichnung + Copilot-Recap) 2. Nach Meeting: `/meeting-end` in der Meeting-Notiz 3. Script `fetch-meeting-artifacts.js` ruft Graph API: - `getEventById` → Event mit `seriesMasterId` + JoinUrl - `resolveOnlineMeeting` → Teams-OnlineMeeting via JoinUrl - `fetchTranscriptVtt` → letztes Transkript (.vtt) - `fetchAiInsights` (Beta) → Copilot-Recap (Topics, Decisions, Action Items) - `fetchRecordingUrl` → Recording-Link 4. Claude führt Doppel-Pass-Synthese aus: Recap + Transkript validiert 5. Sprecher-Mapping: Speaker-Namen → Personen-Wikilinks via `00 Kontext/Personen/` 6. Merge mit Live-Notizen (Live-Order bleibt, neue Items hinten) 7. Agenda-Rückführung mit Konfidenz-Heuristik: - Topic abgeschlossen → Archiv (mit Historie) - Topic postponed → `## ⏸️ Postponed` - Topic offen → datierter Historie-Eintrag in Agenda - Mehrdeutig → User-Bestätigung pro Topic 8. `recording_url` ins Frontmatter, `status: abgeschlossen` ## Komponenten **Scripts** (`scripts/`): - `fetch-meeting-artifacts.js` — CLI-Orchestrator (`--o365-id --out `) - `lib/graph-meetings.js` — Graph-Helper für OnlineMeetings/Transcripts/aiInsights/Recordings - `lib/vtt-parser.js` — VTT-Parser mit ``-Tags, optional Cue-Merge - `lib/speaker-matcher.js` — Speaker-Name → Person-Wikilink (wraps `person-matcher.js`) - `lib/o365-calendar.js` — erweitert um `getEventById` + `extractJoinUrlFromBody` - `backfill-series-id.js` — One-Shot: schreibt `o365_series_id` ins Agenda-Frontmatter **Commands** (`.claude/commands/`): - `meeting-end.md` — komplett neu: Auto-Import-Flow mit Konfidenz-Klassifikation - `meeting.md` — erweitert um Lazy-Backfill von `o365_series_id` **Frontmatter-Erweiterungen:** - Agenda: `o365_series_id: ` (verbindet Agenda fest mit Outlook-Serie) - Meeting-Notiz: `recording_url: ` (gesetzt wenn Recording vorhanden) ## Backfill-Status | Serie | O365-Titel | `o365_series_id` | |---|---|---| | IT Team | "diverse IT-Themen" | ✅ gesetzt | | LANdata | "Status Meeting KRAH / LANdata" | ✅ gesetzt | | Andere | — | Lazy-Backfill beim ersten `/meeting ` | ## Azure-Setup **App Registration:** OfficeAssist (`93f9f15c-b566-4ca1-9145-c23f87c7f5c7`) Authentication: OAuth2 Client Credentials Flow (`@azure/msal-node`) ### Application Permissions (Microsoft Graph, Admin Consent) Ergänzt am 2026-05-06: - `OnlineMeetings.Read.All` — OnlineMeeting per JoinUrl auflösen - `OnlineMeetingTranscript.Read.All` — `.vtt` lesen - `OnlineMeetingArtifact.Read.All` — Recording-URL lesen - `OnlineMeetingAiInsight.Read.All` — Copilot-Recap (Beta-Endpoint) Bereits vorhanden: `Calendars.Read`, `User.Read.All`, plus Mail/Sites. ### Application Access Policy (Teams PowerShell) **Wichtig:** Ohne diese Policy → 404 trotz korrekter Permissions. Microsoft-spezifisches Gate für Service-Apps gegen OnlineMeetings. **In Teams Admin Center UI nicht sichtbar** — nur PowerShell. Erstellt am 2026-05-06: ```powershell Connect-MicrosoftTeams New-CsApplicationAccessPolicy -Identity "obsidian-graph" ` -AppIds "93f9f15c-b566-4ca1-9145-c23f87c7f5c7" ` -Description "OfficeAssist meeting auto-import" Grant-CsApplicationAccessPolicy -PolicyName "obsidian-graph" ` -Identity "c.kauer@krah-gruppe.de" ``` Verifizierung: ```powershell Get-CsApplicationAccessPolicy -Identity "obsidian-graph" # erwartet: AppIds enthält 93f9f15c-... ``` Replikationszeit nach `Grant`: typisch 30-60 Min, manchmal mehrere Stunden. ### Lizenzen - E3 + Copilot for Microsoft 365 (für Recap via aiInsights Beta-Endpoint) - Ohne Copilot: Transkript + Recording funktionieren, Recap fällt weg ## Daten-Flow ``` Meeting endet └─> /meeting-end └─> fetch-meeting-artifacts.js --o365-id ├─> getEventById ── Calendars.Read ├─> resolveOnlineMeeting ── OnlineMeetings.Read.All + AccessPolicy ├─> fetchTranscriptVtt ── OnlineMeetingTranscript.Read.All ├─> fetchAiInsights ── OnlineMeetingAiInsight.Read.All (Beta) └─> fetchRecordingUrl ── OnlineMeetingArtifact.Read.All ── JSON ──> Claude: Doppel-Pass + Speaker-Mapping + Merge + Agenda-Rückführung └─> Meeting-Notiz + Agenda.md aktualisiert ``` ## Robustheit - Per-Artefakt-Fallback: schlägt Transcript fehl → Warning, Recap+Recording trotzdem holen - Fehlende Permissions / fehlende Policy → graceful: Warning + leere Felder, kein Crash - Recap fehlt (kein Copilot) → User-Prompt zum manuellen Einfügen - Kein O365-ID → User kann manuell weitermachen ohne Auto-Import ## Bekannte Einschränkungen - Nur Meetings, bei denen `AZURE_USER_EMAIL` der Organizer ist (Graph-Restriktion) - Recap-Qualität abhängig von Copilot — keine Kontrolle über Inhalte - Konfidenz-Heuristik bei mehrdeutigen Topics → User-Bestätigung nötig - Speaker-Mapping nur bei korrekt gepflegten Personen-Notizen mit Email/Name ## Siehe auch - [[docs/superpowers/specs/2026-05-06-meeting-end-auto-import-design]] — Design Spec - [[docs/superpowers/plans/2026-05-06-meeting-end-auto-import]] — Implementation Plan - [[Obsidian O365 Kalender Integration]] — Basis-Integration (Kalender-Lookup) - [[Jour Fixe System]] — Lifecycle der Agenda-Topics