Use for email and calendar operations - checking inbox, sending emails, viewing calendar, scheduling events. Trigger on phrases like "check email", "draft email", "my calendar", "schedule", "am I free".
Access Microsoft 365 Outlook email and calendar via Microsoft Graph API.
~/.outlook/ (run setup if not done)Note: Tokens are automatically refreshed when needed. No manual intervention required.
# List inbox (default 10 messages)
~/.claude/skills/outlook/scripts/outlook-mail.sh inbox
# List more messages
~/.claude/skills/outlook/scripts/outlook-mail.sh inbox 25
# Unread only
~/.claude/skills/outlook/scripts/outlook-mail.sh unread
# Focused inbox only
~/.claude/skills/outlook/scripts/outlook-mail.sh focused
# List sent items (your sent emails)
~/.claude/skills/outlook/scripts/outlook-mail.sh sent
~/.claude/skills/outlook/scripts/outlook-mail.sh sent 25
# List messages from any folder by name (searches recursively)
~/.claude/skills/outlook/scripts/outlook-mail.sh folder "Chawton Hector" 20
# Filter by sender
~/.claude/skills/outlook/scripts/outlook-mail.sh from "[email protected]"
# Search emails
~/.claude/skills/outlook/scripts/outlook-mail.sh search "project update"
# Read full message (use ID from list)
~/.claude/skills/outlook/scripts/outlook-mail.sh read <message-id>
# Quick preview (subject, from, date, body preview)
~/.claude/skills/outlook/scripts/outlook-mail.sh preview <message-id>
# Create plain text draft
~/.claude/skills/outlook/scripts/outlook-mail.sh draft "[email protected]" "Subject" "Body text"
# Create markdown-formatted draft (converts to HTML)
~/.claude/skills/outlook/scripts/outlook-mail.sh mddraft "[email protected]" "Subject" "**Bold** and _italic_ text"
# Send a draft (use draft ID)
~/.claude/skills/outlook/scripts/outlook-mail.sh send <draft-id>
# Reply to a message (plain text - creates draft)
~/.claude/skills/outlook/scripts/outlook-mail.sh reply <message-id> "Reply body"
# Reply with markdown formatting (converts to HTML - creates draft)
~/.claude/skills/outlook/scripts/outlook-mail.sh mdreply <message-id> "**Bold** reply with _formatting_"
# Send reply draft
~/.claude/skills/outlook/scripts/outlook-mail.sh send <reply-draft-id>
# Follow up on your own sent email (chaser)
~/.claude/skills/outlook/scripts/outlook-mail.sh followup <sent-message-id>
~/.claude/skills/outlook/scripts/outlook-mail.sh followup <sent-message-id> "Custom follow-up body in **markdown**"
# Update an existing draft
~/.claude/skills/outlook/scripts/outlook-mail.sh update <draft-id> subject "New subject line"
~/.claude/skills/outlook/scripts/outlook-mail.sh update <draft-id> body "Plain text body"
~/.claude/skills/outlook/scripts/outlook-mail.sh update <draft-id> mdbody "**Markdown** body"
~/.claude/skills/outlook/scripts/outlook-mail.sh update <draft-id> to "[email protected]"
~/.claude/skills/outlook/scripts/outlook-mail.sh update <draft-id> cc "[email protected]"
~/.claude/skills/outlook/scripts/outlook-mail.sh update <draft-id> bcc "[email protected]"
# List drafts
~/.claude/skills/outlook/scripts/outlook-mail.sh drafts
Note: mddraft, mdreply, and update mdbody require pandoc for markdown conversion. Install with brew install pandoc (macOS) or apt install pandoc (Linux).
IMPORTANT: Always prefer mdreply over reply for professional emails - plain text replies look poorly formatted in Outlook.
Reading attachments:
# List attachments on a message
~/.claude/skills/outlook/scripts/outlook-mail.sh attachments <message-id>
# Download ALL attachments to ./inbox/
~/.claude/skills/outlook/scripts/outlook-mail.sh download <message-id>
# Download specific attachment
~/.claude/skills/outlook/scripts/outlook-mail.sh download <message-id> <attachment-id>
Adding attachments to drafts:
# Add attachment to a draft (supports files up to 150MB)
~/.claude/skills/outlook/scripts/outlook-mail.sh attach <draft-id> <file-path>
Upload method is automatic based on file size:
Multiple attachments can be added by calling attach multiple times on the same draft.
# Mark as read
~/.claude/skills/outlook/scripts/outlook-mail.sh markread <message-id>
# Mark as unread
~/.claude/skills/outlook/scripts/outlook-mail.sh markunread <message-id>
# Delete
~/.claude/skills/outlook/scripts/outlook-mail.sh delete <message-id>
# Archive
~/.claude/skills/outlook/scripts/outlook-mail.sh archive <message-id>
# Move to any folder (searches by name, supports nested folders)
~/.claude/skills/outlook/scripts/outlook-mail.sh move <message-id> "Projects"
~/.claude/skills/outlook/scripts/outlook-mail.sh move <message-id> "Clients/Acme"
# List top-level folders
~/.claude/skills/outlook/scripts/outlook-mail.sh folders
# List subfolders of a folder (default: inbox)
~/.claude/skills/outlook/scripts/outlook-mail.sh subfolders
~/.claude/skills/outlook/scripts/outlook-mail.sh subfolders "Important"
# Create a new top-level folder
~/.claude/skills/outlook/scripts/outlook-mail.sh mkdir "Projects"
# Create a subfolder under an existing folder
~/.claude/skills/outlook/scripts/outlook-mail.sh mkdir "Acme" "Clients"
~/.claude/skills/outlook/scripts/outlook-mail.sh mkdir "Urgent" inbox
# Inbox statistics (total, unread counts)
~/.claude/skills/outlook/scripts/outlook-mail.sh stats
# Upcoming events (default 10)
~/.claude/skills/outlook/scripts/outlook-calendar.sh events
# Today's events
~/.claude/skills/outlook/scripts/outlook-calendar.sh today
# This week
~/.claude/skills/outlook/scripts/outlook-calendar.sh week
# Read event details
~/.claude/skills/outlook/scripts/outlook-calendar.sh read <event-id>
# List calendars
~/.claude/skills/outlook/scripts/outlook-calendar.sh calendars
# Create event (dates in YYYY-MM-DDTHH:MM format)
~/.claude/skills/outlook/scripts/outlook-calendar.sh create "Meeting subject" "2025-02-05T14:00" "2025-02-05T15:00" "Conference Room A"
# Quick 1-hour event
~/.claude/skills/outlook/scripts/outlook-calendar.sh quick "Team standup" "2025-02-05T09:00"
# Check free/busy
~/.claude/skills/outlook/scripts/outlook-calendar.sh free "2025-02-05T09:00" "2025-02-05T17:00"
When user wants to capture an email:
attachments command./inbox/)inbox/ directory:# Email: [Subject]
**From:** [email protected]
**Date:** YYYY-MM-DD HH:MM
**Captured:** YYYY-MM-DD
## Content
[Email body]
## Attachments
- [[inbox/filename.pdf]] (captured)
## Notes
[User's annotations]
When user wants to grab attachments from an email:
inbox, search, or from commandsattachments <message-id>download <message-id> (all) or download <message-id> <attachment-id> (specific)./inbox/ for processingAlways draft first, confirm, then send:
draft or mddraft commandsend command only after explicit approvaldraft or mddraft commandattach <draft-id> <file-path> (repeat for multiple files)send command only after explicit approvalExample:
# Create draft
~/.claude/skills/outlook/scripts/outlook-mail.sh draft "[email protected]" "Q4 Report" "Please find the report attached."
# Output: Draft ID: xxxxxxxxxxxxxxxxxxxx
# Attach files (can be called multiple times)
~/.claude/skills/outlook/scripts/outlook-mail.sh attach xxxxxxxxxxxxxxxxxxxx /path/to/report.pdf
~/.claude/skills/outlook/scripts/outlook-mail.sh attach xxxxxxxxxxxxxxxxxxxx /path/to/data.xlsx
# Send after user confirms
~/.claude/skills/outlook/scripts/outlook-mail.sh send xxxxxxxxxxxxxxxxxxxx
When user wants to follow up on an email they sent:
sent command to find the original emailfollowup <sent-id> (uses default message) or provide custom bodysend command only after explicit approvalExample:
# Find the original sent email
~/.claude/skills/outlook/scripts/outlook-mail.sh sent 20
# Create follow-up draft (default body)
~/.claude/skills/outlook/scripts/outlook-mail.sh followup abc123xyz
# Or with custom message
~/.claude/skills/outlook/scripts/outlook-mail.sh followup abc123xyz "Hi, just checking in on this. Would be great to get your thoughts when you have a moment."
# Send after user confirms
~/.claude/skills/outlook/scripts/outlook-mail.sh send <draft-id>
Always confirm before creating:
If not configured, run:
~/.claude/skills/outlook/scripts/outlook-setup.sh
See references/setup.md for manual setup instructions.