M365 Planner Skill
Manage Microsoft 365 Planner through Microsoft Graph API.
What's New in v1.1.0
- ✅ Node.js Scripts – Standalone scripts ohne
mgcCLI - ✅ If-Match Header Support – Korrekte ETag-Behandlung für Updates/Löschungen
- ✅ Group-Based API – Direkter Zugriff über M365 Group-ID
- ✅ Recurring Tasks – Hinweis auf native Planner-Wiederholungsfunktion
- ✅ Cleanup Scripts – Automatisierte Bereinigung von Tasks
Prerequisites
- Azure AD App Registration (see Setup below)
- Node.js v18+ mit
@microsoft/microsoft-graph-clientundaxios - M365 Group (kein Security Group oder Distribution List!)
Quick Start
# Connection testen
node scripts/test-connection.js
# Alle Pläne anzeigen
node scripts/list_plans.js
# Plan erstellen
node scripts/create_plan.js "Project Name" <group-id>
# Task erstellen
node scripts/create_task.js <plan-id> <bucket-id> "Task Title"
Setup: Azure AD App Registration
Schritt 1: App Registration erstellen
Azure Portal:
- https://portal.azure.com → Azure Active Directory → App registrations
- "New registration"
- Name:
M365-Planner-Integration - Supported account types:
Accounts in this organizational directory only - Redirect URI: None (Client Credentials Flow)
Oder per Azure CLI:
az login
az ad app create --display-name "M365-Planner-Integration" --sign-in-audience "AzureADMyOrg"
Notiere die Application (client) ID aus der Ausgabe.
Schritt 2: API Permissions hinzufügen
Wichtig: Verwende Application Permissions (nicht Delegated)!
Azure Portal:
- App → API permissions → Add a permission
- Microsoft Graph → Application permissions
- Hinzufügen:
Group.Read.All(nicht Group.ReadWrite.All – reicht für Planner)Tasks.ReadWrite.All
- Admin Consent erteilen: "Grant admin consent for [Tenant]" klicken!
Oder per Azure CLI:
APP_ID="deine-app-id"
# Group.Read.All
az ad app permission add \
--id $APP_ID \
--api 00000003-0000-0000-c000-000000000000 \
--api-permissions 5b567253-7703-48e2-861c-caed61531407=Role
# Tasks.ReadWrite.All
az ad app permission add \
--id $APP_ID \
--api 00000003-0000-0000-c000-000000000000 \
--api-permissions bdfbf15f-ee85-495a-99a9-ef9b2abb1dcb=Role
# Admin Consent
az ad app permission admin-consent --id $APP_ID
Schritt 3: Client Secret erstellen
Azure Portal:
- App → Certificates & secrets → Client secrets → New client secret
- Description:
OpenClaw Integration - Expires: 24 Monate (Maximum)
- Werte sofort kopieren! – Wird nur einmal angezeigt
Oder per Azure CLI:
az ad app credential reset \
--id $APP_ID \
--append \
--display-name "OpenClaw Integration"
Schritt 4: Environment konfigurieren
Credentials in ~/.openclaw/.env speichern:
# Microsoft 365 Planner Credentials
M365_CLIENT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
M365_CLIENT_SECRET="your-secret-value"
M365_TENANT_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Berechtigungen sichern:
chmod 600 ~/.openclaw/.env
Schritt 5: Verbindung testen
node scripts/test-connection.js
Erwartete Ausgabe:
✅ Access Token erfolgreich erhalten!
📋 Test: M365 Groups...
3 Gruppen gefunden:
- MerkelDesign ✅ M365/Planner-fähig
✅ Verbindung erfolgreich!
Wichtige Hinweise
M365 Groups vs. Security Groups
Planner funktioniert NUR mit M365 Groups!
- ✅ M365 Group – Hat Exchange-Postfach, Teams, Planner (erkennbar an Mail-Attribut)
- ❌ Security Group – Nur für Berechtigungen, kein Planner
- ❌ Distribution List – Nur für E-Mail-Verteiler, kein Planner
Gruppen prüfen:
node scripts/test-connection.js
Zeigt alle Gruppen mit Status "✅ M365/Planner-fähig" an.
M365 Group erstellen (falls keine existiert):
- Microsoft 365 Admin Center → Groups → Add a group
- Oder Teams: Neues Team erstellen (erstellt automatisch M365 Group)
If-Match Header (ETag)
Alle Update- und Lösch-Operationen benötigen den If-Match Header!
Planner verwendet Optimistic Concurrency Control. Ohne ETag schlägt die Anfrage fehl.
Beispiel Delete:
// Falsch ❌
await client.api(`/planner/tasks/${taskId}`).delete();
// Richtig ✅
const task = await client.api(`/planner/tasks/${taskId}`).get();
await client.api(`/planner/tasks/${taskId}`)
.headers({ 'If-Match': task['@odata.etag'] })
.delete();
Beispiel Update:
const task = await client.api(`/planner/tasks/${taskId}`).get();
await client.api(`/planner/tasks/${taskId}`)
.headers({ 'If-Match': task['@odata.etag'] })
.update({ percentComplete: 50 });
Group-Based API Endpoints
Nicht verwenden:
GET /planner/plans ❌ (braucht komplexen Filter)
Verwenden:
GET /groups/{group-id}/planner/plans ✅
Beispiel:
const plans = await client.api(`/groups/${groupId}/planner/plans`).get();
Recurring Tasks (Wiederkehrende Aufgaben)
Microsoft Planner unterstützt native wiederkehrende Tasks!
In der Planner Web-UI oder Mobile App:
- Task öffnen
- "Repeat" / "Wiederholen" klicken
- Frequenz wählen: Täglich, Wöchentlich, Monatlich, Jährlich, Benutzerdefiniert
Beispiel:
- "Verlängerung domain.de" → Jährlich wiederholen
- "Backup prüfen" → Wöchentlich wiederholen
⚠️ API-Limit: Die Graph API unterstützt das Erstellen von recurring Tasks nicht direkt. Wiederkehrende Tasks müssen über die Planner UI eingerichtet werden.
Common Operations
Plans
| Operation | Script |
|---|---|
| List all plans | node scripts/list_plans.js |
| Create plan | node scripts/create_plan.js <name> <group-id> |
| Delete plan | node scripts/delete_plan.js <plan-id> |
Buckets
| Operation | Script |
|---|---|
| List buckets | In list_plans.js integriert |
| Create bucket | node scripts/create_bucket.js <plan-id> <name> |
| Delete bucket | node scripts/delete_bucket.js <bucket-id> |
Tasks
| Operation | Script |
|---|---|
| List tasks | In list_plans.js integriert |
| Create task | node scripts/create_task.js <plan-id> <bucket-id> <title> |
| Update task | node scripts/update_task.js <task-id> --percent-complete 50 |
| Delete task | node scripts/delete_task.js <task-id> |
| Cleanup | node scripts/cleanup_verlaengerungen.js |
Helper Scripts
test-connection.js
Testet die Verbindung zu Microsoft Graph:
- Access Token anfordern
- Tenant-Informationen anzeigen
- Verfügbare M365 Groups auflisten
- Planner-Fähigkeit prüfen
node scripts/test-connection.js
list_plans.js
Zeigt alle Pläne einer M365 Group mit:
- Buckets und deren Tasks
- Task-Status (erledigt/in Arbeit/offen)
- Prozentuale Fortschrittsanzeige
node scripts/list_plans.js
create_plan.js
Erstellt einen neuen Plan mit Standard-Buckets:
- To Do
- In Progress
- Done
node scripts/create_plan.js "Project Alpha" <group-id>
cleanup_verlaengerungen.js
Bereinigt abgeschlossene Tasks aus einem Bucket:
- Löscht Tasks mit 100% Fortschritt
- Behält offene Tasks
- Korrekte If-Match Header Behandlung
node scripts/cleanup_verlaengerungen.js
Troubleshooting
Error: Insufficient privileges
Ursache: Admin Consent nicht erteilt
Lösung:
az ad app permission admin-consent --id <app-id>
Oder im Azure Portal: API permissions → Grant admin consent
Error: Group not found
Ursache: Planner funktioniert nur mit M365 Groups
Lösung:
- Prüfe ob es eine M365 Group ist (hat Mail-Attribut)
- Security Groups/Distribution Lists funktionieren nicht
- Neue M365 Group erstellen (Teams oder Admin Center)
Error: The If-Match header must be specified
Ursache: Update/Delete ohne ETag
Lösung:
// Erst Task holen für ETag
const task = await client.api(`/planner/tasks/${id}`).get();
// Dann mit If-Match Header updaten/löschen
await client.api(`/planner/tasks/${id}`)
.headers({ 'If-Match': task['@odata.etag'] })
.delete();
Error: This entity set must be queried with a filter
Ursache: /planner/plans Endpoint braucht Filter
Lösung: Group-basierten Endpoint verwenden:
// Falsch ❌
const plans = await client.api('/planner/plans').get();
// Richtig ✅
const plans = await client.api(`/groups/${groupId}/planner/plans`).get();
Error: Cannot find module '@microsoft/microsoft-graph-client'
Ursache: Node.js Pakete nicht installiert
Lösung:
cd ~/.openclaw/workspace/skills/m365-planner
npm install
Dependencies
Pakete lokal im Skill-Verzeichnis installieren:
cd ~/.openclaw/workspace/skills/m365-planner
npm install @microsoft/microsoft-graph-client axios
References
- Planner API Overview
- Setup Guide
- Common Patterns
- Microsoft Graph API Docs
- Planner REST API Reference
Changelog
v1.1.0 (2026-04-17)
- ✅ Node.js Scripts statt mgc CLI
- ✅ If-Match Header Support für Updates/Löschungen
- ✅ Group-based API Endpoints
- ✅ Test-Connection Script mit M365 Group Detection
- ✅ List Plans Script mit Bucket/Task-Übersicht
- ✅ Cleanup Script für abgeschlossene Tasks
- ✅ Dokumentation zu recurring Tasks (native Planner Feature)
- ✅ Troubleshooting Section erweitert
v1.0.0 (2023-01-19)
- Initiale Version mit mgc CLI
- Azure AD Setup Guide
- Grundlegende CRUD-Operationen
