Skip to content

Connect Outlook Mail to Claude: Route Emails Across Mailboxes

Learn how to build a managed MCP server for Outlook Mail to let Claude read, route, and reply to emails across your organization's mailboxes.

Uday Gajavalli Uday Gajavalli · · 9 min read
Connect Outlook Mail to Claude: Route Emails Across Mailboxes

If you need to connect Outlook Mail to Claude to automate inbox triage, manage executive communications, or route support emails across enterprise mailboxes, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's LLM tool calls and the Microsoft Graph API. You can either build, host, and maintain this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL in seconds. If your team uses ChatGPT, check out our guide on connecting Outlook Mail to ChatGPT or explore our broader architectural overview on connecting Outlook Mail to AI Agents.

Giving a Large Language Model (LLM) read and write access to a sprawling enterprise ecosystem like Microsoft 365 is an engineering challenge. You have to handle Azure AD OAuth 2.0 token lifecycles, map massive JSON schemas to MCP tool definitions, and deal with Microsoft's specific rate limiting quirks. Every time Microsoft updates an endpoint or alters a permission scope, you have to update your server code, redeploy, and test the integration.

This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Outlook Mail, connect it natively to Claude Desktop, and execute complex email routing workflows using natural language.

The Engineering Reality of the Outlook Mail API

A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools (via JSON-RPC 2.0 over standard HTTP transports), the reality of implementing it against the Microsoft Graph API is painful.

If you decide to build a custom MCP server for Outlook Mail, you own the entire API lifecycle. Here are the specific challenges you will face when forcing an LLM to interact directly with Graph:

OData Pagination Quirks The Microsoft Graph API uses OData, meaning pagination relies on the @odata.nextLink property. This property is often a massive, opaque URL containing complex skip tokens. If you expose this raw URL to Claude, the model will frequently attempt to parse it, modify the query parameters inside it, or hallucinate entirely new skip tokens. Truto normalizes this across all endpoints into a standard limit and next_cursor schema, explicitly instructing the LLM to pass cursor values back unchanged.

Complex Folder ID Resolution Outlook relies on a mix of well-known folder names (like inbox, sentitems, drafts) and Base64-encoded immutable folder IDs. LLMs struggle to know when to use a string literal versus when they need to first query the folder list to extract an ID. A managed MCP server helps bridge this gap by abstracting the lookup process and enforcing strict JSON schemas for path parameters.

MIME Types and Body Formatting Sending or updating a message in Outlook requires strictly defined JSON structures separating the Body into ContentType (Text or HTML) and Content. If an LLM tries to write a rich-text response but formats the JSON incorrectly or forgets to specify the MIME type, the Graph API rejects the payload. Truto's auto-generated tool schemas explicitly map these requirements so the model knows exactly how to construct the request.

Strict Rate Limiting Microsoft enforces strict throttling on the Graph API, returning 429 Too Many Requests when limits are exceeded. It is a factual note on rate limits: Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream API returns HTTP 429, Truto passes that error directly to the caller. However, Truto normalizes the upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. The caller (your AI agent or MCP client) is responsible for reading these headers and implementing its own retry and backoff logic.

How to Generate an Outlook Mail MCP Server

Truto dynamically generates MCP tools from the integration's underlying documentation and resources. Rather than hand-coding tool definitions, Truto reads the resource methods available for the Outlook Mail integration, applies your requested filters, and outputs a single, self-contained MCP server endpoint.

You can generate this server via the Truto UI or programmatically via the API.

Method 1: Via the Truto UI

This is the fastest method if you are manually setting up Claude Desktop for yourself or a small team.

  1. Navigate to the Integrated Accounts page in your Truto dashboard and select the connected Outlook Mail account.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration. You can name the server, filter by specific methods (like read or write), or filter by tool tags.
  5. Click Save and copy the generated MCP server URL.

Method 2: Via the Truto API

For developers embedding MCP generation into their own SaaS platforms or automating deployment pipelines, you can generate the server programmatically. The API validates the configuration, generates a secure token, and returns a ready-to-use URL.

