{
  "schemaVersion": "1.0",
  "item": {
    "slug": "outlook-skill-clawhub",
    "name": "Outlook Delegate",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/87Marc/outlook-skill-clawhub",
    "canonicalUrl": "https://clawhub.ai/87Marc/outlook-skill-clawhub",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/outlook-skill-clawhub",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=outlook-skill-clawhub",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/outlook-skill-clawhub"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/outlook-skill-clawhub",
    "agentPageUrl": "https://openagent3.xyz/skills/outlook-skill-clawhub/agent",
    "manifestUrl": "https://openagent3.xyz/skills/outlook-skill-clawhub/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/outlook-skill-clawhub/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Outlook Delegate Skill",
        "body": "Access another user's Outlook/Microsoft 365 email and calendar as a delegate via Microsoft Graph API."
      },
      {
        "title": "Delegate Architecture",
        "body": "This skill is designed for scenarios where:\n\nYour AI assistant has its own Microsoft 365 account (e.g., assistant@domain.com)\nThe owner has granted the assistant delegate access to their mailbox/calendar\nThe assistant authenticates as itself but accesses the owner's resources"
      },
      {
        "title": "What Changed from Direct Access",
        "body": "FeatureDirect Access (/me)Delegate Access (/users/{id})API Base/me/messages/users/{owner}/messagesSend EmailAppears \"From: Owner\"Appears \"From: Assistant on behalf of Owner\"CalendarFull controlBased on permission level grantedPermissionsMail.ReadWrite, Mail.SendMail.ReadWrite.Shared, Mail.Send.Shared, Calendars.ReadWrite.Shared"
      },
      {
        "title": "Config File: ~/.outlook-mcp/config.json",
        "body": "{\n  \"client_id\": \"your-app-client-id\",\n  \"client_secret\": \"your-app-client-secret\",\n  \"owner_email\": \"owner@domain.com\",\n  \"delegate_email\": \"assistant@domain.com\"\n}\n\nThe owner_email is the mailbox the assistant will access as a delegate."
      },
      {
        "title": "1. Azure AD App Registration",
        "body": "The app registration needs delegated permissions (not application permissions):\n\nMail.ReadWrite.Shared - Read/write access to shared mailboxes\nMail.Send.Shared - Send mail on behalf of others\nCalendars.ReadWrite.Shared - Read/write shared calendars\nUser.Read - Read assistant's own profile\noffline_access - Refresh tokens"
      },
      {
        "title": "2. Exchange Delegate Permissions (Admin or Owner)",
        "body": "The owner must grant the assistant delegate access via Exchange/Outlook:\n\nPowerShell (Admin):\n\n# Grant mailbox access\nAdd-MailboxPermission -Identity \"owner@domain.com\" -User \"assistant@domain.com\" -AccessRights FullAccess\n\n# Grant Send-on-Behalf\nSet-Mailbox -Identity \"owner@domain.com\" -GrantSendOnBehalfTo \"assistant@domain.com\"\n\n# Grant calendar access (Editor = can create/modify events)\nAdd-MailboxFolderPermission -Identity \"owner@domain.com:\\Calendar\" -User \"assistant@domain.com\" -AccessRights Editor -SharingPermissionFlags Delegate\n\nOr via Outlook Settings:\nThe owner can add the assistant as a delegate in Outlook → File → Account Settings → Delegate Access."
      },
      {
        "title": "3. Token Flow",
        "body": "The assistant authenticates as itself via OAuth2, then accesses the owner's resources using the /users/{owner@domain.com}/ endpoint."
      },
      {
        "title": "Token Management",
        "body": "./scripts/outlook-token.sh refresh   # Refresh expired token\n./scripts/outlook-token.sh test      # Test connection to BOTH accounts\n./scripts/outlook-token.sh get       # Print access token"
      },
      {
        "title": "Reading Owner's Emails",
        "body": "./scripts/outlook-mail.sh inbox [count]           # Owner's inbox\n./scripts/outlook-mail.sh unread [count]          # Owner's unread\n./scripts/outlook-mail.sh search \"query\" [count]  # Search owner's mail\n./scripts/outlook-mail.sh from <email> [count]    # Owner's mail from sender\n./scripts/outlook-mail.sh read <id>               # Read email content"
      },
      {
        "title": "Managing Owner's Emails",
        "body": "./scripts/outlook-mail.sh mark-read <id>          # Mark as read\n./scripts/outlook-mail.sh mark-unread <id>        # Mark as unread\n./scripts/outlook-mail.sh flag <id>               # Flag as important\n./scripts/outlook-mail.sh delete <id>             # Move to trash\n./scripts/outlook-mail.sh archive <id>            # Move to archive\n./scripts/outlook-mail.sh move <id> <folder>      # Move to folder"
      },
      {
        "title": "Sending Emails (On Behalf Of Owner)",
        "body": "./scripts/outlook-mail.sh send <to> <subj> <body>  # Send on behalf of owner\n./scripts/outlook-mail.sh reply <id> \"body\"        # Reply on behalf of owner\n\nNote: Emails will show \"Assistant on behalf of Owner\" in the From field."
      },
      {
        "title": "Owner's Calendar",
        "body": "./scripts/outlook-calendar.sh events [count]      # Owner's upcoming events\n./scripts/outlook-calendar.sh today               # Owner's today\n./scripts/outlook-calendar.sh week                # Owner's week\n./scripts/outlook-calendar.sh read <id>           # Event details\n./scripts/outlook-calendar.sh free <start> <end>  # Owner's availability"
      },
      {
        "title": "Creating Events on Owner's Calendar",
        "body": "./scripts/outlook-calendar.sh create <subj> <start> <end> [location]\n./scripts/outlook-calendar.sh quick <subject> [time]"
      },
      {
        "title": "API Endpoint Changes",
        "body": "The key change is replacing /me with /users/{owner_email}:\n\n# Direct access (old)\nAPI=\"https://graph.microsoft.com/v1.0/me\"\n\n# Delegate access (new)\nOWNER=$(jq -r '.owner_email' \"$CONFIG_FILE\")\nAPI=\"https://graph.microsoft.com/v1.0/users/$OWNER\""
      },
      {
        "title": "Send-on-Behalf Implementation",
        "body": "When sending mail as a delegate, you must specify the from address:\n\n{\n  \"message\": {\n    \"subject\": \"Meeting follow-up\",\n    \"from\": {\n      \"emailAddress\": {\n        \"address\": \"owner@domain.com\"\n      }\n    },\n    \"toRecipients\": [{\"emailAddress\": {\"address\": \"recipient@example.com\"}}],\n    \"body\": {\"contentType\": \"Text\", \"content\": \"...\"}\n  }\n}\n\nThe recipient sees: \"Assistant on behalf of Owner owner@domain.com\""
      },
      {
        "title": "Permissions Summary",
        "body": "ActionRequired PermissionExchange SettingRead owner's mailMail.ReadWrite.SharedFullAccess or ReviewerModify owner's mailMail.ReadWrite.SharedFullAccess or EditorSend as ownerMail.Send.SharedSendOnBehalfRead owner's calendarCalendars.ReadWrite.SharedReviewer+Create events on owner's calendarCalendars.ReadWrite.SharedEditor"
      },
      {
        "title": "Troubleshooting",
        "body": "\"Access denied\" or \"403 Forbidden\"\n→ Check that the assistant has MailboxPermission on the owner's mailbox\n\n\"The mailbox is not found\"\n→ Verify owner_email in config.json is correct\n\n\"Insufficient privileges\"\n→ App registration missing .Shared permissions (check Azure AD)\n\nEmails send but don't show \"on behalf of\"\n→ Missing SendOnBehalf permission. Run:\n\nSet-Mailbox -Identity \"owner@domain.com\" -GrantSendOnBehalfTo \"assistant@domain.com\"\n\n\"Token expired\"\n→ Run outlook-token.sh refresh"
      },
      {
        "title": "Security Considerations",
        "body": "Audit Trail: All actions by the assistant are logged in the owner's mailbox audit log\nToken Storage: Credentials stored in ~/.outlook-mcp/ - protect this directory\nScope Limitation: The assistant only has access to what the owner explicitly grants\nRevocation: The owner can revoke access anytime via Delegate settings"
      },
      {
        "title": "Files",
        "body": "~/.outlook-mcp/config.json - Client ID, secret, and owner/delegate emails\n~/.outlook-mcp/credentials.json - OAuth tokens (access + refresh)"
      },
      {
        "title": "v1.0.0 (Delegate Edition)",
        "body": "Breaking: API calls now use /users/{owner} instead of /me\nAdded: owner_email and delegate_email config fields\nAdded: Send-on-behalf support with proper from field\nChanged: Permissions to .Shared variants\nAdded: Delegate setup documentation\nAdded: Token test validates access to owner's mailbox\nBased on outlook v1.3.0 by jotamed (https://clawhub.ai/jotamed/outlook)"
      }
    ],
    "body": "Outlook Delegate Skill\n\nAccess another user's Outlook/Microsoft 365 email and calendar as a delegate via Microsoft Graph API.\n\nDelegate Architecture\n\nThis skill is designed for scenarios where:\n\nYour AI assistant has its own Microsoft 365 account (e.g., assistant@domain.com)\nThe owner has granted the assistant delegate access to their mailbox/calendar\nThe assistant authenticates as itself but accesses the owner's resources\nWhat Changed from Direct Access\nFeature\tDirect Access (/me)\tDelegate Access (/users/{id})\nAPI Base\t/me/messages\t/users/{owner}/messages\nSend Email\tAppears \"From: Owner\"\tAppears \"From: Assistant on behalf of Owner\"\nCalendar\tFull control\tBased on permission level granted\nPermissions\tMail.ReadWrite, Mail.Send\tMail.ReadWrite.Shared, Mail.Send.Shared, Calendars.ReadWrite.Shared\nConfiguration\nConfig File: ~/.outlook-mcp/config.json\n{\n  \"client_id\": \"your-app-client-id\",\n  \"client_secret\": \"your-app-client-secret\",\n  \"owner_email\": \"owner@domain.com\",\n  \"delegate_email\": \"assistant@domain.com\"\n}\n\n\nThe owner_email is the mailbox the assistant will access as a delegate.\n\nSetup Requirements\n1. Azure AD App Registration\n\nThe app registration needs delegated permissions (not application permissions):\n\nMail.ReadWrite.Shared - Read/write access to shared mailboxes\nMail.Send.Shared - Send mail on behalf of others\nCalendars.ReadWrite.Shared - Read/write shared calendars\nUser.Read - Read assistant's own profile\noffline_access - Refresh tokens\n2. Exchange Delegate Permissions (Admin or Owner)\n\nThe owner must grant the assistant delegate access via Exchange/Outlook:\n\nPowerShell (Admin):\n\n# Grant mailbox access\nAdd-MailboxPermission -Identity \"owner@domain.com\" -User \"assistant@domain.com\" -AccessRights FullAccess\n\n# Grant Send-on-Behalf\nSet-Mailbox -Identity \"owner@domain.com\" -GrantSendOnBehalfTo \"assistant@domain.com\"\n\n# Grant calendar access (Editor = can create/modify events)\nAdd-MailboxFolderPermission -Identity \"owner@domain.com:\\Calendar\" -User \"assistant@domain.com\" -AccessRights Editor -SharingPermissionFlags Delegate\n\n\nOr via Outlook Settings: The owner can add the assistant as a delegate in Outlook → File → Account Settings → Delegate Access.\n\n3. Token Flow\n\nThe assistant authenticates as itself via OAuth2, then accesses the owner's resources using the /users/{owner@domain.com}/ endpoint.\n\nUsage\nToken Management\n./scripts/outlook-token.sh refresh   # Refresh expired token\n./scripts/outlook-token.sh test      # Test connection to BOTH accounts\n./scripts/outlook-token.sh get       # Print access token\n\nReading Owner's Emails\n./scripts/outlook-mail.sh inbox [count]           # Owner's inbox\n./scripts/outlook-mail.sh unread [count]          # Owner's unread\n./scripts/outlook-mail.sh search \"query\" [count]  # Search owner's mail\n./scripts/outlook-mail.sh from <email> [count]    # Owner's mail from sender\n./scripts/outlook-mail.sh read <id>               # Read email content\n\nManaging Owner's Emails\n./scripts/outlook-mail.sh mark-read <id>          # Mark as read\n./scripts/outlook-mail.sh mark-unread <id>        # Mark as unread\n./scripts/outlook-mail.sh flag <id>               # Flag as important\n./scripts/outlook-mail.sh delete <id>             # Move to trash\n./scripts/outlook-mail.sh archive <id>            # Move to archive\n./scripts/outlook-mail.sh move <id> <folder>      # Move to folder\n\nSending Emails (On Behalf Of Owner)\n./scripts/outlook-mail.sh send <to> <subj> <body>  # Send on behalf of owner\n./scripts/outlook-mail.sh reply <id> \"body\"        # Reply on behalf of owner\n\n\nNote: Emails will show \"Assistant on behalf of Owner\" in the From field.\n\nOwner's Calendar\n./scripts/outlook-calendar.sh events [count]      # Owner's upcoming events\n./scripts/outlook-calendar.sh today               # Owner's today\n./scripts/outlook-calendar.sh week                # Owner's week\n./scripts/outlook-calendar.sh read <id>           # Event details\n./scripts/outlook-calendar.sh free <start> <end>  # Owner's availability\n\nCreating Events on Owner's Calendar\n./scripts/outlook-calendar.sh create <subj> <start> <end> [location]\n./scripts/outlook-calendar.sh quick <subject> [time]\n\nAPI Endpoint Changes\n\nThe key change is replacing /me with /users/{owner_email}:\n\n# Direct access (old)\nAPI=\"https://graph.microsoft.com/v1.0/me\"\n\n# Delegate access (new)\nOWNER=$(jq -r '.owner_email' \"$CONFIG_FILE\")\nAPI=\"https://graph.microsoft.com/v1.0/users/$OWNER\"\n\nSend-on-Behalf Implementation\n\nWhen sending mail as a delegate, you must specify the from address:\n\n{\n  \"message\": {\n    \"subject\": \"Meeting follow-up\",\n    \"from\": {\n      \"emailAddress\": {\n        \"address\": \"owner@domain.com\"\n      }\n    },\n    \"toRecipients\": [{\"emailAddress\": {\"address\": \"recipient@example.com\"}}],\n    \"body\": {\"contentType\": \"Text\", \"content\": \"...\"}\n  }\n}\n\n\nThe recipient sees: \"Assistant on behalf of Owner owner@domain.com\"\n\nPermissions Summary\nAction\tRequired Permission\tExchange Setting\nRead owner's mail\tMail.ReadWrite.Shared\tFullAccess or Reviewer\nModify owner's mail\tMail.ReadWrite.Shared\tFullAccess or Editor\nSend as owner\tMail.Send.Shared\tSendOnBehalf\nRead owner's calendar\tCalendars.ReadWrite.Shared\tReviewer+\nCreate events on owner's calendar\tCalendars.ReadWrite.Shared\tEditor\nTroubleshooting\n\n\"Access denied\" or \"403 Forbidden\" → Check that the assistant has MailboxPermission on the owner's mailbox\n\n\"The mailbox is not found\" → Verify owner_email in config.json is correct\n\n\"Insufficient privileges\" → App registration missing .Shared permissions (check Azure AD)\n\nEmails send but don't show \"on behalf of\" → Missing SendOnBehalf permission. Run:\n\nSet-Mailbox -Identity \"owner@domain.com\" -GrantSendOnBehalfTo \"assistant@domain.com\"\n\n\n\"Token expired\" → Run outlook-token.sh refresh\n\nSecurity Considerations\nAudit Trail: All actions by the assistant are logged in the owner's mailbox audit log\nToken Storage: Credentials stored in ~/.outlook-mcp/ - protect this directory\nScope Limitation: The assistant only has access to what the owner explicitly grants\nRevocation: The owner can revoke access anytime via Delegate settings\nFiles\n~/.outlook-mcp/config.json - Client ID, secret, and owner/delegate emails\n~/.outlook-mcp/credentials.json - OAuth tokens (access + refresh)\nChangelog\nv1.0.0 (Delegate Edition)\nBreaking: API calls now use /users/{owner} instead of /me\nAdded: owner_email and delegate_email config fields\nAdded: Send-on-behalf support with proper from field\nChanged: Permissions to .Shared variants\nAdded: Delegate setup documentation\nAdded: Token test validates access to owner's mailbox\nBased on outlook v1.3.0 by jotamed (https://clawhub.ai/jotamed/outlook)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/87Marc/outlook-skill-clawhub",
    "publisherUrl": "https://clawhub.ai/87Marc/outlook-skill-clawhub",
    "owner": "87Marc",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/outlook-skill-clawhub",
    "downloadUrl": "https://openagent3.xyz/downloads/outlook-skill-clawhub",
    "agentUrl": "https://openagent3.xyz/skills/outlook-skill-clawhub/agent",
    "manifestUrl": "https://openagent3.xyz/skills/outlook-skill-clawhub/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/outlook-skill-clawhub/agent.md"
  }
}