Skip to content

Connect Outlook Calendar to Claude: Sync Schedules and Availability

Learn how to connect Outlook Calendar to Claude using an MCP server. Automate event creation, schedule syncs, and availability checks with AI agents.

Uday Gajavalli Uday Gajavalli · · 10 min read
Connect Outlook Calendar to Claude: Sync Schedules and Availability

If you need to connect Outlook Calendar to Claude to automate meeting creation, check team availability, or orchestrate complex executive scheduling workflows, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's tool calls and Microsoft's Graph API. You can either build and maintain this infrastructure yourself, or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL.

If your team uses ChatGPT, check out our guide on connecting Outlook Calendar to ChatGPT or explore our broader architectural overview on connecting Outlook Calendar to AI Agents.

Giving a Large Language Model (LLM) read and write access to a sprawling enterprise ecosystem like Microsoft 365 is a significant engineering challenge. You have to handle complex OAuth 2.0 token lifecycles against the Microsoft identity platform, map massive, deeply nested JSON schemas to MCP tool definitions, and deal with Graph API's highly specific error formats and rate limits. Every time Microsoft updates an endpoint, 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 Calendar, connect it natively to Claude, and execute complex scheduling workflows using natural language.

The Engineering Reality of the Microsoft Graph 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, the reality of implementing it against Microsoft's APIs is painful. You are not just integrating "a calendar" - you are integrating the Microsoft Graph API, a monolithic interface that requires highly specific request structures.

If you decide to build a custom MCP server for Outlook Calendar, you own the entire API lifecycle. Here are the specific challenges you will face:

Opaque Pagination and Delta Links Microsoft Graph uses opaque URLs for pagination, typically returned as @odata.nextLink. If you expose these raw parameters to Claude, the model will frequently hallucinate token values, try to append its own query parameters, or misunderstand how to iterate through pages. Additionally, syncing changes requires handling @odata.deltaLink to fetch incremental updates. Truto normalizes this across all endpoints into a standard limit and next_cursor schema. The tool schema explicitly instructs the LLM to pass cursor values back exactly as received, preventing parameter hallucination.

Strict Timezone and Recurrence Rule Formats The Graph API is unforgiving when it comes to timezones. An event cannot simply be created with an ISO string. It requires explicitly mapped originalStartTimeZone and originalEndTimeZone fields using specific Windows or IANA timezone names. Furthermore, expanding recurring events requires querying specific views rather than the standard event list. Exposing this raw complexity to an LLM usually results in malformed requests. A managed MCP server handles the schema translation so Claude knows exactly which nested fields are required.

Harsh Rate Limits and Throttling Limits Microsoft enforces strict throttling limits across the Graph API (often capping at 10,000 requests per 10 minutes per app per tenant). If an AI agent attempts to iterate through months of calendar data without pacing itself, Microsoft will return an HTTP 429 Too Many Requests error.

It is critical to note how Truto handles this: Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Graph API returns a 429, Truto passes that error directly to the caller. However, Truto normalizes the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. The caller - your agent framework or Claude - is strictly responsible for interpreting these headers and executing its own retry and backoff logic. Truto will not absorb these errors for you.

Instead of building out all this normalization from scratch, you can use Truto to expose Outlook Calendar's endpoints as ready-to-use MCP tools.

How to Generate an Outlook Calendar MCP Server with Truto

Truto's MCP architecture is dynamic and documentation-driven. Rather than hand-coding tool definitions, Truto derives them from the integration's resource definitions and human-readable documentation. If an endpoint is documented in Truto, it automatically becomes an available tool.

Each MCP server is scoped to a single connected Outlook Calendar account. The generated server URL contains a cryptographic token that encodes the account, what tools are exposed, and when the server expires.

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

Method 1: Via the Truto UI

For quick testing and manual agent setup, the UI is the fastest path.

  1. Navigate to the Integrated Accounts page in your Truto dashboard and select your connected Outlook Calendar account.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration (e.g., name, allowed methods, tags, expiry).
  5. Click Create and copy the generated MCP server URL.

Method 2: Via the Truto API

For production workflows where you are provisioning agents dynamically for your users, you should generate the MCP server via the Truto API. The API validates the configuration, generates a secure hashed token, and returns a ready-to-use URL.

Endpoint: POST /integrated-account/:id/mcp

// Example: Creating a read-only MCP server for an AI assistant
const response = await fetch('https://api.truto.one/integrated-account/ia_abc123/mcp', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${TRUTO_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: "Executive Assistant Calendar Access",
    config: {
      methods: ["read"] // Restrict to GET and LIST operations
    },
    expires_at: "2026-12-31T23:59:59Z"
  })
});
 
const data = await response.json();
console.log(data.url); // https://api.truto.one/mcp/a1b2c3d4e5f6...