Make a POST request to /integrated-account/:id/mcp:

curl -X POST https://api.truto.one/integrated-account/<integrated_account_id>/mcp \
  -H "Authorization: Bearer <your_truto_api_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Outlook Mail Router MCP",
    "config": {
      "methods": ["read", "write"],
      "require_api_token_auth": false
    }
  }'

The response contains your cryptographic token and the fully qualified MCP URL:

{
  "id": "mcp_abc123",
  "name": "Outlook Mail Router MCP",
  "config": { "methods": ["read", "write"] },
  "expires_at": null,
  "url": "https://api.truto.one/mcp/xyz987token..."
}

How to Connect the MCP Server to Claude

Once you have the Truto MCP server URL, you need to connect it to your LLM client. The URL encodes the specific integrated account, meaning it is fully self-contained.

Method 1: Via the Claude UI (Desktop/Web)

If you are using the consumer-facing Claude application, connecting the server takes less than a minute:

  1. Copy the MCP server URL from the Truto API response or dashboard.
  2. In Claude, navigate to Settings > Integrations > Add MCP Server (Note: If you are doing this in ChatGPT, the path is Settings > Connectors > Add).
  3. Paste the Truto MCP URL into the Server URL field.
  4. Click Add or Save.

Claude will immediately execute an initialize handshake and call tools/list to discover all available Outlook Mail capabilities.

Method 2: Via Manual Configuration File

If you are using Claude Desktop for local development or orchestrating an agent framework like LangGraph, you can configure the MCP server using the claude_desktop_config.json file. Truto's MCP servers communicate over HTTP using Server-Sent Events (SSE).

Locate your Claude config file:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Add the Truto server using the @modelcontextprotocol/server-sse transport wrapper:

{
  "mcpServers": {
    "truto_outlook_mail": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/xyz987token..."
      ]
    }
  }
}

Restart Claude Desktop. The model now has direct, authenticated access to the specific Outlook mailbox.

Hero Tools for Outlook Mail

When Claude connects to the Truto MCP server, it gains access to the fully mapped Outlook Mail API. Below are the highest-leverage tools exposed to the model.

outlook_mail_messages_list

Retrieves a list of messages from a specific folder (defaults to the Inbox). This tool abstracts the @odata.nextLink pagination into a standard limit and next_cursor model, allowing Claude to iterate through hundreds of emails without hallucinating parameters.

"Fetch the 20 most recent emails from my Inbox. If there are more pages, use the cursor to fetch the next batch."

outlook_mail_messages_get

Fetches the complete details of a specific email, including the full HTML or text body, sender metadata, and internet message headers. Essential for extracting context before drafting a reply.

"Get the full contents of the email with ID 'AAMkADh...', and summarize the client's main complaint."

outlook_mail_messages_send

Drafts and sends a brand new message. The model handles setting the target addresses, the subject, and structuring the ContentType properly based on the schema requirements.

"Send an email to engineering@example.com with the subject 'Deployment Status' letting them know the build passed."

outlook_mail_messages_forward

Forwards an existing message from the connected user's mailbox to one or more recipients. You can optionally include a comment that prepends the forwarded thread.

"Forward the billing alert email to finance@example.com and add the comment: 'Please review this overdue invoice immediately.'"

outlook_mail_messages_forward_as_user

Forwards an Outlook message from an explicitly selected mailbox user to one or more recipients. This is critical for enterprise setups where a service account manages multiple shared mailboxes (e.g., support@, sales@).

"Acting as support@example.com, forward the ticket escalation email to the tier-two engineering group."

outlook_mail_messages_reply

Replies to the sender of a specific message. The MCP schema automatically links the reply to the existing conversation thread, preventing broken email chains.

"Reply to the vendor's email confirming we received the contract, and CC legal@example.com."

To view the complete inventory of available Outlook Mail tools, detailed JSON schemas, and property definitions, visit the Outlook Mail integration page.

Workflows in Action

