{"id":"42d3012d-f337-4cfe-9800-1672e8dd1488","entityType":"agent","slug":"clawhub-tradmangh-m365-calendar","name":"M365 Calendar (Graph)","canonicalUrl":"https://www.xpersona.co/agent/clawhub-tradmangh-m365-calendar","canonicalPath":"/agent/clawhub-tradmangh-m365-calendar","generatedAt":"2026-10-12T21:14:37.226Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T21:14:05.681Z","emptyReason":null},"description":"Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing... Skill: M365 Calendar (Graph) Owner: tradmangh Summary: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing... Tags: latest:0.1.9 Version history: v0.1.9 | 2026-02-18T13:31:25.467Z | user Security scan coherence: document Node.js + npm install requirements; package.json already included. v0.1.8 | 2026-02-18T13:06:","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 992 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17aaegq3rafytyraeyc72bkjx83twpg:m365-calendar","sourceUrl":"https://clawhub.ai/tradmangh/m365-calendar","homepage":"https://clawhub.ai/tradmangh/skills/m365-calendar","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/tradmangh/m365-calendar","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/tradmangh/skills/m365-calendar","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:14:05.681Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:14:05.681Z","emptyReason":null},"stars":null,"forks":null,"downloads":992,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"0.1.9","tractionLabel":"992 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T21:14:05.611Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T21:14:05.681Z","lastCrawledAt":"2026-10-11T21:14:05.611Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T21:14:05.611Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.9","createdAt":"2026-02-18T13:31:25.467Z","changelog":"Security scan coherence: document Node.js + npm install requirements; package.json already included.","fileCount":13,"zipByteSize":11233},{"version":"0.1.8","createdAt":"2026-02-18T13:06:53.539Z","changelog":"Security scan improvements: add package.json dependency declaration; make offline_access optional (reduce long-lived token risk); docs + process cleanups.","fileCount":13,"zipByteSize":11110},{"version":"0.1.5","createdAt":"2026-02-18T12:42:22.730Z","changelog":"Quickstart now asks business vs consumer first; add trigger keywords (MS365/Microsoft365, hotmail/outlook/live, OneDrive/SharePoint/Exchange Online); clarify business note for users without IT admin rights.","fileCount":12,"zipByteSize":10556},{"version":"0.1.4","createdAt":"2026-02-18T12:36:21.192Z","changelog":"Make setup deppensicher: require clientId; add enterprise locked-down tenant guidance; add raw-token fallback importer and token-cache autodetect.","fileCount":12,"zipByteSize":10333},{"version":"0.1.3","createdAt":"2026-02-18T12:24:09.960Z","changelog":"Fix consumer device-code UX: require --clientId, stable message output; setup script passes clientId.","fileCount":11,"zipByteSize":8806},{"version":"0.1.2","createdAt":"2026-02-18T11:25:21.541Z","changelog":"Improve device-code sign-in instructions; document consumer-account requirement (app must allow personal Microsoft accounts).","fileCount":11,"zipByteSize":8765},{"version":"0.1.1","createdAt":"2026-02-18T11:24:36.769Z","changelog":"Add one-command setup helper; anonymize docs/examples (no personal emails).","fileCount":11,"zipByteSize":8470},{"version":"0.1.0","createdAt":"2026-02-18T11:20:21.003Z","changelog":"Initial release: device-code auth, list/search/get/move events; supports business (organizations) + consumer (consumers).","fileCount":10,"zipByteSize":7834}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17aaegq3rafytyraeyc72bkjx83twpg:m365-calendar","setupComplexity":"low","setupSteps":["Node.js workspace detected. Install dependencies securely: run `npm ci --ignore-scripts` to prevent post-install lifecycle triggers from running arbitrary code, then selectively audit the dependency tree.","Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T21:14:37.225Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-tradmangh-m365-calendar/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T21:14:05.681Z","emptyReason":null},"readme":"Skill: M365 Calendar (Graph)\n\nOwner: tradmangh\n\nSummary: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing...\n\nTags: latest:0.1.9\n\nVersion history:\n\nv0.1.9 | 2026-02-18T13:31:25.467Z | user\n\nSecurity scan coherence: document Node.js + npm install requirements; package.json already included.\n\nv0.1.8 | 2026-02-18T13:06:53.539Z | user\n\nSecurity scan improvements: add package.json dependency declaration; make offline_access optional (reduce long-lived token risk); docs + process cleanups.\n\nv0.1.5 | 2026-02-18T12:42:22.730Z | user\n\nQuickstart now asks business vs consumer first; add trigger keywords (MS365/Microsoft365, hotmail/outlook/live, OneDrive/SharePoint/Exchange Online); clarify business note for users without IT admin rights.\n\nv0.1.4 | 2026-02-18T12:36:21.192Z | user\n\nMake setup deppensicher: require clientId; add enterprise locked-down tenant guidance; add raw-token fallback importer and token-cache autodetect.\n\nv0.1.3 | 2026-02-18T12:24:09.960Z | user\n\nFix consumer device-code UX: require --clientId, stable message output; setup script passes clientId.\n\nv0.1.2 | 2026-02-18T11:25:21.541Z | user\n\nImprove device-code sign-in instructions; document consumer-account requirement (app must allow personal Microsoft accounts).\n\nv0.1.1 | 2026-02-18T11:24:36.769Z | user\n\nAdd one-command setup helper; anonymize docs/examples (no personal emails).\n\nv0.1.0 | 2026-02-18T11:20:21.003Z | user\n\nInitial release: device-code auth, list/search/get/move events; supports business (organizations) + consumer (consumers).\n\nArchive index:\n\nArchive v0.1.9: 13 files, 11233 bytes\n\nFiles: package.json (249b), references/config.md (926b), scripts/_graph.mjs (2417b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2871b), scripts/get-event.mjs (967b), scripts/import-raw-token.mjs (1307b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), scripts/setup.mjs (1388b), SKILL.md (5436b), _meta.json (132b)\n\nFile v0.1.9:SKILL.md\n\n---\nname: m365-calendar\ndescription: MS365 / Microsoft365 calendar automation via Microsoft Graph for Microsoft 365 (M365) Business (work/school, Exchange Online) and M365 Home/Consumer (hotmail.com, outlook.com, live.com). Use when listing upcoming events, searching calendar entries (e.g. “Lunch”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Related keywords: OneDrive, SharePoint, Exchange Online (calendar). Privacy note: no third-party API key is required; authentication is via your own Microsoft login (device code) and tokens are stored locally per profile. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Installation / runtime requirements\n\n- Requires **Node.js** (the scripts are Node ESM).\n- This skill declares its npm dependency in `package.json`.\n- After installing/updating the skill, install deps in the skill folder:\n\n```bash\ncd skills/m365-calendar\nnpm install\n```\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start\n\n### 0) First question: do you want to connect **M365 Business** or **M365 Home/Consumer**?\n\n- **M365 Home/Consumer** = `hotmail.com`, `outlook.com`, `live.com`\n- **M365 Business** = Work/School account (Exchange Online)\n\n### 1) Privacy / keys (important)\n- **No third-party API key required.**\n- Auth is done via **your own Microsoft login** (device code flow).\n- Tokens are stored **locally per profile** on the machine running OpenClaw.\n- By default, the setup flow does **NOT** request `offline_access` (to avoid long-lived refresh tokens on disk). Use `--offline` only if you explicitly want background refresh.\n\n### 2) You need an **App (client) ID**\nYou must pass `--clientId`.\n\n- **Home/Consumer:** create an app registration that allows **Personal Microsoft accounts**, and enable **public client flows**.\n- **Business (users without IT admin rights):** ask IT for a `clientId` + consent (see “Business note” below).\n\n### 3) One-command setup (recommended)\n\n```bash\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile home \\\n  --tenant consumers \\\n  --email you@outlook.com \\\n  --clientId <YOUR_APP_CLIENT_ID> \\\n  --tz Europe/Vienna\n\n# Business / work accounts\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile business \\\n  --tenant organizations \\\n  --email you@company.com \\\n  --clientId <IT_PROVIDED_CLIENT_ID> \\\n  --tz Europe/Vienna\n```\n\n### 2) Use\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile home --when today --tz Europe/Vienna\nnode skills/m365-calendar/scripts/list.mjs --profile home --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/search.mjs --profile home --when tomorrow --tz Europe/Vienna --query \"Mittagessen\"\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` only if you explicitly want one profile that can log into either type.\n\n### Consumer (hotmail/outlook.com) requirements\nYour app registration must:\n- Allow **personal Microsoft accounts**\n- Enable **public client flows** (otherwise device-code can fail with errors like AADSTS70002)\n\n### Business note (users without IT admin rights)\nMany tenants block:\n- creating app registrations as a normal user\n- user consent to new apps\n\nIn that case the skill can still work for Business accounts, but only if your **IT/SysAdmin** provides a `clientId` for an app registration configured with:\n- Account type: organizational accounts (or org+personal)\n- Delegated Microsoft Graph permissions: `Calendars.Read`, `Calendars.ReadWrite`, `offline_access`\n- **Public client flows enabled** (Device Code)\n- (Often required) **Admin consent granted** for the above permissions\n\nIf you don’t get such a `clientId`/consent from IT, you can still use the skill with a **Consumer** account (hotmail/outlook.com), but your Business calendar will remain blocked.\n\nIf silent token acquisition fails, re-run `setup.mjs` for that profile.\n\nFile v0.1.9:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.9\",\n  \"publishedAt\": 1771421485467\n}\n\nFile v0.1.9:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.\n\nFile v0.1.9:package.json\n\n{\n  \"name\": \"m365-calendar\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"description\": \"OpenClaw skill: Microsoft Graph calendar automation (M365 business + consumer).\",\n  \"dependencies\": {\n    \"@azure/msal-node\": \"^5.0.4\"\n  }\n}\n\nArchive v0.1.8: 13 files, 11110 bytes\n\nFiles: package.json (249b), references/config.md (926b), scripts/_graph.mjs (2417b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2871b), scripts/get-event.mjs (967b), scripts/import-raw-token.mjs (1307b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), scripts/setup.mjs (1388b), SKILL.md (5162b), _meta.json (132b)\n\nFile v0.1.8:SKILL.md\n\n---\nname: m365-calendar\ndescription: MS365 / Microsoft365 calendar automation via Microsoft Graph for Microsoft 365 (M365) Business (work/school, Exchange Online) and M365 Home/Consumer (hotmail.com, outlook.com, live.com). Use when listing upcoming events, searching calendar entries (e.g. “Lunch”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Related keywords: OneDrive, SharePoint, Exchange Online (calendar). Privacy note: no third-party API key is required; authentication is via your own Microsoft login (device code) and tokens are stored locally per profile. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start\n\n### 0) First question: do you want to connect **M365 Business** or **M365 Home/Consumer**?\n\n- **M365 Home/Consumer** = `hotmail.com`, `outlook.com`, `live.com`\n- **M365 Business** = Work/School account (Exchange Online)\n\n### 1) Privacy / keys (important)\n- **No third-party API key required.**\n- Auth is done via **your own Microsoft login** (device code flow).\n- Tokens are stored **locally per profile** on the machine running OpenClaw.\n- By default, the setup flow does **NOT** request `offline_access` (to avoid long-lived refresh tokens on disk). Use `--offline` only if you explicitly want background refresh.\n\n### 2) You need an **App (client) ID**\nYou must pass `--clientId`.\n\n- **Home/Consumer:** create an app registration that allows **Personal Microsoft accounts**, and enable **public client flows**.\n- **Business (users without IT admin rights):** ask IT for a `clientId` + consent (see “Business note” below).\n\n### 3) One-command setup (recommended)\n\n```bash\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile home \\\n  --tenant consumers \\\n  --email you@outlook.com \\\n  --clientId <YOUR_APP_CLIENT_ID> \\\n  --tz Europe/Vienna\n\n# Business / work accounts\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile business \\\n  --tenant organizations \\\n  --email you@company.com \\\n  --clientId <IT_PROVIDED_CLIENT_ID> \\\n  --tz Europe/Vienna\n```\n\n### 2) Use\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile home --when today --tz Europe/Vienna\nnode skills/m365-calendar/scripts/list.mjs --profile home --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/search.mjs --profile home --when tomorrow --tz Europe/Vienna --query \"Mittagessen\"\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` only if you explicitly want one profile that can log into either type.\n\n### Consumer (hotmail/outlook.com) requirements\nYour app registration must:\n- Allow **personal Microsoft accounts**\n- Enable **public client flows** (otherwise device-code can fail with errors like AADSTS70002)\n\n### Business note (users without IT admin rights)\nMany tenants block:\n- creating app registrations as a normal user\n- user consent to new apps\n\nIn that case the skill can still work for Business accounts, but only if your **IT/SysAdmin** provides a `clientId` for an app registration configured with:\n- Account type: organizational accounts (or org+personal)\n- Delegated Microsoft Graph permissions: `Calendars.Read`, `Calendars.ReadWrite`, `offline_access`\n- **Public client flows enabled** (Device Code)\n- (Often required) **Admin consent granted** for the above permissions\n\nIf you don’t get such a `clientId`/consent from IT, you can still use the skill with a **Consumer** account (hotmail/outlook.com), but your Business calendar will remain blocked.\n\nIf silent token acquisition fails, re-run `setup.mjs` for that profile.\n\nFile v0.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.8\",\n  \"publishedAt\": 1771420013539\n}\n\nFile v0.1.8:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.\n\nFile v0.1.8:package.json\n\n{\n  \"name\": \"m365-calendar\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"description\": \"OpenClaw skill: Microsoft Graph calendar automation (M365 business + consumer).\",\n  \"dependencies\": {\n    \"@azure/msal-node\": \"^5.0.4\"\n  }\n}\n\nArchive v0.1.5: 12 files, 10556 bytes\n\nFiles: references/config.md (926b), scripts/_graph.mjs (2417b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2439b), scripts/get-event.mjs (967b), scripts/import-raw-token.mjs (1307b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), scripts/setup.mjs (1388b), SKILL.md (4803b), _meta.json (132b)\n\nFile v0.1.5:SKILL.md\n\n---\nname: m365-calendar\ndescription: MS365 / Microsoft365 calendar automation via Microsoft Graph for Microsoft 365 (M365) Business (work/school, Exchange Online) and M365 Home/Consumer (hotmail.com, outlook.com, live.com). Use when listing upcoming events, searching calendar entries (e.g. “Mittagessen”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Related keywords: OneDrive, SharePoint, Exchange Online (calendar). Supports delegated auth via device code flow and stores per-profile token cache locally. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start (deppensicher)\n\n### 0) Erste Frage: willst du **M365 Business** oder **M365 Home/Consumer** verbinden?\n\n- **M365 Home/Consumer** = `hotmail.com`, `outlook.com`, `live.com`\n- **M365 Business** = Work/School Account (Exchange Online)\n\n### 1) Du brauchst eine **App (client) ID**\nDu musst `--clientId` angeben.\n\n- **Home/Consumer:** erstelle eine App-Registrierung, die **Personal Microsoft accounts** erlaubt, und aktiviere **public client flows**.\n- **Business (Benutzer ohne IT-Administrationsrechte):** frag IT nach einer passenden `clientId` + Consent (siehe „Business note“ unten).\n\n### 2) One-command setup (recommended)\n\n```bash\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile home \\\n  --tenant consumers \\\n  --email you@outlook.com \\\n  --clientId <YOUR_APP_CLIENT_ID> \\\n  --tz Europe/Vienna\n\n# Business / work accounts\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile business \\\n  --tenant organizations \\\n  --email you@company.com \\\n  --clientId <IT_PROVIDED_CLIENT_ID> \\\n  --tz Europe/Vienna\n```\n\n### 2) Use\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile home --when today --tz Europe/Vienna\nnode skills/m365-calendar/scripts/list.mjs --profile home --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/search.mjs --profile home --when tomorrow --tz Europe/Vienna --query \"Mittagessen\"\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` only if you explicitly want one profile that can log into either type.\n\n### Consumer (hotmail/outlook.com) requirements\nYour app registration must:\n- Allow **personal Microsoft accounts**\n- Enable **public client flows** (otherwise device-code can fail with errors like AADSTS70002)\n\n### Business note (Benutzer ohne IT-Administrationsrechte)\nViele Tenants blockieren:\n- App-Registrierungen durch normale Benutzer\n- User-Consent für neue Apps\n\nDann funktioniert das Skill für Business-Accounts nur, wenn deine **IT** dir eine `clientId` für eine App-Registrierung bereitstellt, die so konfiguriert ist:\n- Account type: organizational accounts (or org+personal)\n- Delegated Microsoft Graph permissions: `Calendars.Read`, `Calendars.ReadWrite`, `offline_access`\n- **Public client flows enabled** (Device Code)\n- (Often required) **Admin consent granted** for the above permissions\n\nWenn du von der IT keine `clientId`/Consent bekommst, kannst du das Skill meist trotzdem mit einem **Consumer**-Account nutzen (hotmail/outlook.com), aber dein Business-Kalender bleibt dann blockiert.\n\nIf silent token acquisition fails, re-run `setup.mjs` for that profile.\n\nFile v0.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.5\",\n  \"publishedAt\": 1771418542730\n}\n\nFile v0.1.5:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.\n\nArchive v0.1.4: 12 files, 10333 bytes\n\nFiles: references/config.md (926b), scripts/_graph.mjs (2417b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2439b), scripts/get-event.mjs (967b), scripts/import-raw-token.mjs (1307b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), scripts/setup.mjs (1388b), SKILL.md (4368b), _meta.json (132b)\n\nFile v0.1.4:SKILL.md\n\n---\nname: m365-calendar\ndescription: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing upcoming events, searching calendar entries (e.g. “Mittagessen”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Supports delegated auth via device code flow and stores per-profile token cache locally. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start (deppensicher)\n\n### 0) You need an **App (client) ID**\nYou must pass `--clientId`.\n\n- **Consumer (hotmail/outlook.com):** create your own app registration that allows personal Microsoft accounts, and enable public client flows.\n- **Business (big company, no Entra access):** ask IT for a clientId (see “Enterprise note” below).\n\n### 1) One-command setup (recommended)\n\n```bash\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile home \\\n  --tenant consumers \\\n  --email you@outlook.com \\\n  --clientId <YOUR_APP_CLIENT_ID> \\\n  --tz Europe/Vienna\n\n# Business / work accounts\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile business \\\n  --tenant organizations \\\n  --email you@company.com \\\n  --clientId <IT_PROVIDED_CLIENT_ID> \\\n  --tz Europe/Vienna\n```\n\n### 2) Use\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile home --when today --tz Europe/Vienna\nnode skills/m365-calendar/scripts/list.mjs --profile home --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/search.mjs --profile home --when tomorrow --tz Europe/Vienna --query \"Mittagessen\"\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` only if you explicitly want one profile that can log into either type.\n\n### Consumer (hotmail/outlook.com) requirements\nYour app registration must:\n- Allow **personal Microsoft accounts**\n- Enable **public client flows** (otherwise device-code can fail with errors like AADSTS70002)\n\n### Enterprise / big-company Business note (no Entra access)\nMany enterprises block:\n- creating app registrations\n- user consent to new apps\n\nIn that case the skill can still work for Business accounts, but only if your **IT/SysAdmin** provides a clientId for an app registration configured with:\n- Account type: organizational accounts (or org+personal)\n- Delegated Microsoft Graph permissions: `Calendars.Read`, `Calendars.ReadWrite`, `offline_access`\n- **Public client flows enabled** (Device Code)\n- (Often required) **Admin consent granted** for the above permissions\n\nIf you don’t get such a clientId/consent from IT, you can still use the skill with a **Consumer** account, but Business in locked-down tenants will be blocked.\n\nIf silent token acquisition fails, re-run `setup.mjs` for that profile.\n\nFile v0.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.4\",\n  \"publishedAt\": 1771418181192\n}\n\nFile v0.1.4:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.\n\nArchive v0.1.3: 11 files, 8806 bytes\n\nFiles: references/config.md (926b), scripts/_graph.mjs (1966b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2439b), scripts/get-event.mjs (967b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), scripts/setup.mjs (1388b), SKILL.md (2968b), _meta.json (132b)\n\nFile v0.1.3:SKILL.md\n\n---\nname: m365-calendar\ndescription: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing upcoming events, searching calendar entries (e.g. “Mittagessen”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Supports delegated auth via device code flow and stores per-profile token cache locally. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start\n\n1) Authenticate (choose profile/tenant type):\n\n```bash\n# Business / work accounts\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile business --tenant organizations --email you@company.com\n\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile home --tenant consumers --email you@outlook.com\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` if you explicitly want one profile that can log into either type.\n\n**Important:** Consumer (MSA) login requires an app registration that allows **personal Microsoft accounts**.\nIf you see `invalid_grant` during device-code login on `consumers`, re-run auth with a `--clientId` from an app configured for:\n“Accounts in any organizational directory and personal Microsoft accounts”.\n\nIf silent token acquisition fails, re-run `auth-devicecode.mjs` for that profile.\n\nFile v0.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.3\",\n  \"publishedAt\": 1771417449960\n}\n\nFile v0.1.3:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.\n\nArchive v0.1.2: 11 files, 8765 bytes\n\nFiles: references/config.md (926b), scripts/_graph.mjs (1966b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2595b), scripts/get-event.mjs (967b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), scripts/setup.mjs (1143b), SKILL.md (2968b), _meta.json (132b)\n\nFile v0.1.2:SKILL.md\n\n---\nname: m365-calendar\ndescription: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing upcoming events, searching calendar entries (e.g. “Mittagessen”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Supports delegated auth via device code flow and stores per-profile token cache locally. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start\n\n1) Authenticate (choose profile/tenant type):\n\n```bash\n# Business / work accounts\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile business --tenant organizations --email you@company.com\n\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile home --tenant consumers --email you@outlook.com\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` if you explicitly want one profile that can log into either type.\n\n**Important:** Consumer (MSA) login requires an app registration that allows **personal Microsoft accounts**.\nIf you see `invalid_grant` during device-code login on `consumers`, re-run auth with a `--clientId` from an app configured for:\n“Accounts in any organizational directory and personal Microsoft accounts”.\n\nIf silent token acquisition fails, re-run `auth-devicecode.mjs` for that profile.\n\nFile v0.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.2\",\n  \"publishedAt\": 1771413921541\n}\n\nFile v0.1.2:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.\n\nArchive v0.1.1: 11 files, 8470 bytes\n\nFiles: references/config.md (926b), scripts/_graph.mjs (1966b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2192b), scripts/get-event.mjs (967b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), scripts/setup.mjs (1143b), SKILL.md (2649b), _meta.json (132b)\n\nFile v0.1.1:SKILL.md\n\n---\nname: m365-calendar\ndescription: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing upcoming events, searching calendar entries (e.g. “Mittagessen”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Supports delegated auth via device code flow and stores per-profile token cache locally. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start\n\n1) Authenticate (choose profile/tenant type):\n\n```bash\n# Business / work accounts\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile business --tenant organizations --email you@company.com\n\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile home --tenant consumers --email you@outlook.com\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` if you explicitly want one profile that can log into either type.\n\nIf silent token acquisition fails, re-run `auth-devicecode.mjs` for that profile.\n\nFile v0.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.1\",\n  \"publishedAt\": 1771413876769\n}\n\nFile v0.1.1:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.\n\nArchive v0.1.0: 10 files, 7834 bytes\n\nFiles: references/config.md (926b), scripts/_graph.mjs (1966b), scripts/_lib.mjs (1915b), scripts/auth-devicecode.mjs (2192b), scripts/get-event.mjs (967b), scripts/list.mjs (984b), scripts/move-event.mjs (989b), scripts/search.mjs (1071b), SKILL.md (2613b), _meta.json (132b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: m365-calendar\ndescription: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing upcoming events, searching calendar entries (e.g. “Mittagessen”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Supports delegated auth via device code flow and stores per-profile token cache locally. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start\n\n1) Authenticate (choose profile/tenant type):\n\n```bash\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile tom-business --tenant organizations --email radman@e-ola.com\n# Consumer / home accounts:\nnode skills/m365-calendar/scripts/auth-devicecode.mjs --profile tom-home --tenant consumers --email thomas.radman@hotmail.com\n```\n\n2) List remaining events today (Europe/Vienna):\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna\n```\n\n3) Search and show attendee responses:\n\n```bash\nnode skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna\n```\n\n4) Move an event to a new time:\n\n```bash\nnode skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna\n```\n\n## Operational workflow (recommended)\n\nWhen the user asks to change a meeting:\n\n1) Identify the event deterministically (search by day-range + subject; confirm ID).\n2) Read the event and report attendee response statuses.\n3) Patch start/end.\n4) Re-read the event and confirm the final start/end + any response resets.\n\n## Notes on Business vs Home (Consumer)\n\n- Use `--tenant organizations` for work/school accounts (most “business” tenants).\n- Use `--tenant consumers` for hotmail/outlook.com personal accounts.\n- Use `--tenant common` if you explicitly want one profile that can log into either type.\n\nIf silent token acquisition fails, re-run `auth-devicecode.mjs` for that profile.\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1771413621003\n}\n\nFile v0.1.0:references/config.md\n\n# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations.","readmeExcerpt":"Skill: M365 Calendar (Graph) Owner: tradmangh Summary: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing... Tags: latest:0.1.9 Version history: v0.1.9 | 2026-02-18T13:31:25.467Z | user Security scan coherence: document Node.js + npm install requirements; package.json already included. v0.1.8 | 2026-02-18T13:06:","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"cd skills/m365-calendar\nnpm install"},{"language":"bash","snippet":"# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile home \\\n  --tenant consumers \\\n  --email you@outlook.com \\\n  --clientId <YOUR_APP_CLIENT_ID> \\\n  --tz Europe/Vienna\n\n# Business / work accounts\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile business \\\n  --tenant organizations \\\n  --email you@company.com \\\n  --clientId <IT_PROVIDED_CLIENT_ID> \\\n  --tz Europe/Vienna"},{"language":"bash","snippet":"node skills/m365-calendar/scripts/list.mjs --profile home --when today --tz Europe/Vienna\nnode skills/m365-calendar/scripts/list.mjs --profile home --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/search.mjs --profile home --when tomorrow --tz Europe/Vienna --query \"Mittagessen\""},{"language":"bash","snippet":"node skills/m365-calendar/scripts/list.mjs --profile tom-business --when today --tz Europe/Vienna"},{"language":"bash","snippet":"node skills/m365-calendar/scripts/search.mjs --profile tom-business --query \"Mittagessen\" --when tomorrow --tz Europe/Vienna\nnode skills/m365-calendar/scripts/get-event.mjs --profile tom-business --id <EVENT_ID> --tz Europe/Vienna"},{"language":"bash","snippet":"node skills/m365-calendar/scripts/move-event.mjs --profile tom-business --id <EVENT_ID> \\\n  --start \"2026-02-19T12:30\" --end \"2026-02-19T13:00\" --tz Europe/Vienna"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: m365-calendar\ndescription: MS365 / Microsoft365 calendar automation via Microsoft Graph for Microsoft 365 (M365) Business (work/school, Exchange Online) and M365 Home/Consumer (hotmail.com, outlook.com, live.com). Use when listing upcoming events, searching calendar entries (e.g. “Lunch”), checking attendee response status (accepted/declined/tentative), creating or updating meetings, moving events to a new time, or troubleshooting Graph/MSAL auth/token cache for calendar access. Related keywords: OneDrive, SharePoint, Exchange Online (calendar). Privacy note: no third-party API key is required; authentication is via your own Microsoft login (device code) and tokens are stored locally per profile. **Token cost:** ~600-1.5k tokens per use (skill body ~2-3k tokens, Graph calls + light parsing).\n---\n\n# M365 Calendar (Microsoft Graph)\n\nKeep this skill lean: do the heavy lifting with the bundled scripts.\n\n## Installation / runtime requirements\n\n- Requires **Node.js** (the scripts are Node ESM).\n- This skill declares its npm dependency in `package.json`.\n- After installing/updating the skill, install deps in the skill folder:\n\n```bash\ncd skills/m365-calendar\nnpm install\n```\n\n## Security / boundaries\n\n- Never commit or share token caches or client secrets.\n- Default secret location (per machine): `~/.openclaw/secrets/m365-calendar/`\n\n## Quick start\n\n### 0) First question: do you want to connect **M365 Business** or **M365 Home/Consumer**?\n\n- **M365 Home/Consumer** = `hotmail.com`, `outlook.com`, `live.com`\n- **M365 Business** = Work/School account (Exchange Online)\n\n### 1) Privacy / keys (important)\n- **No third-party API key required.**\n- Auth is done via **your own Microsoft login** (device code flow).\n- Tokens are stored **locally per profile** on the machine running OpenClaw.\n- By default, the setup flow does **NOT** request `offline_access` (to avoid long-lived refresh tokens on disk). Use `--offline` only if you explicitly want background refresh.\n\n### 2) You need an **App (client) ID**\nYou must pass `--clientId`.\n\n- **Home/Consumer:** create an app registration that allows **Personal Microsoft accounts**, and enable **public client flows**.\n- **Business (users without IT admin rights):** ask IT for a `clientId` + consent (see “Business note” below).\n\n### 3) One-command setup (recommended)\n\n```bash\n# Consumer / home accounts (hotmail.com / outlook.com)\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile home \\\n  --tenant consumers \\\n  --email you@outlook.com \\\n  --clientId <YOUR_APP_CLIENT_ID> \\\n  --tz Europe/Vienna\n\n# Business / work accounts\nnode skills/m365-calendar/scripts/setup.mjs \\\n  --profile business \\\n  --tenant organizations \\\n  --email you@company.com \\\n  --clientId <IT_PROVIDED_CLIENT_ID> \\\n  --tz Europe/Vienna\n```\n\n### 2) Use\n\n```bash\nnode skills/m365-calendar/scripts/list.mjs --profile home --when today --tz Europe/Vienna\nnode skills/m365-calendar/scripts/list.mjs --profile home --when tomorrow --tz Europe/Vienna\nnode"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7bazdw4mjc5hdf98zgrvcp2x808pwp\",\n  \"slug\": \"m365-calendar\",\n  \"version\": \"0.1.9\",\n  \"publishedAt\": 1771421485467\n}"},{"path":"references/config.md","content":"# Config + storage\n\nThis skill keeps secrets out of git by default.\n\n## Files\n\nFor each `--profile <name>` it stores:\n\n- `~/.openclaw/secrets/m365-calendar/<profile>.json`\n  - `clientId` (public client)\n  - `tenant` (`organizations|consumers|common` or explicit tenantId)\n  - `email` (optional; informational)\n  - `scopes` (calendar delegated scopes)\n- `~/.openclaw/secrets/m365-calendar/<profile>-token-cache.json`\n  - MSAL token cache (refresh token, access token, etc.)\n\n## Why not workspace/secrets?\n\n- Skills should be shareable (e.g. Stefan) without sharing Tom’s tokens.\n- Storing under `~/.openclaw/secrets/` makes it per-machine.\n\n## Tenant values\n\n- `organizations` → work/school tenants\n- `consumers` → personal Microsoft accounts (hotmail.com, outlook.com)\n- `common` → both (interactive login decides)\n\nGraph supports `Prefer: outlook.timezone=\"Europe/Vienna\"` so returned times match local expectations."},{"path":"package.json","content":"{\n  \"name\": \"m365-calendar\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"description\": \"OpenClaw skill: Microsoft Graph calendar automation (M365 business + consumer).\",\n  \"dependencies\": {\n    \"@azure/msal-node\": \"^5.0.4\"\n  }\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing... Skill: M365 Calendar (Graph) Owner: tradmangh Summary: Microsoft 365 calendar automation via Microsoft Graph for both M365 Business (work/school) and M365 Home/Consumer (hotmail.com/outlook.com). Use when listing... Tags: latest:0.1.9 Version history: v0.1.9 | 2026-02-18T13:31:25.467Z | user Security scan coherence: document Node.js + npm install requirements; package.json already included. v0.1.8 | 2026-02-18T13:06:","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1057,"uniquenessScore":53,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:14:05.681Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T21:14:05.681Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T21:14:37.226Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}