MCP server for Microsoft 365 Outlook (mail + calendar) with audit-preserving drafts and never-auto-send.
Strong naming conventions (verb_noun pattern consistently applied across all 17 tools). Descriptions are present and substantive (avg ~150 chars, within 10-1024 baseline). Input schemas are well-structured with type declarations and parameter descriptions. However, output schemas are not explicitly documented in the tool definitions, LLMs cannot see what fields to expect from responses. Error handling is minimal; no recovery guidance or actionable error messages visible. Security annotations (ToolAnnotations) are mentioned in code comments but not verified in actual tool registration. Missing pagination guidance for list tools despite potentially large result sets.
Create a new calendar event draft. Accepts subject, start/end times, location, organizer, attendees, description, and recurrence rules. Event is saved as a draft and NOT sent to attendees. Returns event ID and web URL.
Delete a calendar event draft by event ID. The event is permanently removed and NOT sent to attendees. Reversible only via Outlook's Deleted Items recovery.
List calendar events within a date range. Returns event IDs, subjects, start/end times, organizer, attendees, location, web URLs. Read-only.
Search calendar events via Microsoft Graph $search. Returns matching events with IDs, subjects, start/end times, organizer, attendees, location, web URLs. Read-only.
Create a new email draft. Accepts subject, body (HTML or plain text), to/cc/bcc recipients, reply-to address, and attachments. Draft is saved to Drafts folder and NOT sent. Returns draft message ID and web URL.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Returns matching mails with id, subject, from...') but no formal schema definition is visible. LLMs cannot plan downstream tool calls or extract fields reliably without structured output documentation.
No pagination parameters or result limits documented. List tools (ol_email_list_unread, ol_email_list_drafts, ol_calendar_list_events) lack limit/offset/page_size parameters. Large result sets could exhaust context windows. Baseline: 20-50 item limit with pagination support.
Error handling and recovery guidance absent. No visible error classification (retryable vs fatal), no actionable error messages, no recovery suggestions. Code comments mention ToolAnnotations but actual annotation implementation not visible in tool registration.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Delete an email message by ID. The message is moved to Deleted Items. Requires OUTLOOK_ALLOW_DELETE=true to be enabled.
Delete an email draft by message ID. The draft is permanently removed from the Drafts folder. Reversible only via Outlook's Deleted Items recovery.
Download an email attachment by message ID and attachment ID. Returns the file content (base64-encoded for binary files, raw text for text files). Read-only.
List all email drafts in the Drafts folder. Returns draft message IDs, subjects, to/cc/bcc recipients, last-modified timestamps, web URLs. Read-only.
List unread messages in the mailbox. Returns message IDs, subjects, from addresses, received-at timestamps, snippets, web URLs. Read-only.
Read a single email message by ID. Returns full message body (HTML or plain text), headers, sender, recipients, subject, received-at, attachments list, web URL. Read-only.
Search a mailbox via Microsoft Graph $search. Returns matching mails with id, subject, from, received-at, snippet, web URL, has-attachments. Read-only. Filter args: folder (well-known name like 'Inbox'/'Drafts' or folder id), from_address (sender email), to_address (delivered-to email), modified_after (ISO date), has_attachment (bool).
Send an email draft by message ID. The draft is moved from Drafts to Sent Items and delivered to all recipients. This action is irreversible — the email is sent immediately.
Update an existing email draft. Accepts draft message ID and any of: subject, body, to/cc/bcc recipients, reply-to address, attachments. Returns updated draft message ID and web URL.
Start the Device Code OAuth flow for interactive sign-in. Returns a verification code and URL for the user to complete authentication. Requires user interaction.
Check the status of an ongoing Device Code login flow. Returns whether the user has completed sign-in and the resulting access token if successful.
Check the current authentication status. Returns whether the user is signed in, the signed-in account type (personal or work/school), and the account's user principal name.
Irreversible operations (ol_email_send_draft, ol_email_delete) lack confirmation/dry-run pattern. No evidence of pre-execution validation or user confirmation step. Agents can trigger irreversible actions without safeguards.
Parameter descriptions lack format/constraint details. E.g., 'modified_after' accepts 'ISO date' but no pattern or example. 'recurrence' accepts 'object' but structure undefined. LLMs cannot validate inputs without explicit constraints.