Token导航 LogoToken导航TokenDH.com
研究检索敏感数据clawhub未标认证来源可访问clear审计提醒

m365-unifiedm365 统一

Agent Skill

m365-unified 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

4,539

周安装

193

GitHub Stars

1

下载量

1,590
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:m365-unified(m365 统一)
来源仓库:https://github.com/felox63/m365-unified
安装命令:
openclaw skills install m365-unified
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install m365-unified

简介

整合 Exchange、SharePoint、OneDrive 与 Planner 的统一接口。

  • 提供模块化功能组件便于按需启用特定服务模块。
  • 支持 Webhook 实时监听邮件与文档变更事件。
  • 需分别配置各服务的 OAuth 2.0 认证凭据。
  • 建议分模块测试后再全量上线保证系统稳定性。m365-unified 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

name
m365-unified
description
Unified Microsoft 365 skill for OpenClaw with modular features for Exchange Online (Email), SharePoint, OneDrive, and Planner. Supports webhooks for real-time notifications.

M365 Unified Skill

Version: 1.0.0 Author: OpenClaw Community License: MIT Repository: https://github.com/openclaw/m365-unified-skill

Overview

Unified Microsoft 365 skill for OpenClaw providing modular access to Microsoft Graph API services. Features include Exchange Online (Email), SharePoint, OneDrive, and Planner integration with optional webhook support for real-time notifications instead of polling.

Features

Core Modules

ModuleDescriptionRequired Permissions
EmailSend, receive, move emails, manage folders, handle attachmentsMail.Read, Mail.ReadWrite, Mail.Send
SharePointUpload/download files, manage document librariesSites.ReadWrite.All, Files.ReadWrite.All
OneDrivePersonal file storage, attachment backupFiles.ReadWrite.All
PlannerTask management, create tasks from emailsTasks.ReadWrite, Group.Read.All

Advanced Features

  • 🔔 Webhooks - Real-time notifications via Microsoft Graph subscriptions (no polling needed)
  • 📬 Shared Mailboxes - Support for team/shared mailboxes
  • 🔄 Email → Task - Automatically create Planner tasks from emails
  • 📎 Attachment → SharePoint - Save email attachments directly to SharePoint
  • 🔐 OAuth2 App-Only - Secure authentication using Azure AD app registrations

Architecture

m365-unified/
├── src/
│   ├── index.js                 # Main entry point (modular client)
│   ├── auth/
│   │   └── graph-client.js      # OAuth2 authentication & token management
│   ├── email/
│   │   ├── mail.js              # Send, receive, search emails
│   │   ├── folders.js           # Folder/mailbox management
│   │   └── attachments.js       # Attachment download & handling
│   ├── sharepoint/
│   │   └── files.js             # SharePoint file operations
│   ├── onedrive/
│   │   └── files.js             # OneDrive file operations
│   ├── planner/
│   │   ├── tasks.js             # Task CRUD operations
│   │   └── plans.js             # Plan & bucket management
│   └── webhooks/
│       └── subscriptions.js     # Webhook subscription lifecycle
├── scripts/
│   ├── setup-wizard.js          # Interactive setup & configuration
│   ├── test-connection.js       # Test authentication & connectivity
│   ├── test-email.js            # Test email features
│   ├── test-sharepoint.js       # Test SharePoint features
│   ├── test-onedrive.js         # Test OneDrive features
│   ├── test-planner.js          # Test Planner features
│   ├── manage-webhooks.js       # Create/list/renew/delete webhooks
│   ├── webhook-handler.js       # Express server for webhook notifications
│   └── process-invoice-email.js # Example: Invoice processing workflow
├── docs/
│   ├── webhooks.md              # Webhook setup & troubleshooting
│   └── SHARED-MAILBOXES.md      # Shared mailbox configuration
├── config/
│   └── template.env             # Environment template (placeholders only)
├── package.json
└── SKILL.md                     # This file