Connecting the MCP Server to Claude

Once you have your Truto MCP URL, you need to connect it to your Claude environment. All communication happens over HTTP POST with JSON-RPC 2.0 messages.

Method A: Via the Claude UI (or ChatGPT UI)

If you are using the web interfaces:

  • For Claude: Go to Settings -> Integrations -> Add MCP Server. Paste the Truto URL and click Add.
  • For ChatGPT (Developer Mode): Go to Settings -> Apps -> Advanced settings -> Custom connectors. Paste the URL and click Add.

The model will immediately send an initialize request to the URL, discover the capabilities, and list the available tools.

Method B: Via Manual Config File (Claude Desktop)

If you are running Claude Desktop locally, you configure it via the JSON configuration file. Because Truto's MCP servers are remote HTTP endpoints, you use the standard Server-Sent Events (SSE) transport wrapper provided by the MCP specification.

Update your claude_desktop_config.json file:

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

Restart Claude Desktop. You will see a new hammer icon indicating that the Outlook Calendar tools are available.

Outlook Calendar Hero Tools for Claude

When Claude lists the tools available on the Truto MCP server, it parses the injected JSON schemas. Below are the highest-leverage hero tools for Outlook Calendar workflows.

(Note: Truto auto-generates snake_case names based on the integration label and resource).

list_all_outlook_calendar_free_busy

Description: Gets free/busy availability information for users, distribution lists, or resources for a specified time period. Context: This is the most critical tool for scheduling. Unlike fetching the raw events, this endpoint abstracts the details and simply returns scheduleItems indicating blocked time slots. It requires id, schedules, startTime, and endTime.

"I need to schedule a 45-minute sync between myself and sarah@example.com for tomorrow. Use the free/busy tool to check our availability between 9 AM and 5 PM EST, find the first overlapping open slot, and suggest it to me."

create_a_outlook_calendar_event

Description: Creates an event in the specified user's calendar. Context: Handles complex nested objects, including attendees (with types like 'required' or 'optional') and physical or online locations. The MCP schema automatically instructs Claude on how to format the timezone strings to satisfy Graph API requirements.

"Create an event called 'Q3 Roadmap Review' for tomorrow at 2 PM EST. It should last for one hour. Add john@example.com and sarah@example.com as required attendees. Make sure it includes an online meeting link."

list_all_outlook_calendar_calendar_view

Description: Gets the occurrences, exceptions, and single instances of events in a calendar view for a specified time range. Context: This tool is strictly superior to the standard event list tool if you need an accurate picture of a specific day. It automatically expands recurring events into actual instances so the LLM doesn't have to parse complex iCal recurrence rules.

"Pull my calendar view for today. Summarize my meetings, tell me how much uninterrupted focus time I have between events, and list any meetings where I am the organizer."

update_a_outlook_calendar_event_by_id

Description: Updates properties of an existing event by its ID. Context: Used for rescheduling, adding attendees, or changing meeting details. Since Graph API requires patch operations, Claude will construct a partial JSON payload with just the altered fields (e.g., updating start and end times).

"Find the 'Marketing Sync' meeting on my calendar for tomorrow and push it back by one hour. Make sure to update the end time accordingly so the duration remains the same."

list_all_outlook_calendar_events

Description: Lists raw events in the user's mailbox. Context: Best used for broad queries, finding specific historical meetings, or auditing organizer data. It returns HTML body previews, attendees, and location data.

"Search my recent calendar events for the last two weeks and find the meeting I had with the vendor 'Acme Corp'. Tell me who else from our team attended that meeting."

get_single_outlook_calendar_event_by_id

Description: Gets full event details by its specific ID. Context: Used when Claude has previously retrieved a list of events and needs the complete payload of a single event, including the full HTML body or specific meeting provider details.

"Get the full details for the event ID AAMkAGI2... summarize the meeting agenda found in the description body, and extract the Microsoft Teams join link."

For a complete inventory of available resources, endpoints, and schema details, see the Outlook Calendar integration page.

Workflows in Action

Connecting tools is only half the battle. The real power of an MCP server is orchestrating multi-step workflows. Here is how Claude executes complex tasks using the Truto Outlook Calendar MCP server.

Scenario 1: The Intelligent Scheduler

Scheduling a meeting across multiple busy calendars is a notoriously difficult multi-step process for AI agents. With access to the free/busy endpoint, Claude can handle it autonomously.

"I need to schedule a technical review with the engineering leads (alex@domain.com, david@domain.com). Check our availability for next Tuesday. Find a 60-minute slot where we are all free, and then create the calendar invite titled 'Architecture Review'."

