The Outlook app provides read/write access to a Microsoft 365 mailbox — mail, calendar and contacts — through the Microsoft Graph REST API (v1.0). It can be consumed two ways: as a remote MCP server that Agent Factory agents call as tools, or as a Builder app whose instructions you call directly from DSUL. The MCP surface groups every operation into six entity tools (mail, mailFolders, calendars, events, contacts, contactFolders), each driven by an action argument, and runs in the tenant app-instance context (it resolves the installing workspace’s own credentials). Authentication is per-user and supports several modes:
- Per-user OAuth2 — central client (
oauthCentral, recommended) — one Microsoft Entra OAuth Application is registered once by the platform maintainer; every end user signs in with their own Microsoft account. Nothing to register per tenant: each workspace just installs the app and clicks Connect. - Per-user OAuth2 — tenant client (
oauth) — paste your own Entra application (client) ID/secret in the connector config app. Each user signs in with their own account against your client (PKCE authorization-code flow). - Application — client credentials (
clientCredentials) — an Entra app with application Graph permissions and admin consent, acting on a target mailbox without an interactive sign-in. Best for back-office / service automations. - Direct access token (
accessToken) — a caller-managed Microsoft Graph access token, used as-is with no exchange.
Read, search, draft, send, reply, forward and move messages and attachments; browse and manage mail folders
Calendar & contacts
List, create and update calendar events, respond to meeting invites and query a time window; manage personal contacts and contact folders
Flexible per-user auth
Per-user Microsoft Entra OAuth (central or tenant client), application client-credentials, or a direct access token
Who is this for?
This connector is used by three different roles. Jump to the section that matches yours — each one is self-contained.Agent builder
You build agents in Agent Factory and want them to read and act on Outlook mail, calendar and contacts. → Agent builder tab.
Platform admin
You run the platform and set up the shared Microsoft Entra OAuth client once for everyone. → Platform admin setup accordion below.
Workspace builder
You write Builder automations (DSUL) that call Outlook operations directly. → Workspace builder tab.
Prerequisites (Microsoft side)
- A Microsoft 365 account, and an Azure / Microsoft Entra ID tenant where you can register an application (or a maintainer who already did).
- An app registration in Microsoft Entra ID (Azure portal → App registrations), with a client secret created under Certificates & secrets.
- Microsoft Graph delegated permissions granted on the app (for the per-user OAuth modes), covering the resources you intend to use:
- Mail:
Mail.ReadWrite,Mail.Send - Calendar:
Calendars.ReadWrite - Contacts:
Contacts.ReadWrite - Sign-in / identity:
User.Read,openid,profile,offline_access
- Mail:
- For the application (client-credentials) mode instead, grant the equivalent application permissions and have a Global Administrator grant admin consent.
Platform admin (Governance) — one-time platform setup
Platform admin (Governance) — one-time platform setup
Goal: two one-time tasks — (1) configure the shared central Microsoft Entra OAuth client so every workspace lets its users sign in with their own Microsoft account, and (2) expose Outlook as a reusable capability in AI Governance so agent builders can pick it without pasting endpoint URLs.
1. Configure the connector
Register the OAuth Application in Microsoft Entra ID
In Microsoft Entra ID → App registrations > New registration, register a Web application. Add a Redirect URI pointing at the core workspace callback:(e.g.
https://api.studio.prisme.ai/v2/workspaces/08QVA1T/webhooks/oauthCallback on production).Add the Microsoft Graph delegated permissions listed in Prerequisites, create a client secret under Certificates & secrets, and note the Application (client) ID, the secret value, and the Directory (tenant) ID (or use common / organizations for multi-tenant).Enter the credentials through the configuration app
Open the central
outlook-next workspace and launch its Configuration app — <studio>/apps/outlook-next (e.g. https://studio.prisme.ai/apps/outlook-next), also linked as Configuration app on the installed instance. Switch to the maintainer view and follow the in-app instructions to paste the Client ID, Client Secret, Tenant and (optionally) scopes — the app stores them in the core workspace’s secrets for you. Do not edit Studio’s raw Secrets by hand. These credentials stay in the outlook-next workspace and are never exposed to tenants or end users; token exchange is proxied through the core centralTokenExchange webhook so the client secret never leaves the core workspace.2. Declare the capability in AI Governance
Generic connectors — broad tool surfaces meant to be shared across many agents, like Outlook — are best exposed as a named capability in AI Governance. Agent builders then enable that capability on their agents instead of pasting a raw MCP endpoint.Point it at the MCP endpoint
Set the capability’s MCP server URL to the connector’s MCP Endpoint, and set its Scope to:The
agent_id in the scope is what lets the connector identify and authorize the calling agent.Make it available to agent builders
Once created, the capability appears in the capability picker for agent builders in your organization, who enable it on their agents. Access to the catalog follows your organization’s existing roles; there is no per-capability role grant.
The connector’s configuration app also offers a one-click Add to catalog button (workspace owner / admin only) that publishes the Outlook capability to the organization-wide Capabilities catalog for you — the easiest way to expose it to agent builders without hand-editing Governance.
- Agent builder (Agent Factory)
- Workspace builder (DSUL)
Agent builder
Goal: let an agent you build in Agent Factory read and act on Outlook mail, calendar and contacts through MCP tools.Before an agent can call the connector, a Workspace builder must have installed and configured the Outlook app in a workspace (see the Workspace builder tab), and — for the central OAuth mode — a Platform admin must have provisioned the shared Microsoft Entra OAuth client (see the Platform admin setup accordion above).
agent_id that Agent Factory injects through the capability Scope, and that agent must appear in the connector’s authorized-agents allowlist (managed in the configuration app). The Microsoft Graph access token itself is resolved server-side from the configured auth mode.There are two ways to wire it up. Pick based on how much isolation you need.Option A — Enable the shared capability from the catalog
The fastest path: a Platform admin has already published an Outlook capability (see the Platform admin setup accordion above, §2), so you just pick it from the catalog. A workspace owner can publish it in one click with the config app’s Add to catalog button.Open your agent in Agent Factory
Open the agent you want to extend and go to its capabilities / tools.
Add the Outlook capability
Browse the capability catalog, select Outlook, and enable it. The MCP endpoint URL and the Scope (
context_id,agent_id,user_id) are already wired by the admin — nothing to paste, and the shared instance accepts every agent, so there is no allowlist step on your side.Convenient, but your agent runs against a shared, platform-managed instance: its Microsoft credentials are owned by someone else and the instance accepts every agent that is granted the capability. Prefer Option B for anything beyond quick experiments.
Option B — Run it from your own workspace (recommended)
For production agents, install the connector in your own workspace and point the agent at that workspace’s MCP endpoint.Install and configure the connector in your workspace
Follow the Workspace builder tab: install Outlook in your workspace, open its Configuration app, choose the auth mode and connect a Microsoft account.
Allowlist your agent
In that workspace’s config app, open Authorized agents and tick your agent (the Install capability button does this for you).
Add the MCP capability to your agent
In your agent, add a capability pointing at your workspace’s MCP Endpoint URL, and set its Scope to:The
agent_id is what lets the connector identify and authorize your agent — without it, every call is rejected with an explicit “agent could not be identified” message. This Scope is separate from the Microsoft Graph OAuth scopes.Brief the agent in its system prompt
Whichever option you pick, wiring the capability is not enough — the agent must know the MCP exists and when to use it. Copy-pasteable starter:Legacy AI Knowledge agents (no native MCP picker): add the connector under Advanced > Tools > MCP and paste the MCP Endpoint URL. The agent still has to be allowlisted in the config app and its identity propagated so the connector can read its
agent_id.Restricting to read-only (least privilege). Outlook tools cover both reads and writes (send mail, create/update events and contacts). The requested OAuth scopes are the grant, so the connector only ever obtains what the Scopes field in the configuration app asks for. To allow only read access, set a read-only scope list there, e.g.:With central OAuth (
oauthCentral) you do not create your own Entra client — keep oauthCentral and just enter the read-only scopes; your tenant scope overrides the platform default (the central app must expose these read permissions). Write calls (e.g. send mail) are then rejected by Microsoft Graph with 403 Forbidden. Note this is set at the workspace level — a workspace editor can widen it again; for a hard guarantee, use an Entra app limited to read permissions.Available Tools
Each tool takes anaction argument selecting the concrete operation, plus the per-action parameters. Omit userId to target the signed-in user (me).| Tool | Description |
|---|---|
mail | Outlook mail messages. Actions: list, get, create, update, delete, send, sendDraft, reply, replyAll, forward, move, listAttachments, getAttachment. |
mailFolders | Mail folders (well-known ids: inbox, drafts, sentitems, deleteditems). Actions: list, get, create, delete, listMessages, listChildFolders. |
calendars | Outlook calendars (default plus secondary). Actions: list, get, create, delete. |
events | Calendar events. Actions: list, view, get, create, update, delete, accept, decline, tentativelyAccept, listForCalendar. |
contacts | Personal contacts. Actions: list, get, create, update, delete. |
contactFolders | Contact folders. Actions: list, get, create, listContacts. |
Output Formats
Every tool accepts anoutputFormat argument that controls the MCP response shape:both(default) — the structured payload, with its JSON also rendered as text.verbose— a human-readable text view, optimized for LLM consumption.structured— concise machine-readable JSON instructuredContent.
Tool Details
| Parameter | Required | Description |
|---|---|---|
action | Yes | One of list, get, create, update, delete, send, sendDraft, reply, replyAll, forward, move, listAttachments, getAttachment. |
userId | No | Target mailbox; omit for the signed-in user (me). |
messageId | For get/update/delete/send actions on a message | Message id. |
attachmentId | For getAttachment | Attachment id. |
filter / orderby / search / select / top / skip | No | OData query options ($filter, $orderby, $search, $select, $top, $skip). |
body | For create/update/send/reply/forward/move | Resource fields, e.g. send → { message: { subject, body, toRecipients }, saveToSentItems }; reply → { comment }; move → { destinationId }. |
events
| Parameter | Required | Description |
|---|---|---|
action | Yes | One of list, view, get, create, update, delete, accept, decline, tentativelyAccept, listForCalendar. |
eventId | For get/update/delete/accept/decline/tentativelyAccept | Event id. |
calendarId | For listForCalendar | Calendar id (default calendar otherwise). |
startDateTime / endDateTime | For view | ISO 8601 window bounds (both required for the time-window view). |
body | For create/update | Event resource { subject, start, end, attendees, … }; for accept/decline → { comment, sendResponse }. |
contacts
| Parameter | Required | Description |
|---|---|---|
action | Yes | One of list, get, create, update, delete. |
contactId | For get/update/delete | Contact id. |
filter / orderby / search / top | No | OData query options. |
body | For create/update | Contact resource { givenName, surname, emailAddresses, … }. |
mailFolders
| Parameter | Required | Description |
|---|---|---|
action | Yes | One of list, get, create, delete, listMessages, listChildFolders. |
folderId | For get/delete/listMessages/listChildFolders | Folder id or well-known name (inbox, drafts, sentitems, deleteditems). |
body | For create | { displayName }. |
Error Handling
| HTTP code | Meaning |
|---|---|
400 | Bad request — invalid parameters or malformed body (e.g. bad OData filter, invalid event resource). |
401 | Unauthorized — the Microsoft Graph access token is missing, expired or revoked. The user must reconnect (OAuth modes). |
403 | Forbidden — insufficient Graph scope/permission, missing admin consent (application mode), or the account lacks access to the resource. |
404 | Not found — the message, folder, event, contact or calendar id does not exist or is not visible to the account. |
429 | Throttled — Microsoft Graph rate limit; back off and retry (honor Retry-After). |
500 / 503 | Microsoft Graph service error — transient; retry shortly, no reconnection needed. |
Common Issues
“This agent is not authorized to use this connector” — The calling agent is not in the allowlist. Open the configuration app → Authorized agents → tick this agent (or enable Allow all agents) and Save. “The calling agent could not be identified” — The MCP capability Scope does not declareagent_id, so Agent Factory never injects the agent identity. Set the Scope to context_id,agent_id,user_id on the capability, then allow the agent in the config app.
“Microsoft Graph is not connected for this user” — No per-user OAuth token. Open the configuration app (OAuth mode) and click Connect, or use the agent’s connect flow.
“Microsoft Graph token refresh failed … must reconnect” — The stored refresh token was revoked or expired (Microsoft Entra invalidated it, or it aged past its limit). The connection is dropped automatically; the user must reconnect from the config app.
“Microsoft Graph not authenticated” / “OAuth is not configured” — Neither a tenant OAuth client nor the central platform client is available. Set the client ID/secret/tenant in the config app, or ask the platform maintainer to provision the central Entra OAuth client.
client_credentials exchange failed — In application mode, check the Application (client) ID / secret, the tenant id, and that a Global Administrator granted admin consent for the application Graph permissions.
Microsoft Entra redirect URI rejected — Entra rejects a colon in the redirect URI path. Register the redirect URI with the workspace’s raw id (/workspaces/<workspace-id>/webhooks/oauthCallback), not the slug: form — copy the exact value from the config app.
External Resources
Microsoft Graph API
Official reference for the Outlook mail, calendar and contacts REST APIs.
Tool Agents
Learn how Agent Factory agents consume MCP tools in Prisme.ai.