Skip to content

outlook-automation

otc-awesome-llm is the Optum LLM library providing version-controlled prompts, chatmodes, instructions, and agent modes for infrastructure operations via native IDE integrations

v11.3.0
Claude Code

By Thomas Hudak ([email protected])

Plugin Structure

🤖
0
Agents
0
Skills
⌨️
0
Commands
🪝
0
Hooks
📋
0
Rules

Installation

Install this plugin using the Claude Code CLI:

claude plugin install outlook-automation@otc-awesome-llm

Verification

After installation, verify the plugin is loaded:

claude plugin list

Documentation

Outlook Automation Plugin

This plugin provides secure Outlook email automation capabilities for Claude Code.

Features

  • Secure Credential Management: Uses system keychain for password storage
  • Read-Only by Default: Write operations require explicit user confirmation
  • Human-in-the-Loop Protection: All destructive operations need approval
  • Fail-Safe Architecture: System fails closed if security components unavailable

Skills

  • outlook-automation: Main skill for email automation, digest creation, and task extraction

Security

This plugin has undergone comprehensive security review:

  • Command injection prevention (shell=False)
  • Mandatory security validation
  • Audit logging for all operations
  • No write operations without confirmation

Installation

  1. Ensure Python 3.8+ is installed
  2. Install dependencies: pip install keyring
  3. Install agent-browser for browser automation
  4. Run setup: python scripts/outlook_login.py --setup

Usage

See the skill documentation for detailed usage instructions.

Full content query (PR #489)

The plugin's OutlookClient now exposes the full mail + calendar + contacts query surface required by the unified m365-query plugin:

  • list_messages(folder, top, unread_only) — folder contents
  • get_message(message_id, include_body) — single message with optional body
  • search_messages(query, folder) — KQL $search over mailbox or folder
  • list_folders() — mail folder tree
  • get_calendar_events(start, end) — calendarView with recurrence expansion
  • search_calendar(query) — KQL $search over events
  • list_contacts(top) — personal contacts
  • find_meeting_times(attendees, duration_min) — meeting time suggestions
  • digest(since, categories) — structured (non-markdown) categorized inbox

Construct with OutlookClient(full_query_scopes=True) to inject the broader DEFAULT_OUTLOOK_SCOPES_FULL scope set (Mail.Read, Mail.ReadBasic, Calendars.Read, Contacts.Read, MailboxSettings.Read, User.Read) when the user has not pinned their own scopes in ~/.claude/outlook-automation.local.md.

Consent gap (as of this PR): Mail.Read, Mail.ReadBasic, Calendars.Read, and Contacts.Read are NOT yet admin-consented on the Microsoft Graph Command Line Tools appId in the UHG tenant. An admin-consent request is open; until it lands, calls against these surfaces return clean 403 errors with the requested scope echoed back. SharePoint / Files / Group metadata calls already work. Legion's appId does NOT include these Outlook scopes either (verified 2026-05-08), so the unblock path is admin consent on the Graph CLI Tools appId — not a Legion token swap like Teams.

CLI:

python outlook_graph_client.py mail-search --query "URGENT" --folder inbox
python outlook_graph_client.py calendar --range 2026-05-08..2026-05-15
python outlook_graph_client.py contacts --top 50

License

Same as parent repository