Announcing CIMD support for MCP Client registration
Learn more

Outlook MCP vs API for AI Agents (2026)

TL;DR

  • Outlook MCP is Microsoft's Work IQ Mail and Work IQ Calendar servers, shipped under the Agent 365 platform. As of mid-2026 both are a preview feature, restricted to organizations with a Microsoft 365 Copilot license, and reachable only after an IT admin registers an enterprise app in Microsoft Entra. There is no version for personal Outlook.com or Hotmail accounts.
  • The tool surface is narrow by design: 10 mail tools and 11 calendar tools, with no contacts, no mail folders, no inbox rules, no attachments, and no Microsoft To Do coverage. The Graph API covers all of it.
  • Both paths run on Microsoft Entra ID OAuth, not an API key. The real headless split is Authorization Code Flow, used by both MCP and the API, versus Client Credentials Flow, admin-consented and app-only, available only on the Graph API. MCP has no service-account equivalent today.
  • Outlook service limits on the Graph API sit around 10,000 requests per 10 minutes and 4 concurrent requests per app per mailbox, inside a global cap of 130,000 requests per 10 seconds per app across all tenants. MCP tool calls ride the same quota, since Work IQ Mail and Work IQ Calendar are built directly on the Graph Mail and Calendar APIs.
  • Scalekit's Outlook connector builds on the Graph API path through your own Azure app registration, handles per-user token storage and refresh, and can expose the same tools as a scoped Virtual MCP server when your architecture calls for one. The MCP versus API decision does not change your credential infrastructure.

Your agent needs to read, search, and send mail, and manage a calendar in Outlook. Microsoft now ships two paths into that data: a preview MCP surface built for Microsoft 365 Copilot, and the Graph API your integration has probably called for years. They are not close substitutes. One is gated behind a Copilot license and an admin-registered enterprise app; the other is open to any developer with an Azure app registration, personal Outlook.com accounts included. Here is what each path actually gives your agent, and where the gap will bite in production.

Path
Access Model
Requirements
Work IQ MCP Preview
GATED — Copilot license required
Entra tenant, admin-registered app
Microsoft Graph API
OPEN — GA, any Azure app registration
Personal and organizational accounts

Both paths reach the same Outlook data. Work IQ MCP requires a Copilot license and an admin-registered app. The Graph API is open to any Azure app registration, personal accounts included.

What Outlook MCP and Outlook API actually are

Microsoft did not ship a single product called Outlook MCP. What exists is a pair of Microsoft-managed MCP servers scoped to mail and calendar, wrapped inside a much larger platform built for Copilot-licensed enterprises. The Graph API, by contrast, is the same general-purpose REST surface Outlook integrations have used since 2015. Establishing what each one actually is matters here more than usual, since the MCP surface is easy to mistake for a general-purpose Outlook MCP server when it is not.

Outlook MCP: Work IQ Mail and Work IQ Calendar

Outlook MCP ships under Microsoft's Agent 365 platform as part of Work IQ, the context layer behind Microsoft 365 Copilot. It is explicitly labeled a preview feature as of mid-2026, and Microsoft warns that tool names and parameters can change without notice while it stays in that state.

Two servers matter here: Work IQ Mail (mcp_MailTools) and Work IQ Calendar (mcp_CalendarTools). Both are built directly on the Microsoft Graph Mail and Calendar APIs, not a separate backend, which is part of why their behavior tracks the Graph API's own limits so closely.

Using either one requires a Microsoft 365 Copilot license. Coding-agent access from Claude Code, GitHub Copilot CLI, or VS Code requires an IT admin to register an enterprise application in Microsoft Entra ID and consent to the relevant mail or calendar permission first. Auth then runs per user through that registered app, via a browser redirect. Admins can allow or block each server tenant-wide from the Microsoft 365 admin center at any time, and tool call traces are inspectable in Microsoft Defender Advanced Hunting.

There is no personal Microsoft account support. This is an organizational-tenant, Copilot-licensed feature only, with no path for Outlook.com or Hotmail users.

Official docs: Work IQ MCP overview

Outlook API: Microsoft Graph

The Graph Mail and Calendar APIs are the REST surface behind Outlook, Exchange Online, and Exchange on-premises hybrid deployments. They are mature, explicitly versioned across v1.0 and beta, and documented independently of any AI use case.

Auth supports Authorization Code Flow for delegated, per-user, browser-consented access, Client Credentials Flow (RFC 6749) for app-only access with no user in the loop, and device code flow. Delegated permissions such as Mail.Read, Mail.ReadWrite, and Mail.Send are explicitly available for personal Microsoft accounts, not just work or school tenants.

The API covers mail, calendar, contacts, Microsoft To Do, mail folders, inbox rules, mailbox settings, attachments, and change notifications through the subscriptions resource. None of that is fully mirrored in the MCP tool set, which is the subject of the next section.

Official docs: Outlook mail API overview and Outlook calendar API overview

What each tool surface actually exposes

Before comparing the two paths conceptually, it helps to see the literal inventory. Work IQ Mail ships 10 tools. Work IQ Calendar ships 11. Everything else below lives only on the Graph API.

Feature Area
Microsoft Graph API
Work IQ MCP Preview
Mail (send, draft, reply)
Full surface
Work IQ Mail — 10 tools, signed-in user only
Calendar (create, update, RSVP)
Full surface
Work IQ Calendar — 11 tools, accepts a userId
Contacts
Yes
No
Mail folders
Yes
No
Inbox rules
Yes
No
Attachments
Yes
No
Microsoft To Do
Yes
No
Webhooks + delta sync
Yes
No
Personal + shared mailboxes
Yes
No

Work IQ Mail, the full tool list

The ten tools are createMessage, deleteMessage, getMessage, listSent, reply, replyAll, searchMessages, sendDraft, sendMail, and updateMessage.

The notable gap is that there is no generic "list inbox messages" tool. listSent only covers the Sent Items folder, so finding anything else has to go through searchMessages, which runs on the Microsoft Graph Search API with KQL-style queries. There is also no folder listing and no attachment retrieval, and every tool operates on the signed-in user's own mailbox only. None of the Mail tools accept a target user parameter.

Source: Work IQ Mail reference

Work IQ Calendar, the full tool list

The eleven tools are acceptEvent, cancelEvent, createEvent, declineEvent, deleteEvent, findMeetingTimes, getEvent, getSchedule, listCalendarView, listEvents, and updateEvent.

Calendar tools are less restrictive than Mail tools. Most accept an optional userId or userPrincipalName to act on another user's calendar, closer to a delegate or resource-booking pattern than anything Work IQ Mail offers. There is still no forwardEvent tool and no explicit multi-calendar listing.

Source: Work IQ Calendar reference

What only exists on the Graph API

Mail folders, inbox rules, mailbox settings and automatic replies, attachment download, contacts, Microsoft To Do task lists and tasks, shared and delegate mailbox access through /users/{id}/..., change notifications through subscriptions, and delta queries for incremental sync all live on the Graph API only. None of them appear as Work IQ Mail or Work IQ Calendar tools today, and nothing in Microsoft's own roadmap language suggests that gap is a temporary omission rather than a deliberate scope decision.

Comparing them where it matters for agents

With the literal tool inventory established, the comparison below follows four dimensions: capability, auth, operational ownership, and when each one wins.

What your agent can actually do

