Microsoft Graph MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Microsoft Graph MCP Server show my schedule for next week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Microsoft Graph MCP Server
A beautifully simple way to give your AI assistant superpowers inside Microsoft 365.
This project turns Microsoft Graph into an easy‑to‑use MCP server — so Claude, your custom agents, or any MCP client can instantly work with your Email, Calendar, and Contacts.
No Azure setup. No Graph API knowledge. Just install → sign in → your AI becomes a Microsoft 365 power user.
⭐ Why Developers Love This Project
Your AI can read, search, reply to, and organize email naturally
Batch email operations — delete or archive multiple emails in ONE call (no more one-by-one!)
It understands and manages your calendar with real availability checks
It handles contacts with simple MCP tools
It works securely using Microsoft's device login — no secrets, no risk
It just works on local machines with zero configuration
This is the fastest way to make your AI agent actually useful at work.
If this project saves you time:
👉 Please star the repo — it really helps! ⭐
Related MCP server: Microsoft Graph MCP Server
🚀 Quick Start
1. Install
pip install -r requirements.txtMultimodal Support: Image compression requires
Pillow>=10.0.0(included in requirements.txt). If not installed, images will be returned without compression.
Or:
pip install uv
uvx .2. Link to Claude Desktop
Open:
%APPDATA%/Claude/claude_desktop_config.jsonChoose one of the following configuration methods:
Method 1: Using uv run (Recommended)
{
"mcpServers": {
"microsoft-graph": {
"command": "uv",
"args": ["run", "--directory", "<path-to-your-local-repo>", "microsoft-graph-mcp-server"]
}
}
}Recommended: This method uses your local code directly, so changes take effect immediately without reinstalling.
Method 2: Using uvx (Local Path)
{
"mcpServers": {
"microsoft-graph": {
"command": "uvx",
"args": ["--from", "<path-to-your-local-repo>", "microsoft-graph-mcp-server"]
}
}
}Note:
First time or after code changes, run:
uv tool install --force <path-to-your-local-repo>
uvxcaches the package, so you need to reinstall to pick up code updates
Method 3: Using python -m
{
"mcpServers": {
"microsoft-graph": {
"command": "py",
"args": ["-m", "microsoft_graph_mcp_server"]
}
}
}Note:
Windows: Use
py(Python Launcher) which automatically finds your Python installationLinux/Mac: Replace
pywithpythonorpython3Run from the project directory or install via
pip install -e .
3. Sign In
In Claude, simply ask: "Please help me sign in to Microsoft Graph"
Claude will call:
{
"tool": "auth",
"action": "start"
}Follow the link → enter the code → sign in.
Then tell Claude: "I have completed the browser login"
Then Claude will finalize:
{
"tool": "auth",
"action": "complete"
}You're connected. Your AI assistant now has Microsoft 365 access.
🌟 What Your AI Can Do
Below is the friendly but complete feature overview — designed to impress potential users and help people understand the project's power at a glance.
🔧 Configure AI Assistant (Recommended)
Copy the system prompt to your AI assistant configuration:
For Claude Desktop, add to your project or custom instructions. This provides:
Smart workflow selection (AI auto-chooses Quick Mode for simple emails, Full Mode for complex ones)
HTML formatting rules for emails
Calendar conflict detection awareness
Best practices for using MCP tools
For other AI assistants, use the SYSTEM_PROMPT.md content as system instructions.
📧 Email Superpowers
Your AI can:
Search emails by sender, subject, body, or natural filters
Focused Inbox support - by default searches "focused" emails, with option to search "other" or all
Open full email content including attachments
Download attachments to workspace for LLM analysis (Excel, PDF, images, etc.)
Image analysis for multimodal LLMs - View and analyze image attachments inline (screenshots, photos, diagrams)
Reply, forward, and compose new messages with HTML
Move, delete, archive, or bulk‑manage messages
Browse emails with fast local caching
Filter by time ranges ("today", "this week", "last 30 days")
Handle folders: create, rename, delete, move
Example
{
"tool": "search_emails",
"query": "invoices",
"search_type": "subject"
}Attachment Download Example
{
"tool": "get_email_content",
"cache_number": 1,
"download_attachments": true
}Attachments are saved to workspace/attachments and can be processed by other tools (file readers, image viewers, etc.).
Focused Inbox Example
{
"tool": "search_emails",
"query": "newsletter",
"inference_classification": "other"
}📅 Calendar Intelligence
Your AI can:
Search all upcoming events
Create or modify meetings
Cancel events and notify attendees
Accept or decline invitations
Check availability for multiple attendees
Create recurring events
Handle timezones automatically
Example
{
"tool": "manage_event_as_organizer",
"action": "create",
"subject": "Project Sync",
"start": "2026-02-26T14:00",
"end": "2026-02-26T14:30"
}👥 Contact Search
Find people in your organization by name or email
Fallback to fuzzy matching when needed
Works instantly after login
{
"tool": "search_contacts",
"query": "john li"
}🧠 Why This Project Exists
Modern AI assistants need to interact with your real work tools — email, meetings, files.
Microsoft Graph offers all of this, but:
The API is complex
Authentication is intimidating
Azure app registration is painful
Developers want simplicity, not bureaucracy
This MCP server solves all of it:
Zero Azure setup
Zero Graph API learning curve
Zero complexity
Just install and go.
🔥 Real‑World Use Cases & AI‑Friendly Workflows
These practical examples show potential users exactly why this project matters, with workflows designed specifically for AI usage — simple, predictable, and reliable.
Use Case: "Automated Reporting Agent"
Your AI can scan your inbox and calendar, then build a weekly summary report.
Pull last week's emails
Extract key events
Identify action items
Draft a clean weekly summary email
Send it to your team
Workflow
Ask Claude to search emails: "Find emails from the last 7 days"
Claude will call:
{
"tool": "search_emails",
"days": 7
}Ask Claude to browse the results: "Analyze the emails for me"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 1,
"mode": "llm"
}Returns: Email summaries with sender, subject, date, and cache numbers for easy reference. In llm mode, Claude gets more emails per page (default 20) for efficient analysis.
Ask Claude to search events: "Find calendar events from last week"
Claude will call:
{
"tool": "search_events",
"time_range": "last_week"
}Ask Claude to send summary email: "Send a weekly summary to the team"
Claude will call:
{
"tool": "send_email",
"action": "send_new",
"to": ["team@example.com"],
"subject": "Weekly Summary",
"htmlbody": "<p>Here's the update...</p>"
}Use Case: Batch BCC Forward
Your AI can search for emails and forward them to multiple recipients via BCC using a CSV file.
Workflow
Ask Claude to search emails by subject: "Find emails with subject 'Company Announcement'"
Claude will call:
{
"tool": "search_emails",
"query": "Company Announcement",
"search_type": "subject"
}Ask Claude to browse the email cache: "Show me the emails with subject 'Company Announcement'"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 1,
"mode": "llm"
}Ask Claude to verify email content: "Show me email number 1"
Claude will call:
{
"tool": "get_email_content",
"cache_number": 1
}Ask Claude to batch forward via BCC using CSV: "Forward email number 1 to all recipients in the CSV file"
Claude will call:
{
"tool": "send_email",
"action": "forward",
"cache_number": 1,
"bcc_csv_file": "C:/path/to/recipients.csv",
"subject": "Fwd: Company Announcement",
"htmlbody": "<p>Please see the company announcement below.</p>"
}Note: The CSV file should have a single column with header 'Email' containing all recipient email addresses.
Use Case: Schedule a Meeting
Your AI can check availability and schedule meetings with Teams links.
Workflow
Ask Claude to check attendee availability: "Check availability for John and Jane on March 1st"
Claude will call:
{
"tool": "check_attendee_availability",
"attendees": ["john@example.com", "jane@example.com"],
"date": "2026-03-01"
}Ask Claude to schedule a meeting: "Schedule a meeting with John and Jane on March 1st at 2 PM for 30 minutes"
Claude will call:
{
"tool": "manage_event_as_organizer",
"action": "create",
"subject": "Project Discussion",
"start": "2026-03-01T14:00",
"end": "2026-03-01T14:30",
"attendees": ["john@example.com", "jane@example.com"],
"team": true
}Note: The "team": true parameter adds a Teams meeting link to the event.
Use Case: Clean Up Your Inbox
Your AI can help you batch delete or archive multiple emails in one operation.
Workflow
Ask Claude to search emails: "Find emails from newsletter@example.com"
Claude will call:
{
"tool": "search_emails",
"query": "newsletter@example.com",
"search_type": "sender"
}Ask Claude to browse the results: "Show me these emails"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 1,
"mode": "llm"
}Ask Claude to delete multiple emails: "Delete emails 1, 2, 3, 4, and 5"
Claude will call:
{
"tool": "manage_emails",
"action": "delete_multiple",
"cache_numbers": [1, 2, 3, 4, 5]
}Or archive them instead: "Archive emails 1 through 5"
Claude will call:
{
"tool": "manage_emails",
"action": "archive_multiple",
"cache_numbers": [1, 2, 3, 4, 5]
}Note: All emails are processed in ONE batch call - efficient and fast!
Use Case: Download and Analyze Attachments
Your AI can download email attachments and analyze them with other tools.
Workflow
Ask Claude to search emails with attachments: "Find emails with Excel attachments"
Claude will call:
{
"tool": "search_emails",
"query": "xlsx",
"search_type": "body"
}Ask Claude to browse the results: "Show me these emails"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 1,
"mode": "llm"
}Returns: Email summaries with attachment info (name, size, contentType) visible upfront.
Ask Claude to download attachments: "Download the Excel attachment from email number 1"
Claude will call:
{
"tool": "get_email_content",
"cache_number": 1,
"download_attachments": true,
"attachment_names": ["report.xlsx"]
}Returns: Email content with attachment saved to workspace/attachments/report.xlsx
Use other tools to analyze: "Read the Excel file and summarize it"
Claude can now use file reading tools to process the downloaded attachment.
Key Features:
See attachment names/types before downloading (in browse_email_cache)
Download only specific attachments with
attachment_namesparameterCustom download path with
download_pathparameterInline attachments (embedded images) are automatically skipped
Use Case: Analyze Image Attachments (Multimodal)
Your AI can view and analyze image attachments directly when using a multimodal LLM.
Workflow
Ask Claude to search emails with images: "Find emails with image attachments"
Claude will call:
{
"tool": "search_emails",
"days": 7
}Ask Claude to browse the results: "Show me the emails"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 1,
"mode": "llm"
}Returns: Email summaries showing attachment types (e.g., contentType: image/png)
Ask Claude to view the email with images: "Show me email number 1 with the images"
Claude will call:
{
"tool": "get_email_content",
"cache_number": 1,
"return_html": true
}Returns: Email content with images returned as ImageContent for multimodal LLMs to analyze directly.
Claude analyzes the images: "What's in the screenshot?"
Claude will describe what it sees in the images - screenshots, diagrams, photos, charts, etc.
Configuration (in .env):
MULTIMODAL_SUPPORTED=true
IMAGE_MAX_SIZE_KB=50
IMAGE_MAX_DIMENSION=1024
IMAGE_QUALITY=75Note: Images are automatically compressed to fit within LLM API limits.
User Mode Email Browsing
For human browsing (when you want to see emails page by page):
Ask Claude to search emails: "Find emails from this week"
Claude will call:
{
"tool": "search_emails",
"time_range": "this_week"
}Ask Claude to browse page by page: "Show me the first page of emails"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 1,
"mode": "user"
}Returns: Email summaries with sender, subject, date, and cache numbers. In user mode, you get fewer emails per page (default 5) for easier human reading.
Navigate to next page: "Show me the next page"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 2,
"mode": "user"
}View specific email: "Show me email number 3"
Claude will call:
{
"tool": "get_email_content",
"cache_number": 3
}Ask Claude to reply to the email: "Reply to email number 3 saying thank you"
Claude will call:
{
"tool": "send_email",
"action": "reply",
"cache_number": 3,
"htmlbody": "<p>Thank you!</p>"
}Key difference: Use "mode": "user" when you want to browse emails manually, page by page, with smaller page sizes that are easier for humans to read.
Email Workflow (LLM Mode)
Ask Claude to search emails: "Find emails about budget"
Claude will call:
{
"tool": "search_emails",
"query": "budget"
}Ask Claude to browse the results: "Show me the budget emails"
Claude will call:
{
"tool": "browse_email_cache",
"page_number": 1,
"mode": "llm"
}Returns: Email summaries with sender, subject, date, and cache numbers for easy reference. In llm mode, Claude gets more emails per page (default 20) for efficient analysis.
Ask Claude to view specific email: "Show me the second email"
Claude will call:
{
"tool": "get_email_content",
"cache_number": 2
}Ask Claude to reply: "Reply to this email saying it looks good"
Claude will call:
{
"tool": "send_email",
"action": "reply",
"cache_number": 2,
"htmlbody": "<p>Looks good!</p>"
}Calendar Workflow
Ask Claude to search events: "Find calendar events from this week"
Claude will call:
{
"tool": "search_events",
"time_range": "this_week"
}Ask Claude to browse events: "Show me the first page of events"
Claude will call:
{
"tool": "browse_events",
"page_number": 1,
"mode": "user"
}Ask Claude to view event details: "Show me event number 1"
Claude will call:
{
"tool": "get_event_detail",
"cache_number": 1
}Ask Claude to respond to event: "Accept event number 1"
Claude will call:
{
"tool": "manage_event_as_attendee",
"action": "accept",
"cache_number": 1
}🙌 Want to Support the Project?
If this helps you, please consider starring the repository.
It motivates ongoing development and helps others discover the tool.
� Complete MCP Tool Reference
Here's a comprehensive list of all available MCP tools with simple explanations:
🔐 Authentication & Settings
auth- Manage Microsoft Graph authentication (start, complete, refresh, logout)user_settings- Configure user preferences like timezone, search days, and page sizes
📧 Email Management
search_emails- Search or list emails by sender, subject, body, or time range. Supports Focused Inbox filtering (focused,other,all). Useend_date="now"to search from a specific date until current timebrowse_email_cache- Browse cached emails with pagination (user mode for humans, llm mode for AI analysis)get_email_content- Get full email content including attachments. Usereturn_html=trueto get full HTML bodysend_email- Send new emails, replies, or forwards with HTML supportmanage_emails- Move, delete, archive, flag, or categorize emailsmanage_mail_folder- Create, rename, delete, or move email folders
📅 Calendar Management
search_events- Search or list calendar events by subject or organizerbrowse_events- Browse cached calendar events with paginationget_event_detail- Get detailed information for specific eventsmanage_event_as_organizer- Create, update, cancel, forward, or email attendees for your own eventsmanage_event_as_attendee- Accept, decline, tentatively accept, propose new times, email attendees, or delete cancelled event invitationscheck_attendee_availability- Check availability for meeting scheduling
👥 People & Contacts
search_contacts- Find people in your organization by name or email
🔑 Key Workflow Patterns
Email Workflow:
search_emails- Load emails into cachebrowse_email_cache- Browse with appropriate mode (llmfor AI,userfor humans)get_email_content- View specific email detailssend_emailormanage_emails- Take action
Calendar Workflow:
search_events- Load events into cachebrowse_events- Browse eventsget_event_detail- View specific eventmanage_event_as_attendeeormanage_event_as_organizer- Take action
Authentication Workflow:
Try
authwithrefreshaction FIRST - if authenticated, proceedIf refresh fails (no token or expired):
authwithstart→ get verification URL and codeOpen URL in browser, enter the code, complete Microsoft login
authwithcompleteaction → authentication finished
Note: Refresh tokens are valid for ~90 days. Always try refresh first when authentication is needed.
All tools follow the JSON format with "tool": "tool_name" as the first parameter, making them easy to use with AI assistants like Claude.
Available Tools
15 toolsauthA
Manage authentication with Microsoft Graph. Four simple actions:
• 'start' - Start login flow, returns verification URL and code to enter in browser • 'complete' - Complete login after browser authentication (auto-loads device code) • 'check_status' - Check auth status: returns authenticated or need login • 'logout' - Clear all authentication tokens
WHEN AUTHENTICATION NEEDED: Always try 'check_status' FIRST. If it fails (no token or expired), then call 'start'.
WORKFLOW:
Call auth action='start' → get URL and code
Open URL in browser, enter the code, complete Microsoft login
Call auth action='complete' → authentication finished
AUTO-REFRESH: Access tokens auto-refresh when expired (no user action needed). Refresh tokens are valid for ~90 days.
Returns:
check_status: {status: string, authenticated: boolean, message: string}
start: {status: string, verification_uri: string, user_code: string, message: string}
complete: {status: string, authenticated: boolean, message: string}
logout: {status: string, authenticated: false, message: string}
Inputs: action (required).
browse_email_cacheA
Browse emails in the cache with pagination. Returns summary information with number column indicating position in cache. Use page_number to navigate. Automatically manages browsing state with disk cache for persistence. WORKFLOW: Use search_emails to load emails into the cache first. ATTACHMENT INFO: Each email now includes attachment details (id, name, size, contentType) so you can see what attachments are available before downloading. IMAGE ATTACHMENTS: When you see image attachments (contentType starts with 'image/'), use get_email_content to retrieve them. Image content will be included automatically for multimodal analysis (requires MULTIMODAL_SUPPORTED=true). You MUST then analyze the images - they often contain critical information not mentioned in text. Returns: {current_page: integer, total_pages: integer, count: integer, total_count: integer, emails: array (with attachments array), date_range: string, filter_date_range: string, timezone: string}.
Inputs: page_number (required), mode.
browse_eventsA
Browse calendar events in the cache with pagination. Returns summary information with number column indicating position in cache. Use page_number to navigate. Automatically manages browsing state with disk cache for persistence. WORKFLOW: Use search_events to load events into the cache first. Returns: {current_page: integer, total_pages: integer, count: integer, total_count: integer, events: array, date_range: string, timezone: string}.
Inputs: page_number (required), mode.
check_attendee_availabilityA
Check availability of attendees for a given date. WORKFLOW: Typically use before calling manage_my_event with create action to find optimal meeting times. Automatically includes the organizer (you) in the availability check to ensure overlap-free time slots. Automatically calculates time range based on all attendees' working hours. Returns: {success: boolean, message: string, availability_view: string, schedule_items: array, top_slots: array}. Availability view string uses single-character codes for each time interval: 0=Free, 1=Tentative, 2=Busy, 3=Out of office (OOF), 4=Working elsewhere, ?=Unknown. Note: Supports up to 20 attendees total (mandatory + optional).
Inputs: date (required), attendees (required), time_zone, top_slots, +3 more.
get_email_contentA
Get full email content by cache number. Use the cache number from browse_email_cache (e.g., 1, 2, 3) to retrieve complete email with body, attachments, and all details. Returns: {success: boolean, subject: string, from: string, to: array, cc: array, bcc: array, body: string, attachments: array, sent_date: string, received_date: string}. Note: Invalid cache_number returns appropriate error message. ATTACHMENT DOWNLOAD: Set download_attachments=true to download attachments to the workspace/attachments folder. Attachments are saved with their original names. Use attachment_names to download only specific attachments. IMAGE ATTACHMENTS: When an email has image attachments (contentType starts with 'image/'), image content will be included automatically for multimodal analysis (requires MULTIMODAL_SUPPORTED=true in config). IMPORTANT: If images appear in the response, you MUST analyze them immediately - they often contain critical information (screenshots, photos, diagrams, charts, instructions) not mentioned in the text body. Do NOT skip image analysis.
Inputs: cache_number (required), return_html, download_path, attachment_names, +1 more.
get_event_detailA
Get detailed information for a specific calendar event by its cache number. WORKFLOW: First call browse_events or search_events to get event list, then use this tool with cache number from results. Returns: Event object with id, subject, start, end, location, attendees, body, recurrence, and online meeting details. Note: Invalid cache_number returns appropriate error message.
Inputs: cache_number (required).
manage_emailsA
Manage emails with multiple actions. Supports moving, deleting, archiving, flagging, and categorizing emails. Actions include: move_single, move_all, delete_single, delete_multiple, delete_all, archive_single, archive_multiple, flag_single, flag_multiple, categorize_single, categorize_multiple. Returns: {success: boolean, message: string, moved_count: integer, failed_count: integer, errors: array}. Note: Invalid cache_number returns appropriate error message.
Inputs: action (required), categories, flag_status, cache_number, +3 more.
manage_event_as_attendeeA
Manage calendar events where you are an attendee (events organized by others). Actions: accept, decline, tentatively_accept, propose_new_time, delete_cancelled, email_attendees. WORKFLOW: Use cache_number from browse_events or search_events results. Returns: Response confirmation message with action status and updated event information. Note: If event is already responded to, returns appropriate error message. IMPORTANT: accept/decline/tentatively_accept/propose_new_time actions will automatically handle events where the organizer didn't request responses. For accept: updates the event to showAs='busy' and enables reminders. For tentatively_accept: updates the event to showAs='tentative' and enables reminders. For decline: deletes the event from your calendar. For propose_new_time: deletes the event from your calendar and instructs you to contact organizer directly (since proposals require responses). This matches Outlook's behavior. The delete_cancelled action is specifically for removing a CANCELLED event from your calendar (ONLY use when organizer has cancelled the event - do NOT use to decline invitations). The email_attendees action sends email to event attendees (to=required attendees, cc=optional attendees, organizer excluded from recipients).
Inputs: action (required), cache_number (required), cc, to, +6 more.
manage_event_as_organizerA
Manage calendar events where you are the organizer (events you created). Actions: create, update, cancel, forward, email_attendees. WORKFLOW: For update, cancel, forward, and email_attendees actions, use cache number from browse_events or returned when creating an event. Returns: Event object with id, subject, start, end, location, attendees, body, recurrence, and online meeting details. Note: Conflict errors may occur when updating event times that overlap with existing events.
Inputs: action (required), cc, to, end, +14 more.
manage_mail_folderB
Manage mail folders. Supports list, create, delete, rename, get_details, and move operations. Returns: {success: boolean, message: string, path: string, displayName: string, totalItemCount: integer, unreadItemCount: integer, childFolderCount: integer}. Note: Invalid folder paths return appropriate error messages.
Inputs: action (required), new_name, folder_name, folder_path, +2 more.
search_contactsA
FIND PEOPLE/CONTACTS ONLY. Search for people by name or email address in organization directory. Returns contact information (name, email, etc.). DO NOT use this to search email messages - use search_emails for that. Use this when you need to find information about a person, such as 'who is John Smith' or 'find contact with email john@company.com'. Default limit: 10. Note: If you encounter a rate limit error (429), the response will include a 'retry_after' field indicating how many seconds to wait before retrying. Returns: {success: boolean, contacts: array, count: integer, limit_reached: boolean, message: string, retry_after: integer (if rate limited)}.
Inputs: query (required).
search_emailsA
SEARCH EMAIL MESSAGES ONLY. Search or list email messages by keywords, sender, subject, or body. Returns matching email messages with summary information. DO NOT use this to find people/contacts - use search_contacts for that. If no search_type and query are provided, lists emails within the specified time range. All time parameters use your local timezone. PARAMETER PRECEDENCE (highest to lowest): 1) time_range (overrides all other time parameters), 2) start_date/end_date (overrides days), 3) days (used only if no other time parameters provided). IMPORTANT FOR OLD EMAILS: The 'days' parameter has a maximum limit (default 90 days). To search emails older than this limit, use start_date/end_date parameters instead - they have NO date range restriction and can search any historical emails. Example: start_date='2023-01-01', end_date='2023-12-31'. FOCUSED INBOX: By default, searches only 'focused' emails (Outlook's Focused Inbox). Use inference_classification='other' to search 'other' emails, or inference_classification='all' to search both. Returns: {success: boolean, emails: array, count: integer, date_range: string, filter_date_range: string, timezone: string}. Note: Rate limit errors (HTTP 429) return retry_after field with seconds to wait. Invalid folder paths return appropriate error messages.
Inputs: days, query, folder, end_date, +4 more.
search_eventsA
Search or list calendar events by keywords. Returns matching events with summary information. If no query is provided, lists events within the specified time range. All time parameters use your local timezone. When using time_range, the response includes a user-friendly display string (e.g., 'Today', 'This Week', 'This Month'). Returns: {success: boolean, events: array, count: integer, date_range: string, timezone: string}. Note: Subject search uses exact substring matching, organizer search uses fuzzy matching.
Inputs: query, end_date, start_date, time_range, +1 more.
send_emailA
Send emails directly without creating drafts. Supports three actions: 'send_new' to send a new email, 'reply' to reply to an existing email, and 'forward' to forward an existing email. All actions send emails immediately - no drafts are created. Supports multiple recipients, CC, and BCC. The htmlbody parameter accepts HTML format for rich email content. RECOMMENDED FOR BCC: Use bcc_csv_file parameter to provide BCC recipients from a CSV file - this is the preferred method for handling large BCC lists with automatic batching support (up to 500 recipients per batch by default). NOTE: For forward action, 'to' is optional when using 'bcc_csv_file' or 'bcc' - you can forward emails using only BCC recipients. Returns: {success: boolean, message: string, sent_count: integer, failed_count: integer, recipients: array}.
Inputs: action (required), htmlbody (required), cc, to, +5 more.
user_settingsA
Manage user settings with two actions: 'init' to initialize settings when configuration is missing or corrupted (requires multimodal_supported parameter to indicate if LLM supports image processing), 'update' to update one or more settings (supports partial updates). Note: 'init' action attempts to get user timezone from Graph API if authenticated, but works without login. 'update' action is purely local and requires no authentication. MULTIMODAL DETECTION: If you are a multimodal LLM that can process images, please set multimodal_supported=true when calling init or update.
Inputs: action (required), timezone, page_size, llm_page_size, +3 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 15 tools
Most tools have distinct purposes, but there is potential confusion between browse and search tools for emails and events. While descriptions clarify workflows, an agent might misuse browse vs search, causing some ambiguity.
All tool names follow a consistent snake_case pattern with descriptive verb_noun or noun_verb combinations. The naming is predictable and intuitive across the entire set.
15 tools is a well-scoped number for a server covering authentication, email, calendar, contacts, and settings. Each tool serves a clear function without being excessive or sparse.
The tool set covers core email and calendar operations thoroughly, including search, browse, manage, and send. However, it lacks contact creation/update/delete and other Graph features (e.g., users, groups, files), which are minor gaps.
Related MCP Connectors
Email, calendar and contacts for AI agents: Gmail, Microsoft 365 and IMAP accounts behind one API.
Gmail, Outlook, Drive, OneDrive and calendars for AI agents. Many accounts, one endpoint, audit log.
Connect Apple iCloud and Microsoft 365 mail, calendars, contacts and tasks to AI.
Permissioned access to Outlook, OneDrive and Teams via the user's own Microsoft account
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceConnects AI assistants to Microsoft 365 accounts to manage emails, calendars, files, and Teams messages. It offers 71 tools and supports multi-user environments through a secure, customizable server architecture.55-
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to interact with Microsoft 365 services (users, mail, calendar, files) via Microsoft Graph API.55 npm1MIT
- AlicenseBqualityCmaintenanceEnables AI assistants to manage Microsoft Outlook email and calendar through the Microsoft Graph API, including reading, sending, searching emails, and handling calendar events.4380 npm30MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to manage Microsoft 365 services like Outlook, Calendar, OneDrive, and Contacts through natural language commands, with support for multi-account and high-performance caching.23AGPL 3.0