Execution Steps:

  1. Tool Call: list_all_outlook_calendar_free_busy - Claude constructs a payload containing the current user's email, Alex's email, and David's email in the schedules array, setting the startTime and endTime for next Tuesday.
  2. Analysis: Claude parses the returned scheduleItems array for all three users, calculates the overlaps, and identifies a 60-minute block (e.g., 2:00 PM to 3:00 PM) where no events exist.
  3. Tool Call: create_a_outlook_calendar_event - Claude issues a request with subject: "Architecture Review", sets the start and end times using the identified slot and required timezones, and adds Alex and David to the attendees array as required.

Result: The user gets a confirmation message that the meeting has been scheduled and the invites have been dispatched by Microsoft Graph, all without leaving the chat interface.

Scenario 2: The Daily Executive Briefing

Executives need quick context on their day, especially regarding who they are meeting with and if there are any immediate conflicts.

"Give me a briefing on my schedule for today. Flag any back-to-back meetings that might cause me to run late, and tell me if I have any meetings with external domains."

Execution Steps:

  1. Tool Call: list_all_outlook_calendar_calendar_view - Claude requests the calendar view for the current day (00:00 to 23:59). Using calendar_view ensures recurring events are properly expanded.
  2. Analysis: Claude iterates through the returned events list. It compares the end time of one event to the start time of the next to identify back-to-back blocks.
  3. Analysis: Claude examines the attendees array for each event, comparing the email addresses against the user's internal domain to flag external participants.

Result: The user receives a concise, formatted summary: "You have 5 meetings today. You have a tight transition at 1:00 PM as 'Product Sync' ends exactly when 'Vendor Pitch' begins. Note that 'Vendor Pitch' includes three external attendees from acme.com."

Scenario 3: Automated Rescheduling

When conflicts arise, the agent can handle the tedious task of moving an event and notifying participants.

"I can't make the 'Design Huddle' at 3 PM today. Push it to tomorrow at the same time."

Execution Steps:

  1. Tool Call: list_all_outlook_calendar_calendar_view - Claude searches today's events to find the exact event ID matching "Design Huddle".
  2. Tool Call: update_a_outlook_calendar_event_by_id - Claude uses the retrieved ID to send a PATCH request, updating the start and end datetime objects by adding 24 hours, keeping the timezones intact.

Result: The calendar event is updated, and Microsoft Graph automatically sends the updated invitation to the attendees.

Security and Access Control

Exposing enterprise email and calendar data to an LLM requires strict access control. Because MCP client connections happen via HTTP POST, you must ensure that your agent can only execute authorized actions. Truto provides several mechanisms to lock down your Outlook Calendar MCP servers:

  • Method Filtering: You can explicitly restrict a server to read-only access. By setting config: { methods: ["read"] } during creation, Truto filters out create, update, and delete tools. Claude will physically not be able to see or call the create_a_outlook_calendar_event tool.
  • Tag Filtering: Resources in Truto are tagged (e.g., calendar, email, contacts). You can restrict the MCP server using config: { tags: ["calendar"] } to ensure the agent cannot accidentally access the user's email inbox if the integration happens to support both.
  • API Token Authentication (require_api_token_auth): By default, possessing the MCP URL is enough to connect. For high-security environments, enabling this flag requires the MCP client to also pass a valid Truto API token in the Authorization header, providing a secondary layer of authentication.
  • Auto-Expiration (expires_at): For temporary workflows (e.g., granting a contractor's AI agent access for a one-week sprint), you can set an ISO datetime. Truto's Durable Object alarms will automatically clean up the server and its KV store entries when the time expires.

Moving Past Manual Integration Code

Building a custom Microsoft Graph integration for an AI agent is a massive detour from your core product roadmap. You end up spending engineering cycles maintaining OAuth flows, deciphering undocumented Graph API behaviors, and normalizing pagination tokens just to let an LLM read a schedule.

By using a managed MCP server architecture, you abstract the entire integration layer. Truto handles the authentication persistence, derives tool schemas directly from current documentation, and exposes normalized JSON-RPC endpoints. You get to focus purely on the agent's prompt engineering and workflow orchestration.

FAQ

How does Claude handle Outlook Calendar's Graph API pagination?
Microsoft Graph uses opaque @odata.nextLink URLs for pagination. Truto's MCP server normalizes this into a standard limit and next_cursor schema, instructing Claude to pass the cursor back unchanged, preventing hallucinated query parameters.
Does Truto automatically retry API calls if Outlook Calendar rate limits are hit?
No. Truto passes HTTP 429 Too Many Requests errors directly back to the caller. It normalizes the rate limit information into standard headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset), leaving the retry and backoff logic to the AI agent.
Can I restrict Claude to only read events from Outlook Calendar?
Yes. When generating the MCP server URL, you can apply method filtering (e.g., config: { methods: ["read"] }). This ensures Claude can only list or get events, preventing any accidental write, update, or delete operations.

More from our Blog