Capability
Outlook MCP (Work IQ)
Outlook API (Graph)
Send mail, draft, reply, reply all
Yes
Yes
Delete or update a message
Yes
Yes
List or browse inbox by folder
No, search only
Yes
Search mail with KQL or Graph Search
Yes
Yes
Mail folders
No
Yes
Attachments
No
Yes
Contacts
No
Yes
Inbox rules
No
Yes
Mailbox settings, automatic replies
No
Yes
Create, update, delete calendar events
Yes
Yes
Accept, decline, cancel invitations
Yes
Yes
Forward a calendar event
No
Yes
Find meeting times, free and busy
Yes
Yes
Act on another user's calendar
Partial, via a userId parameter
Yes, with delegate or app permission
Act on another user's mailbox
No
Yes, with Send As or Send on Behalf
Microsoft To Do tasks
No
Yes
Change notifications, webhooks
No
Yes
Personal Outlook.com or Hotmail accounts
No
Yes

Where the gap bites: anything beyond compose, reply, search, and calendar scheduling for the signed-in user lives exclusively on the Graph API. That is not a temporary limitation waiting on a roadmap item. Work IQ Mail and Work IQ Calendar were scoped deliberately to the conversational and scheduling surface Copilot needs, the same pattern Microsoft used across the rest of the Work IQ catalog for SharePoint, OneDrive, Teams, and Word.

The auth path each one puts you on

Both paths run on Microsoft Entra ID OAuth. Neither offers an API key option, which is a real difference from how this decision plays out for Slack or Salesforce. Understanding OAuth vs API keys for AI agents is essential before committing to either path.

MCP runs on per-user OAuth, gated by an admin. Work IQ MCP servers authenticate through an Entra enterprise app that an IT admin registers and consents to once per organization. Every individual user then goes through a browser-based OAuth flow before their agent can call mcp_MailTools or mcp_CalendarTools. Admins can block a server tenant-wide from the Microsoft 365 admin center at any time, and that takes effect for every user and every agent immediately.

The API adds Client Credentials Flow for headless agents. The Graph API supports the same Authorization Code flow for delegated, per-user access, plus Client Credentials Flow (RFC 6749) for service-to-service, admin-consented, app-only access with no user in the loop. This is the real headless path, and it has no MCP equivalent today. Nothing in the Work IQ MCP documentation describes a service-account or unattended-agent identity for either server.

Flow
Supported By
Notes
Authorization Code Flow
Work IQ MCP + Graph API
User signs in, browser present, per-user token issued
Client Credentials Flow
Graph API only
App registration, no user present, admin consent one time, app-only token — no MCP equivalent

Personal accounts are Graph-only. Delegated permissions like Mail.Read, Mail.ReadWrite, and Mail.Send are explicitly available for consent on personal Microsoft accounts, according to Microsoft's own permissions reference. Work IQ MCP is not; it is scoped to Copilot-licensed organizational tenants only. If your agent needs to serve consumer Outlook.com users, the API is the only path that exists.

What you own in production

Rate limits are shared, not separate. Outlook Graph service limits sit around 10,000 requests per 10 minutes and 4 concurrent requests per app per mailbox, inside a global ceiling of 130,000 requests per 10 seconds per app across all tenants. Because Work IQ Mail and Work IQ Calendar call the same Graph Mail and Calendar APIs internally, MCP tool calls consume the same quota. Choosing MCP does not buy a separate rate budget.

MCP is explicitly unstable while in preview. Microsoft states plainly that Work IQ MCP tool names and parameters can change without notice, and advises against hardcoded dependencies. The Graph API is explicitly versioned instead; you pin v1.0 and migrate on your own schedule. For a production pipeline, that is a meaningful difference in what breaks unannounced. This instability is one reason MCP can be more expensive than CLI in certain production contexts.

Governance versus adapter code. The Microsoft 365 admin center gives Work IQ MCP centralized allow and block control with no adapter code required. The Graph API gives you nothing for free here; you own endpoint versioning, throttling and retry logic per resource, and token lifecycle handling yourself.

When to use MCP, when to use the API

