Outlook Web Plugin for Claude Code
A Claude Code plugin that enables browser automation of Outlook Web (outlook.office.com) for email and calendar management using playwright-cli.
Features
-
Email Operations
- Read inbox and emails
- Compose drafts (safe by default - never sends without explicit confirmation)
- Reply to and forward emails
- Search emails
- Navigate folders (Drafts, Sent Items, Archive, etc.)
-
Calendar Operations
- View calendar (day/week/month views)
- See upcoming events
- Access event details
-
Session Management
- Persistent authentication across commands
- Headless operation (after initial login)
- Automatic draft saving
-
Optimized for LLMs
- Text extraction methods for efficient token usage (70-90% reduction)
- Batch operations with run-code
- Resource blocking options for faster page loads
Prerequisites
Required:
-
Claude Code CLI - Install from anthropic.com/claude-code
-
playwright-cli - Install via npm:
npm install -g @playwright/cli@latest
Or as a Claude Code plugin:
/plugin marketplace add microsoft/playwright-cli
/plugin install playwright-cli
Note: This plugin requires playwright-cli to interact with Outlook Web. Ensure it's installed and working before using this skill.
Installation
Via Plugin Marketplace (Recommended)
Add the marketplace and install the plugin:
/plugin marketplace add organisciak/outlook-web-skill
/plugin install outlook-web
Codex (Skill Installer)
Install directly with the Codex skill installer:
$skill-installer --repo organisciak/outlook-web-skill --path skills/outlook-web --name outlook-web
Restart Codex to pick up new skills.
Manual Installation
For agents without automatic plugin support, install the skill directly:
mkdir -p ~/.claude/skills/outlook-web
curl -o ~/.claude/skills/outlook-web/SKILL.md \
https://raw.githubusercontent.com/organisciak/outlook-web-skill/main/skills/outlook-web/SKILL.md
Optionally, install the reference documentation:
mkdir -p ~/.claude/skills/outlook-web/references
curl -o ~/.claude/skills/outlook-web/references/ui-patterns.md \
https://raw.githubusercontent.com/organisciak/outlook-web-skill/main/skills/outlook-web/references/ui-patterns.md
curl -o ~/.claude/skills/outlook-web/OPTIMIZATION-AUDIT.md \
https://raw.githubusercontent.com/organisciak/outlook-web-skill/main/skills/outlook-web/OPTIMIZATION-AUDIT.md
From Source (Development)
Clone and use locally:
git clone https://github.com/organisciak/outlook-web-skill.git
cd outlook-web-skill
claude --plugin-dir .
Quick Start
First-Time Setup
Authenticate with Microsoft (one-time only):
playwright-cli open "https://outlook.office.com/mail/inbox" --session=outlook-web --headed
Complete the login in the opened browser window. The session persists for future use.
Basic Usage
/outlook-web check my inbox
/outlook-web read the email from John about the meeting
/outlook-web draft a reply saying "Thanks, I'll review this tomorrow"
/outlook-web show my calendar for this week
Usage Examples
Email
# Read inbox
/outlook-web show me my unread emails
# Read specific email
/outlook-web open the email from Sarah about project updates
# Compose draft
/outlook-web draft an email to [email protected] with subject "Meeting Follow-up"
# Reply to email
/outlook-web reply to the last email saying "I'll have that ready by Friday"
# Search
/outlook-web search for emails about "budget proposal"
Calendar
# View calendar
/outlook-web show my calendar for tomorrow
# Check availability
/outlook-web what meetings do I have this afternoon?
Advanced Usage
Batch Operations
Combine multiple operations for 60-70% faster execution:
playwright-cli run-code "async () => {
await page.goto('https://outlook.office.com/mail/inbox');
await page.getByRole('option').first().click();
await page.getByRole('button', { name: 'Reply', exact: true }).click();
await page.getByRole('textbox', { name: 'Message body' }).fill('Your reply');
await page.keyboard.press('Control+s');
}" --session=outlook-web
Efficient Text Extraction
Extract content without UI overhead (70-90% token reduction):
# Email list as plain text
playwright-cli run-code "async () => {
const listbox = await page.locator('[role=\"listbox\"]').first();
return await listbox.innerText();
}" --session=outlook-web
# Message body only
playwright-cli run-code "async () => {
const body = await page.locator('[role=\"document\"]').first();
return await body.innerText();
}" --session=outlook-web
Resource Blocking
Block images, fonts, and analytics for faster page loads: