Work with Obsidian vaults (plain Markdown notes) and automate via obsidian-cli.
npx skills add zonghui1968/clawd-skills --skill "outlook"
Install specific skill from multi-skill repository
# Description
Read, search, and manage Outlook emails and calendar via Microsoft Graph API. Use when the user asks about emails, inbox, Outlook, Microsoft mail, calendar events, or scheduling.
# SKILL.md
name: outlook
description: Read, search, and manage Outlook emails and calendar via Microsoft Graph API. Use when the user asks about emails, inbox, Outlook, Microsoft mail, calendar events, or scheduling.
version: 1.3.0
author: jotamed
Outlook Skill
Access Outlook/Hotmail email and calendar via Microsoft Graph API using OAuth2.
Quick Setup (Automated)
# Requires: Azure CLI, jq
./scripts/outlook-setup.sh
The setup script will:
1. Log you into Azure (device code flow)
2. Create an App Registration automatically
3. Configure API permissions (Mail.ReadWrite, Mail.Send, Calendars.ReadWrite)
4. Guide you through authorization
5. Save credentials to ~/.outlook-mcp/
Manual Setup
See references/setup.md for step-by-step manual configuration via Azure Portal.
Usage
Token Management
./scripts/outlook-token.sh refresh # Refresh expired token
./scripts/outlook-token.sh test # Test connection
./scripts/outlook-token.sh get # Print access token
Reading Emails
./scripts/outlook-mail.sh inbox [count] # List latest emails (default: 10)
./scripts/outlook-mail.sh unread [count] # List unread emails
./scripts/outlook-mail.sh search "query" [count] # Search emails
./scripts/outlook-mail.sh from <email> [count] # List emails from sender
./scripts/outlook-mail.sh read <id> # Read email content
./scripts/outlook-mail.sh attachments <id> # List email attachments
Managing Emails
./scripts/outlook-mail.sh mark-read <id> # Mark as read
./scripts/outlook-mail.sh mark-unread <id> # Mark as unread
./scripts/outlook-mail.sh flag <id> # Flag as important
./scripts/outlook-mail.sh unflag <id> # Remove flag
./scripts/outlook-mail.sh delete <id> # Move to trash
./scripts/outlook-mail.sh archive <id> # Move to archive
./scripts/outlook-mail.sh move <id> <folder> # Move to folder
Sending Emails
./scripts/outlook-mail.sh send <to> <subj> <body> # Send new email
./scripts/outlook-mail.sh reply <id> "body" # Reply to email
Folders & Stats
./scripts/outlook-mail.sh folders # List mail folders
./scripts/outlook-mail.sh stats # Inbox statistics
Calendar
Viewing Events
./scripts/outlook-calendar.sh events [count] # List upcoming events
./scripts/outlook-calendar.sh today # Today's events
./scripts/outlook-calendar.sh week # This week's events
./scripts/outlook-calendar.sh read <id> # Event details
./scripts/outlook-calendar.sh calendars # List all calendars
./scripts/outlook-calendar.sh free <start> <end> # Check availability
Creating Events
./scripts/outlook-calendar.sh create <subj> <start> <end> [location] # Create event
./scripts/outlook-calendar.sh quick <subject> [time] # Quick 1-hour event
Managing Events
./scripts/outlook-calendar.sh update <id> <field> <value> # Update (subject/location/start/end)
./scripts/outlook-calendar.sh delete <id> # Delete event
Date format: YYYY-MM-DDTHH:MM (e.g., 2026-01-26T10:00)
Example Output
$ ./scripts/outlook-mail.sh inbox 3
{
"n": 1,
"subject": "Your weekly digest",
"from": "[email protected]",
"date": "2026-01-25T15:44",
"read": false,
"id": "icYY6QAIUE26PgAAAA=="
}
{
"n": 2,
"subject": "Meeting reminder",
"from": "[email protected]",
"date": "2026-01-25T14:06",
"read": true,
"id": "icYY6QAIUE26PQAAAA=="
}
$ ./scripts/outlook-mail.sh read "icYY6QAIUE26PgAAAA=="
{
"subject": "Your weekly digest",
"from": { "name": "Digest", "address": "[email protected]" },
"to": ["[email protected]"],
"date": "2026-01-25T15:44:00Z",
"body": "Here's what happened this week..."
}
$ ./scripts/outlook-mail.sh stats
{
"folder": "Inbox",
"total": 14098,
"unread": 2955
}
$ ./scripts/outlook-calendar.sh today
{
"n": 1,
"subject": "Team standup",
"start": "2026-01-25T10:00",
"end": "2026-01-25T10:30",
"location": "Teams",
"id": "AAMkAGQ5NzE4YjQ3..."
}
$ ./scripts/outlook-calendar.sh create "Lunch with client" "2026-01-26T13:00" "2026-01-26T14:00" "Restaurant"
{
"status": "event created",
"subject": "Lunch with client",
"start": "2026-01-26T13:00",
"end": "2026-01-26T14:00",
"id": "AAMkAGQ5NzE4YjQ3..."
}
Token Refresh
Access tokens expire after ~1 hour. Refresh with:
./scripts/outlook-token.sh refresh
Files
~/.outlook-mcp/config.json- Client ID and secret~/.outlook-mcp/credentials.json- OAuth tokens (access + refresh)
Permissions
Mail.ReadWrite- Read and modify emailsMail.Send- Send emailsCalendars.ReadWrite- Read and modify calendar eventsoffline_access- Refresh tokens (stay logged in)User.Read- Basic profile info
Notes
- Email IDs: The
idfield shows the last 20 characters of the full message ID. Use this ID with commands likeread,mark-read,delete, etc. - Numbered results: Emails are numbered (n: 1, 2, 3...) for easy reference in conversation.
- Text extraction: HTML email bodies are automatically converted to plain text.
- Token expiry: Access tokens expire after ~1 hour. Run
outlook-token.sh refreshwhen you see auth errors. - Recent emails: Commands like
read,mark-read, etc. search the 100 most recent emails for the ID.
Troubleshooting
"Token expired" → Run outlook-token.sh refresh
"Invalid grant" → Token invalid, re-run setup: outlook-setup.sh
"Insufficient privileges" → Check app permissions in Azure Portal → API Permissions
"Message not found" → The email may be older than 100 messages. Use search to find it first.
"Folder not found" → Use exact folder name. Run folders to see available folders.
Supported Accounts
- Personal Microsoft accounts (outlook.com, hotmail.com, live.com)
- Work/School accounts (Microsoft 365) - may require admin consent
Changelog
v1.3.0
- Added: Calendar support (
outlook-calendar.sh) - View events (today, week, upcoming)
- Create/quick-create events
- Update event details (subject, location, time)
- Delete events
- Check availability (free/busy)
- List calendars
- Added:
Calendars.ReadWritepermission
v1.2.0
- Added:
mark-unread- Mark emails as unread - Added:
flag/unflag- Flag/unflag emails as important - Added:
delete- Move emails to trash - Added:
archive- Archive emails - Added:
move- Move emails to any folder - Added:
from- Filter emails by sender - Added:
attachments- List email attachments - Added:
reply- Reply to emails - Improved:
send- Better error handling and status output - Improved:
move- Case-insensitive folder names, shows available folders on error
v1.1.0
- Fixed: Email IDs now use unique suffixes (last 20 chars)
- Added: Numbered results (n: 1, 2, 3...)
- Improved: HTML bodies converted to plain text
- Added:
tofield in read output
v1.0.0
- Initial release
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.