MCP server for Outlook/Microsoft 365 via Microsoft Graph API (Path A: read-only mail operations). Provides tools to list, search, and retrieve messages, folders, attachments, and mailbox settings from Microsoft 365 accounts.
Strong foundation with 9 well-named, read-only tools. All tools have clear descriptions (100-200 chars, well within baseline). Input schemas are present with types and constraints (min/max on numeric params, enums implicit via description). Account parameter consistently gated with security note. However, output schemas are not explicitly documented in the source, only inferred from descriptions. Error handling guidance is minimal. No tool annotations visible (readOnlyHint, idempotentHint). Composition is clean (each tool does one thing), but no batch variants or multi-step confirmation patterns for future write operations.
Fetch a single attachment by ID. The binary content is returned base64-encoded in the contentBytes field. Always pass max_bytes to cap the response size; recommended cap is 10 MiB.
Fetch a single mail folder by ID. Returns counters (totalItemCount, unreadItemCount, childFolderCount).
Fetch a single message by Graph message ID. Returns the full resource including body (text or HTML). Use select to project only specific fields and reduce payload size.
List attachments on a message. Returns metadata only (name, contentType, size, isInline) — does NOT include the binary content. Use get_attachment with max_bytes to fetch the actual bytes.
List all message categories defined by the user. Categories are referenced by ID from the categories[] field on each message.
Output schemas not explicitly documented. Descriptions infer structure (e.g., 'Returns OData envelope; NextLink included'), but formal response schemas are absent from tool definitions. LLMs cannot reliably plan downstream calls or extract chaining IDs without documented output types.
No tool annotations (readOnlyHint, idempotentHint, destructiveHint) visible in source. All 9 tools are read-only, but this is not formally declared. Future write tools (Phase 2) will need explicit destructiveHint to signal irreversibility.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
List mail folders in the mailbox. Top-level by default; pass parent=<id> to list children of a specific folder.
List messages in a Microsoft account folder via Microsoft Graph. Returns the first page of an OData envelope; NextLink is included for pagination. Fase 1: read-only, no body content (use get_message to fetch full body).
List inbox message rules. Each rule exposes its conditions, actions, and exceptions. The actions describe what the rule is configured to do (forward, move, mark) — this tool only reads the configuration; it does not execute any rule.
KQL-style search across message subject + body. Results ranked by Graph search relevance. Optionally scope to a folder.
Error handling lacks recovery guidance. Descriptions mention 'HTTP 400' for invalid OData syntax but do not guide the LLM on what to do next (e.g., 'Try simplifying the filter expression' or 'Call list_folders to discover valid folder IDs'). No actionable error messages visible.
Pagination parameters (top, NextLink) are present but no total count or cursor returned. LLMs cannot determine if more results exist or how many items match the query. Descriptions mention 'first page' but do not explain how to fetch subsequent pages.
Account parameter gating is documented ('Default-deny: must be in [accounts].allowed') but no explicit permission scope declaration (e.g., 'Requires: read:mail'). Future audit trails and least-privilege configurations will need formal scope metadata.