Use Outlook MCP (Work IQ) when:

  • Your organization already has Microsoft 365 Copilot licensing in place, and centralized MCP governance through the admin center is a requirement, not a nice-to-have
  • You are building inside Microsoft's own surfaces, Copilot Studio or Microsoft Foundry, or a coding agent such as Claude Code, GitHub Copilot CLI, or VS Code that a licensed, interactively present user is running
  • Your use case is limited to what is actually exposed today: compose, reply, search mail, and create or manage calendar events for the signed-in user

Use the Outlook API (Graph) when:

  • Your agent runs headless or on a schedule; Client Credentials Flow is the only unattended path and MCP does not support it
  • You need contacts, mail folders, inbox rules, mailbox settings, attachments, Microsoft To Do, or shared and delegate mailbox access, none of which exist as MCP tools
  • You are building for personal Outlook.com or Hotmail users, or for organizations without Microsoft 365 Copilot licensing
  • You need webhook-driven change notifications or delta sync instead of polling a search tool

The credential problem that exists on both paths

Both paths ultimately hand your agent an Entra ID OAuth token scoped to one user. Neither one gives you a vault, proactive refresh, or a revocation workflow; that infrastructure is identical regardless of which path you pick.

In a multi-tenant B2B agent serving Outlook across dozens of organizations, that means one OAuth token per user to store encrypted, refresh before expiry, and revoke the moment someone leaves. The registered Entra app itself, whether it backs Work IQ MCP or a direct Graph API integration, is a single shared client; the tokens issued through it are what need per-user isolation. Admin-side revocation, disabling a user in Entra, does not retroactively invalidate a token your infrastructure cached past its lifetime. You still have to check.

Handling token refresh for AI agents at scale requires dedicated infrastructure — a secure vault, proactive rotation, and per-user isolation. Scalekit's Outlook connector resolves the per-user token on every tool call against its own encrypted vault, so the credential layer is identical whether your agent calls Outlook through Scalekit's Graph-backed tools directly or through a Scalekit Virtual MCP server built on top of them.

Building Outlook agents with Scalekit

Scalekit's Outlook connector is built on the Graph API path described above, using your own Azure app registration, not a proxy of Microsoft's Work IQ MCP servers. That distinction matters in practice: personal Microsoft accounts work, headless service patterns are possible through the same connection, and the tool surface is not limited to the 21 tools Work IQ ships today. Scalekit can also re-expose that same tool set as a scoped MCP endpoint through Virtual MCP Servers when your architecture wants one.

Connect the Outlook connector

Set the connection up once. In the Scalekit dashboard, go to AgentKit, then Connections, then Create Connection, search for Outlook, and copy the generated redirect URI. In the Azure portal, register an app under Microsoft Entra ID, App registrations. Under Supported account types, choose accounts in any organizational directory and personal Microsoft accounts, so consumer Outlook.com users are not locked out, and paste the Scalekit redirect URI as a Web redirect.

Copy the Application (client) ID and generate a client secret under Certificates and secrets. Back in Scalekit, paste the client ID and secret into the Outlook connection, then select the Graph scopes your agent needs, for example Mail.Read, Mail.ReadWrite, Mail.Send, Calendars.ReadWrite, Contacts.ReadWrite, and offline_access. See the Microsoft Graph permissions reference for the full list.

Install the SDK and authorize a user:

pip install scalekit
import os from scalekit.client import ScalekitClient from dotenv import load_dotenv load_dotenv() scalekit_client = ScalekitClient( env_url=os.getenv("SCALEKIT_ENV_URL"), client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), ) actions = scalekit_client.actions connection_name = "outlook" identifier = "user_123" link_response = actions.get_authorization_link( connection_name=connection_name, identifier=identifier, ) print("Authorize Outlook:", link_response.link) input("Press Enter after authorizing...") result = actions.execute_tool( tool_name="outlook_list_calendar_events", tool_input={}, connection_name=connection_name, identifier=identifier, ) print(result)

Call Outlook tools from LangChain

Scalekit ships a native LangChain adapter, so there is no manual tool-wrapping step. identifier should be the same stable value, an email or user ID, that the user authorized the connection with.

from scalekit.client import ScalekitClient from langchain.agents import create_react_agent scalekit_client = ScalekitClient(env_url=env_url, client_id=client_id, client_secret=client_secret) actions = scalekit_client.actions tools = actions.langchain.get_tools( identifier="user_123", connection_names=["outlook"], page_size=100, # avoid truncating a connector with many tools ) agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)

Call Outlook tools from the Claude Agent SDK

For frameworks without a native Scalekit adapter, pull scoped tool schemas directly and pass them to the model's own tool-calling API.

import os from scalekit.client import ScalekitClient from anthropic import Anthropic scalekit_client = ScalekitClient( env_url=os.getenv("SCALEKIT_ENV_URL"), client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), ) actions = scalekit_client.actions anthropic_client = Anthropic() identifier = "user_123" tools_response = actions.tools.list_scoped_tools( identifier=identifier, filter={"connection_names": ["outlook"]}, page_size=100, ) llm_tools = [ {"name": t.name, "description": t.description, "input_schema": t.input_schema} for t in tools_response.tools ] message = anthropic_client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, tools=llm_tools, messages=[{"role": "user", "content": "Summarize my unread emails from this week."}], ) for block in message.content: if block.type == "tool_use": result = actions.tools.execute_tool( tool_name=block.name, identifier=identifier, params=block.input, ) print(result.data)

Call Outlook tools from Google ADK

Google ADK is MCP-native, so the fastest path is Scalekit's hosted MCP endpoint for the connector rather than a framework-specific adapter.

import { Agent } from "@google/adk/agents"; import { MCPToolset, StreamableHTTPConnectionParams, } from "@google/adk/tools/mcp"; const toolset = new MCPToolset({ connectionParams: new StreamableHTTPConnectionParams({ url: "https://mcp.scalekit.com/outlook", headers: { Authorization: `Bearer ${userScopedToken}` }, }), }); const agent = new Agent({ name: "outlook-agent", model: "gemini-2.0-flash", tools: await toolset.getTools(), });

Call Outlook tools from Mastra

Mastra's MCPClient connects to any Streamable HTTP MCP endpoint, so the pattern reuses the same Scalekit MCP URL, scoped with a per-user bearer token.

import { MCPClient } from "@mastra/mcp"; import { Agent } from "@mastra/core/agent"; import { openai } from "@ai-sdk/openai"; const mcp = new MCPClient({ servers: { outlook: { url: new URL("https://mcp.scalekit.com/outlook"), requestInit: { headers: { Authorization: `Bearer ${userScopedToken}` }, }, }, }, }); const agent = new Agent({ name: "outlook-assistant", instructions: "You triage and draft Outlook email and calendar actions for the current user.", model: openai("gpt-4o"), tools: await mcp.getTools(), });

Call Outlook tools from CrewAI

Wrap execute_tool in a BaseTool subclass so a CrewAI agent can call it like any other tool.

from typing import Type from crewai.tools import BaseTool from pydantic import BaseModel, Field from scalekit.client import ScalekitClient scalekit_client = ScalekitClient(env_url=env_url, client_id=client_id, client_secret=client_secret) class SendOutlookMailInput(BaseModel): subject: str = Field(..., description="Email subject line") body: str = Field(..., description="Email body content") to_recipients: list[str] = Field(..., description="Recipient email addresses") class SendOutlookMailTool(BaseTool): name: str = "send_outlook_mail" description: str = "Send an email through the current user's Outlook mailbox." args_schema: Type[BaseModel] = SendOutlookMailInput def _run(self, subject: str, body: str, to_recipients: list[str]) -> str: result = scalekit_client.actions.execute_tool( tool_name="outlook_send_message", tool_input={"subject": subject, "body": body, "toRecipients": to_recipients}, connection_name="outlook", identifier="user_123", ) return str(result.data)

