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
By Thomas Hudak ([email protected])
Plugin Structure
Installation
Install this plugin using the Claude Code CLI:
claude plugin install outlook-automation@otc-awesome-llmVerification
After installation, verify the plugin is loaded:
claude plugin listDocumentation
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
- Ensure Python 3.8+ is installed
- Install dependencies:
pip install keyring - Install agent-browser for browser automation
- 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 contentsget_message(message_id, include_body)— single message with optional bodysearch_messages(query, folder)— KQL$searchover mailbox or folderlist_folders()— mail folder treeget_calendar_events(start, end)— calendarView with recurrence expansionsearch_calendar(query)— KQL$searchover eventslist_contacts(top)— personal contactsfind_meeting_times(attendees, duration_min)— meeting time suggestionsdigest(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, andContacts.Readare 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