Exposing individual tools is only half the battle. The real power of connecting Outlook Mail to Claude comes from chaining these tools together to execute multi-step workflows. Here is how Claude handles complex scenarios.

Scenario 1: Automated Triage & Escalation

An IT operations manager needs an AI agent to monitor a shared "alerts@" mailbox, identify critical infrastructure warnings, and forward them to the specific on-call engineer with a summary.

"Check the alerts mailbox for the last 5 unread emails. Identify any emails mentioning 'database latency'. Summarize the error logs in those emails and forward them to oncall@example.com."

Step-by-step execution:

  1. Claude calls outlook_mail_messages_list using query parameters to filter for isRead=false and search for "database latency".
  2. For each relevant match, Claude calls outlook_mail_messages_get to retrieve the full body content containing the stack traces.
  3. Claude processes the text internally, generating a concise summary.
  4. Claude calls outlook_mail_messages_forward targeting oncall@example.com, injecting the AI-generated summary as the forwarding comment.

Result: The on-call engineer receives a forwarded alert that leads with a clean, 3-bullet summary of the issue, saving them from digging through raw log dumps.

Scenario 2: Executive Briefing Generation

A Chief of Staff wants Claude to review the CEO's inbox every morning, find emails from key board members, and compile a Markdown briefing document.

"Find all emails received since yesterday from 'boardmember@domain.com'. Read the full threads, then generate a markdown summary of the pending decisions and questions they have asked."

Step-by-step execution:

  1. Claude calls outlook_mail_messages_list with a filter on the receivedDateTime and from/emailAddress/address fields.
  2. Claude loops through the results, calling outlook_mail_messages_get to extract the full conversation history from each thread.
  3. Claude synthesizes the information into a structured Markdown document.
  4. Claude presents the final Markdown directly in the chat interface.

Result: The Chief of Staff gets an immediate, highly accurate digest of critical communications without manually searching the inbox.

Security and Access Control

When granting an LLM access to a corporate email environment, security is paramount. Truto provides several mechanisms to lock down the MCP server and enforce least-privilege access:

  • Method Filtering: Restrict the MCP server to read-only operations. By setting config.methods: ["read"] during creation, you guarantee the LLM can never send or delete an email, regardless of the prompt.
  • Tag Filtering: Group specific integration resources using tags. If you only want the model to access calendar events but not emails, you can filter by specific tags during server generation.
  • Expiration (expires_at): For temporary tasks, create ephemeral MCP servers. Set a strict ISO datetime, and Truto will automatically destroy the token and terminate access exactly when specified.
  • Additional Authentication (require_api_token_auth): By default, the URL is the only secret needed. For high-security environments, enable this flag to force the client to pass a valid Truto API token in the Authorization header, adding a second layer of identity verification.

Integrating Outlook Mail via a custom MCP server is a fast track to technical debt. By treating tools as dynamically generated, documentation-driven endpoints, you eliminate the maintenance burden of schema drift and API deprecations. You get the power of Microsoft Graph with the simplicity of a single URL.

FAQ

Does Truto automatically handle Outlook Mail rate limits?
No. Truto passes HTTP 429 Too Many Requests errors directly to the caller. However, Truto normalizes the upstream Microsoft Graph rate limit info into standardized IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) so your AI agent can implement accurate retry and backoff logic.
Can I restrict Claude to read-only access for Outlook Mail?
Yes. When generating the MCP server via the Truto UI or API, you can set the method filter to ["read"]. This ensures Claude can list and read emails, but tools for sending, forwarding, or deleting messages will not be exposed.
How does Truto handle Outlook Mail pagination for LLMs?
Truto abstracts Microsoft's complex @odata.nextLink pagination tokens into a standardized limit and next_cursor schema. The tool description explicitly instructs the LLM to pass the cursor back unchanged, preventing hallucinations.
How do I revoke an MCP server's access?
You can delete the server entirely via the Truto dashboard or API. Alternatively, you can set an expires_at datetime when creating the server, and Truto will automatically destroy the token and access at the specified time.

More from our Blog