Expose Outlook as a Virtual MCP server for multi-tenant agents

For multi-tool, multi-tenant agents, define the Virtual MCP server once per agent role and mint a short-lived session token per run, instead of managing a static MCP connection per user. This pattern is explained in depth in our guide on how tool calling auth changes when you move from single-tenant to multi-tenant.

import os from datetime import timedelta from scalekit import ScalekitClient from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENV_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) # Set up once per agent role, not once per user vmcp_response = scalekit_client.actions.mcp.create_config( name="outlook-triage-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="outlook", tools=["outlook_list_messages", "outlook_search_messages", "outlook_reply_to_message"], ), ], ) config_id = vmcp_response.config.id mcp_server_url = vmcp_response.config.mcp_server_url # Run before every agent session accounts_response = scalekit_client.actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier="user_123", include_auth_link=True, ) for account in accounts_response.connected_accounts: if account.connected_account_status != "ACTIVE": print(f"{account.connection_name} needs auth: {account.authentication_link}") token_response = scalekit_client.actions.mcp.create_session_token( mcp_config_id=config_id, identifier="user_123", expiry=timedelta(hours=1), ) mcp_server = { "url": mcp_server_url, "headers": {"Authorization": f"Bearer {token_response.token}"}, }

One Virtual MCP server definition serves every tenant. Each agent run mints a short-lived session token bound to that user's own vaulted Outlook connection, so no user can reach another user's mailbox through a shared endpoint.

The server definition is static and shared across every tenant; only the session token changes per user and per run, which is what keeps a multi-tenant Outlook agent from needing one MCP connection string per customer.

Why build Outlook agents on Scalekit

The comparison above is about Microsoft's two paths into Outlook. This section is about what changes once Scalekit sits underneath either of them.

Per-tool auth logs, not just token storage

Every execute_tool call against the Outlook connector is logged with the user who authorized it, the tool that ran, and the result, queryable for 90 days. That is the audit trail a security review asks for when an agent can send mail or move a calendar event on someone's behalf, and it exists whether your agent calls Outlook directly through execute_tool or indirectly through a Virtual MCP server. Per-tool audit trails for agent auth are increasingly non-negotiable in enterprise deployments.

Virtual MCP for multi-tool, multi-tenant agents

Standard MCP servers expose every tool they have. A Virtual MCP server scoped to outlook_list_messages, outlook_search_messages, and outlook_reply_to_message means a triage agent physically cannot call outlook_delete_message, regardless of what the model decides to attempt mid-conversation. One server definition serves every tenant; a short-lived session token, minted per run, is what carries per-user identity, so you are not standing up one MCP connection per customer to get isolation.

One connector today, the same auth stack tomorrow

The Azure app registration and Graph scopes are specific to Outlook, but the token vault, per-user resolution, and audit logging are not. Adding Slack, Gmail, or Salesforce alongside Outlook reuses the same execute_tool and Virtual MCP pattern rather than a new OAuth implementation per connector.

Which one to build against

If your organization already has Microsoft 365 Copilot licensing, your agent is interactive, and the job is limited to composing mail, replying, searching, and managing calendar events for a signed-in user, Work IQ MCP is the lower-effort path today, with centralized governance built in. If your agent runs headless, needs contacts, folders, rules, attachments, or To Do, or has to serve a single personal Outlook.com user, build against the Graph API directly; there is no MCP alternative for any of that yet.

Most production Outlook agents will eventually need both the interactive surface and the operational one. The credential problem, per-user tokens with no built-in vault or revocation flow, is identical either way, and that is what needs production-grade infrastructure regardless of which Microsoft path you choose.

Browse the Scalekit Outlook connector: scalekit.com/connectors/outlook

Outlook connector docs and full tool list: docs.scalekit.com/agentkit/connectors/outlook

Building an Outlook agent and want to talk through the architecture? Join the Scalekit community on Slack or talk to us directly.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.