Quick Start

1. Install Dependencies

cd m365-unified
npm install

2. Run Setup Wizard

npm run setup
# or
node scripts/setup-wizard.js

The interactive wizard will:

  • Ask which features you need (Email, SharePoint, OneDrive, Planner, Webhooks)
  • Generate a personalized .env file with placeholders
  • Provide a checklist for Azure AD app registration
  • Show required API permissions based on your selections
  • Guide you through mailbox access restrictions

3. Configure Azure AD App Registration

Step 1: Create App Registration

  1. Go to Azure Portal → Azure Active Directory → App registrations
  2. Click New registration
  3. Name: m365-unified-skill (or your choice)
  4. Supported account types: Single tenant
  5. Redirect URI: Leave empty (not needed for app-only auth)
  6. Click Register

Step 2: Create Client Secret

  1. In your app registration → Certificates & secrets
  2. Click New client secret
  3. Description: m365-unified-secret
  4. Expires: Choose 12-24 months
  5. Click Add
  6. ⚠️ IMPORTANT: Copy the secret value immediately (you can't see it again!)

Step 3: Configure API Permissions

  1. In your app registration → API permissions
  2. Click Add a permissionMicrosoft Graph
  3. Select Application permissions (NOT delegated!)
  4. Add the permissions you need:
FeaturePermissions
Email (read)Mail.Read
Email (send)Mail.Send
Email (full)Mail.ReadWrite
SharePointSites.ReadWrite.All
OneDriveFiles.ReadWrite.All
PlannerTasks.ReadWrite, Group.Read.All
WebhooksUser.Read (minimum for validation)
  1. Click Grant admin consent for [Your Tenant] (admin action required)

Step 4: Copy IDs

From the app registration Overview page, copy:

  • Application (client) IDM365_CLIENT_ID
  • Directory (tenant) IDM365_TENANT_ID

4. Configure Environment

Copy the template and fill in your values:

cp config/template.env .env

Edit .env:

# Required - Authentication
M365_TENANT_ID="<your-tenant-id>"
M365_CLIENT_ID="<your-client-id>"
M365_CLIENT_SECRET="<your-client-secret>"

# Optional - Feature Toggles
M365_ENABLE_EMAIL=true
M365_ENABLE_SHAREPOINT=false
M365_ENABLE_ONEDRIVE=false
M365_ENABLE_PLANNER=false
M365_ENABLE_WEBHOOKS=false

# Optional - Module Config
M365_MAILBOX="user@domain.com"
M365_SHARED_MAILBOXES="team1@domain.com,team2@domain.com"
M365_SHAREPOINT_SITE_ID="<tenant>.sharepoint.com,<site-guid>,<web-guid>"
M365_PLANNER_GROUP_ID="<m365-group-id>"
M365_WEBHOOK_URL="https://your-domain.com/webhook/m365"
M365_WEBHOOK_SECRET="<generate-random-secret>"

5. Test Connection

npm test
# or
node scripts/test-connection.js

Usage in OpenClaw

Import and Initialize

import { createM365Client } from './skills/m365-unified/src/index.js';

const m365 = await createM365Client({
  tenantId: process.env.M365_TENANT_ID,
  clientId: process.env.M365_CLIENT_ID,
  clientSecret: process.env.M365_CLIENT_SECRET,
  mailbox: process.env.M365_MAILBOX,
  sharepointSiteId: process.env.M365_SHAREPOINT_SITE_ID,
  plannerGroupId: process.env.M365_PLANNER_GROUP_ID,
  enableEmail: true,
  enableSharepoint: true,
  enablePlanner: true,
  enableWebhooks: false,
});

Email Examples

// Send email
await m365.email.send({
  to: ['recipient@domain.com'],
  subject: 'Hello',
  body: '<p>Message</p>',
  attachments: [{ name: 'file.pdf', contentBytes: 'base64...' }]
});

// List recent emails
const messages = await m365.email.list({ top: 10, folder: 'inbox' });

// Search emails
const results = await m365.email.search('from:client', { top: 20 });

// Move email to folder
await m365.email.move(messageId, folderId);

// Mark as read
await m365.email.markAsRead(messageId);

// Save attachment to SharePoint
await m365.email.saveAttachmentToSharePoint(
  messageId,
  attachmentId,
  '/Documents/Invoices'
);

SharePoint Examples

// Upload file
const file = await m365.sharepoint.upload('/Documents/file.pdf', content, {
  contentType: 'application/pdf',
});

// Download file
const content = await m365.sharepoint.download('/Documents/file.pdf');

// List folder contents
const files = await m365.sharepoint.listFiles('/Documents');

// Delete file
await m365.sharepoint.delete('/Documents/old-file.pdf');

OneDrive Examples

// Upload to OneDrive
const file = await m365.onedrive.upload('/Attachments/invoice.pdf', content);

// Download from OneDrive
const content = await m365.onedrive.download('/Attachments/invoice.pdf');

// List OneDrive root
const files = await m365.onedrive.listFiles();

Planner Examples

// List all plans
const plans = await m365.planner.listPlans();

// List tasks in a plan
const tasks = await m365.planner.listTasks(planId);

// Create task
await m365.planner.createTask(planId, 'Task Title', {
  priority: 3, // 1=urgent, 3=normal, 5=low
  dueDateTime: '2026-04-25T00:00:00Z',
  description: 'Task description',
  bucketId: 'bucket-id', // optional
});

// Create task from email (automation)
await m365.planner.createTaskFromEmail(messageId, planId, {
  bucketId: 'bucket-id', // optional
  priority: 3,
});

// Update task
await m365.planner.updateTask(taskId, {
  percentComplete: 50,
  priority: 1,
});

// Delete task
await m365.planner.deleteTask(taskId);

Webhook Examples

// Create webhook subscription
const subscription = await m365.webhooks.create({
  resource: `users/${mailbox}/messages`,
  changeType: 'created',
  notificationUrl: 'https://your-domain.com/webhook/m365',
  expirationDateTime: '2026-04-22T00:00:00Z',
  clientState: 'your-secret-token',
});

// List active subscriptions
const subscriptions = await m365.webhooks.list();

// Renew subscription (before expiration)
await m365.webhooks.renew(subscriptionId, '2026-04-25T00:00:00Z');

// Delete subscription
await m365.webhooks.delete(subscriptionId);

Webhook Integration

How Webhooks Work

Instead of polling with cron jobs, Microsoft Graph sends HTTP POST requests to your webhook URL when:

  • New email arrives (created)
  • Email is moved/deleted (updated, deleted)
  • File is created/modified (SharePoint/OneDrive)
  • Task is created/updated (Planner)

Webhook Lifecycle

  1. Create Subscription - Tell Graph where to send notifications
  2. Validation - Graph sends validation challenge, your endpoint must respond
  3. Notifications - Graph sends POST requests on resource changes
  4. Renewal - Subscriptions expire after 3 days max, must be renewed
  5. Cleanup - Delete subscriptions when no longer needed

Setup Webhook Handler

# Start local webhook handler
node scripts/webhook-handler.js

# Or use the shell script
./scripts/start-webhook.sh

Create Webhook Subscription

# New emails in inbox
node scripts/manage-webhooks.js create --resource=mail_inbox --type=created

# All mailbox changes
node scripts/manage-webhooks.js create --resource=mail --type=created,updated,deleted

# SharePoint file changes
node scripts/manage-webhooks.js create --resource=sharepoint --type=created,updated

# Planner task changes
node scripts/manage-webhooks.js create --resource=planner --planId=<plan-id> --type=created,updated

Webhook Payload Example

{
  "value": [
    {
      "subscriptionId": "subscription-id-guid",
      "clientState": "your-secret-token",
      "changeType": "created",
      "resource": "users/user@domain.com/messages",
      "resourceData": {
        "@odata.type": "#microsoft.graph.message",
        "id": "message-id"
      },
      "subscriptionExpirationDateTime": "2026-04-22T13:52:00Z"
    }
  ]
}

Webhook Validation Challenge

When you create a subscription, Graph sends a validation request:

POST /webhook/m365
Content-Type: text/plain

Validation-Token: <random-token>

Your endpoint must:

  1. Detect the Validation-Token header
  2. Respond with status 200 OK and the token value as plain text
  3. Complete within 120 seconds

See scripts/webhook-handler.js for a reference implementation.

Auto-Renewal

Webhooks expire after 3 days maximum. Set up auto-renewal:

# Cron job example (runs every 6 hours)
0 */6 * * * cd /path/to/m365-unified && node scripts/auto-renew-webhooks.js

Configuration Reference

Environment Variables

VariableRequiredDescription
M365_TENANT_IDAzure AD tenant ID
M365_CLIENT_IDApp registration client ID
M365_CLIENT_SECRETApp registration client secret
M365_ENABLE_EMAILEnable email module (default: false)
M365_ENABLE_SHAREPOINTEnable SharePoint module (default: false)
M365_ENABLE_ONEDRIVEEnable OneDrive module (default: false)
M365_ENABLE_PLANNEREnable Planner module (default: false)
M365_ENABLE_WEBHOOKSEnable webhook features (default: false)
M365_MAILBOX⚠️Primary mailbox (required for email features)
M365_SHARED_MAILBOXESComma-separated list of shared mailboxes
M365_SHAREPOINT_SITE_ID⚠️SharePoint site ID (required for SharePoint)
M365_ONEDRIVE_USER⚠️OneDrive user (default: same as M365_MAILBOX)
M365_PLANNER_GROUP_ID⚠️M365 Group ID containing Planner plans
M365_WEBHOOK_URL⚠️Public webhook endpoint URL (HTTPS required)
M365_WEBHOOK_SECRET⚠️Secret for webhook validation
M365_WEBHOOK_PORTLocal webhook handler port (default: 3000)

Getting SharePoint Site ID

# Use Graph Explorer or run:
curl -H "Authorization: Bearer <token>" \
  "https://graph.microsoft.com/v1.0/sites"

Response format:

{
  "value": [
    {
      "id": "tenant.sharepoint.com,site-guid,web-guid",
      "displayName": "My Site"
    }
  ]
}

Use the full id value for M365_SHAREPOINT_SITE_ID.

Getting Planner Group ID

# List groups with Planner plans
node scripts/test-planner.js

Or use Graph Explorer:

GET https://graph.microsoft.com/v1.0/groups?$filter=resourceProvisioningOptions/Any(x:x eq 'Team')

Testing

# Test connection & authentication
npm test

# Test individual features
npm run test:email
npm run test:sharepoint
npm run test:onedrive
npm run test:planner

# Manage webhooks
npm run webhooks:create -- --resource=mail --type=created
npm run webhooks:list
npm run webhooks:renew -- --id=<subscription-id>
npm run webhooks:delete -- --id=<subscription-id>

Security

Best Practices

  1. Never commit .env - Already in .gitignore
  2. Use app-only permissions (not delegated) for automated tasks
  3. Restrict mailbox access via Azure AD app assignment
  4. Rotate secrets every 12-18 months
  5. Monitor sign-in logs in Azure AD regularly
  6. Use HTTPS for webhook endpoints
  7. Validate webhook signatures with client state secret

Mailbox Access Restrictions

By default, Mail.ReadWrite grants access to ALL mailboxes in the tenant. To restrict:

Option 1: Azure AD App Assignment (Recommended)

  1. Azure AD → Enterprise Apps → Your App → Users and groups
  2. Add ONLY the users/mailboxes that should have access
  3. Remove "All users" if present

Option 2: Application Access Policies (Exchange PowerShell)

# Create security group with specific mailboxes
New-DistributionGroup -Name "M365AppAccess" -Type Security

# Add mailboxes to group
Add-DistributionGroupMember -Identity "M365AppAccess" -Member "user@domain.com"

# Create access policy
New-ApplicationAccessPolicy -AppId "CLIENT-ID" -PolicyScopeGroupId "M365AppAccess" -AccessRight RestrictAccess

Permission Scopes Reference

FeatureMinimum PermissionsRecommended
Email (read)Mail.ReadMail.Read
Email (send)Mail.SendMail.Send
Email (full)Mail.ReadWriteMail.ReadWrite
SharePointSites.Read.AllSites.ReadWrite.All
OneDriveFiles.Read.AllFiles.ReadWrite.All
PlannerTasks.Read, Group.ReadTasks.ReadWrite, Group.Read.All
WebhooksUser.ReadUser.Read

Troubleshooting

401 Unauthorized

Causes:

  • Invalid Tenant ID, Client ID, or Client Secret
  • Client secret has expired
  • App registration is in wrong tenant

Solutions:

  1. Verify all three values in .env
  2. Create new client secret in Azure AD
  3. Check tenant ID matches your Azure AD

403 Forbidden

Causes:

  • API permissions not granted
  • Admin consent not given
  • Using delegated instead of application permissions

Solutions:

  1. Go to Azure AD → App registrations → Your app → API permissions
  2. Ensure permissions are Application type (not Delegated)
  3. Click "Grant admin consent for [Tenant]"
  4. Wait 5-10 minutes for propagation

404 Not Found

Causes:

  • Resource (mailbox/site/group) doesn't exist
  • ID is incorrect or malformed
  • Wrong format for SharePoint Site ID

Solutions:

  1. Verify the resource exists in Microsoft 365 admin center
  2. Check ID format (especially SharePoint: tenant.sharepoint.com,site-guid,web-guid)
  3. Use Graph Explorer to test the same query

Webhooks Not Working

Common Issues:

  1. Webhook URL not publicly accessible

- Must be HTTPS (not HTTP) - Must be reachable from the internet (not localhost) - Use ngrok or similar for local development

  1. Validation challenge fails

- Endpoint must respond within 120 seconds - Response must be status 200 with token as plain text - Check clientState matches your secret

  1. Subscription expires quickly

- Maximum lifetime is 3 days - Set up auto-renewal cron job - Monitor expiration dates

  1. No notifications received

- Check resource path is correct - Verify change types match your needs - Check Azure AD app has User.Read permission minimum

Rate Limiting

Microsoft Graph uses throttling. If you hit limits:

HTTP 429 Too Many Requests
Retry-After: <seconds>

Solutions:

  • Implement exponential backoff
  • Batch requests when possible
  • Avoid tight loops with many requests
  • Respect Retry-After header

Migration from m365-planner

The authentication module is compatible with existing m365-planner configurations. You can:

  1. Keep both skills - Use m365-planner for tasks, m365-unified for email
  2. Migrate gradually - Start with email, add Planner later
  3. Merge completely - Deprecate m365-planner, use unified skill only

Same credentials work for both skills - no need to create new app registrations.

Dependencies

  • @microsoft/microsoft-graph-client ^3.0.7
  • axios ^1.6.0
  • dotenv ^16.3.1
  • express ^4.18.0 (for webhook handler)

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Test thoroughly
  5. Submit a pull request

License

MIT License - See LICENSE file for details.

Support

  • Documentation: See docs/ folder for detailed guides
  • Issues: Report bugs on GitHub
  • Questions: Check FAQ in FAQ-DEPENDENCIES.md

Built with ❤️ by the OpenClaw Community

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

75.32%
按下载量换算1,198

安全审计

VirusTotal

可疑

ClawScan

可疑

Static analysis

可疑

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills