360 Secure SkillHub
360 安全技能中心

M365 Planner

核心功能:通过Microsoft Graph API对M365 Planner的计划、 buckets、任务进行增删改查,支持群组级管理、任务分配、进度跟踪、自动清理完成任务,兼容原生重复任务功能。典型场景:团队项目任务统筹、日常工作追踪。需先完成Azure AD应用注册配置权限,通过Node.js脚本命令行操作,输出包含资源列表、操作成功状态等反馈,依赖Node.js v18+及相关Graph客户端包。

felox63
felox63
热度 22.16
最近更新 2026-04-18 05:26:46
分类:自动化依赖:代码执行 / 读写文件 / 第三方 API应用场景:API 集成 / 任务管理 / 自动化脚本 / 工作流

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add m365-planner
Metadata
name
m365-planner
description
Manage Microsoft 365 Planner plans, buckets, and tasks via Microsoft Graph API. Use when creating, listing, updating, or deleting Planner resources. Supports group-based plan management, task assignment, progress tracking, and recurring tasks. Requires Azure AD app registration with Group.Read.All and Tasks.ReadWrite.All permissions.
license
MIT
version
1.1.0

M365 Planner Skill

Manage Microsoft 365 Planner through Microsoft Graph API.

What's New in v1.1.0

  • ✅ Node.js Scripts – Standalone scripts ohne mgc CLI
  • ✅ 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

  1. Azure AD App Registration (see Setup below)
  2. Node.js v18+ mit @microsoft/microsoft-graph-client und axios
  3. 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:

  1. https://portal.azure.com → Azure Active Directory → App registrations
  2. "New registration"
  3. Name: M365-Planner-Integration
  4. Supported account types: Accounts in this organizational directory only
  5. 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:

  1. App → API permissions → Add a permission
  2. Microsoft Graph → Application permissions
  3. Hinzufügen:
    • Group.Read.All (nicht Group.ReadWrite.All – reicht für Planner)
    • Tasks.ReadWrite.All
  4. 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:

  1. App → Certificates & secrets → Client secrets → New client secret
  2. Description: OpenClaw Integration
  3. Expires: 24 Monate (Maximum)
  4. 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:

  1. Task öffnen
  2. "Repeat" / "Wiederholen" klicken
  3. 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:

  1. Prüfe ob es eine M365 Group ist (hat Mail-Attribut)
  2. Security Groups/Distribution Lists funktionieren nicht
  3. 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

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