$npx -y skills add gmickel/outlookctl --skill outlook-automationAutomates reading, searching, drafting, and sending emails AND calendar events in Classic Outlook on Windows using local COM automation. Use this skill when the user asks to process Outlook emails, create drafts, send messages, save attachments, manage calendar events, create mee
| 1 | # Outlook Automation |
| 2 | |
| 3 | This skill enables email and calendar automation through Classic Outlook on Windows using the `outlookctl` CLI tool. |
| 4 | |
| 5 | ## How to Run Commands |
| 6 | |
| 7 | Run all commands using this pattern from any directory: |
| 8 | |
| 9 | ```bash |
| 10 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli <command> [options] |
| 11 | ``` |
| 12 | |
| 13 | For convenience, define this alias at the start of your session: |
| 14 | ```bash |
| 15 | alias outlookctl='uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli' |
| 16 | ``` |
| 17 | |
| 18 | ## Quick Start |
| 19 | |
| 20 | Before using any commands, verify the environment: |
| 21 | |
| 22 | ```bash |
| 23 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli doctor |
| 24 | ``` |
| 25 | |
| 26 | ## Available Commands |
| 27 | |
| 28 | ### Email Commands |
| 29 | |
| 30 | | Command | Description | |
| 31 | |---------|-------------| |
| 32 | | `doctor` | Validate environment and prerequisites | |
| 33 | | `list` | List messages from a folder | |
| 34 | | `get` | Get a single message by ID | |
| 35 | | `search` | Search messages with filters | |
| 36 | | `draft` | Create a draft message (supports --reply-all) | |
| 37 | | `send` | Send a draft or new message | |
| 38 | | `move` | Move message to another folder | |
| 39 | | `delete` | Delete a message (soft or permanent) | |
| 40 | | `mark-read` | Mark message as read/unread | |
| 41 | | `forward` | Create a forward draft | |
| 42 | | `attachments save` | Save attachments to disk | |
| 43 | |
| 44 | ### Calendar Commands |
| 45 | |
| 46 | | Command | Description | |
| 47 | |---------|-------------| |
| 48 | | `calendar calendars` | List all available calendars (including subscribed ICS) | |
| 49 | | `calendar list` | List calendar events (default: next 7 days, use --all for all calendars) | |
| 50 | | `calendar get` | Get event details by ID | |
| 51 | | `calendar create` | Create an event or meeting (draft by default) | |
| 52 | | `calendar send` | Send meeting invitations | |
| 53 | | `calendar respond` | Accept, decline, or tentatively respond to a meeting | |
| 54 | | `calendar update` | Update event subject, time, location, etc. | |
| 55 | | `calendar delete` | Delete/cancel an event (sends cancellations if needed) | |
| 56 | |
| 57 | **Tip:** Use `--calendar "Name"` to access non-default calendars (e.g., `--calendar "Family"`). |
| 58 | |
| 59 | ## Safety Rules |
| 60 | |
| 61 | **CRITICAL: Follow these rules when handling email and calendar operations:** |
| 62 | |
| 63 | ### Email Safety |
| 64 | 1. **Never auto-send emails** - Always create drafts first and get explicit user confirmation before sending |
| 65 | 2. **Draft-first workflow** - Use `draft` to create drafts, show the user a preview, then send only after approval |
| 66 | 3. **Explicit confirmation required** - The send command requires `--confirm-send YES` flag |
| 67 | 4. **Metadata by default** - Body content is only retrieved when explicitly requested |
| 68 | |
| 69 | ### Calendar Safety |
| 70 | 1. **Meetings are drafts by default** - When creating a meeting with attendees, invitations are NOT sent automatically |
| 71 | 2. **Explicit send required** - Use `calendar send --confirm-send YES` to send meeting invitations |
| 72 | 3. **Show preview first** - Always show the user meeting details before sending invitations |
| 73 | 4. **Responding is safe** - Accepting/declining meetings does not require extra confirmation |
| 74 | |
| 75 | ## Workflows |
| 76 | |
| 77 | ### Reading and Searching Email |
| 78 | |
| 79 | To list recent emails: |
| 80 | ```bash |
| 81 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli list --count 10 |
| 82 | ``` |
| 83 | |
| 84 | To search for specific emails: |
| 85 | ```bash |
| 86 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli search --from "sender@example.com" --since 2025-01-01 |
| 87 | ``` |
| 88 | |
| 89 | To get full message content (only when user asks): |
| 90 | ```bash |
| 91 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli get --id "<entry_id>" --store "<store_id>" --include-body |
| 92 | ``` |
| 93 | |
| 94 | ### Creating and Sending Email (Draft-First) |
| 95 | |
| 96 | **Step 1: Create a draft** |
| 97 | ```bash |
| 98 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli draft --to "recipient@example.com" --subject "Subject" --body-text "Message body" |
| 99 | ``` |
| 100 | |
| 101 | **Step 2: Show user the preview** (subject, recipients, body summary) |
| 102 | |
| 103 | **Step 3: Only after user confirms, send the draft** |
| 104 | ```bash |
| 105 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli send --draft-id "<entry_id>" --draft-store "<store_id>" --confirm-send YES |
| 106 | ``` |
| 107 | |
| 108 | ### Replying to Messages |
| 109 | |
| 110 | ```bash |
| 111 | # Create reply draft |
| 112 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli draft --to "recipient@example.com" --subject "Re: Original" --body-text "Reply text" --reply-to-id "<entry_id>" --reply-to-store "<store_id>" |
| 113 | ``` |
| 114 | |
| 115 | ### Saving Attachments |
| 116 | |
| 117 | ```bash |
| 118 | uv run --project "C:/Users/GordonMickel/work/outlookctl" python -m outlookctl.cli attachments save --id "<entry |