Microsoft 365

Live

OAUTH 2.0

PRODUCTIVITY

Productivity

Give your agent per-user access to email, calendar, files, and Teams — with every call scoped and audited to the real user.

  • Acts as the user. Reads mail, events, and files with the signed-in user's delegated permissions — no shared service account.
  • Credentials stay vaulted. OAuth tokens stored AES-256, resolved at request time, never exposed in context or logs.
  • Scoped before every call. Graph API scopes enforced per tool — your agent can't read mail if it only needs calendar.
Microsoft 365
agent · Acme Q3
Run
What meetings do I have tomorrow and are there any unread emails about the Q3 review?
S
microsoft365_calendar_events_list
85ms
Microsoft 365 agent
You have 3 meetings tomorrow: standup at 9 AM, design review at 1 PM, and a 1:1 at 4 PM. Found 2 unread emails about Q3 review — one from Sarah Chen (Jun 19) and one from the finance team (Jun 20).
Sources: 3 calendar events, 2 mail threads
microsoft365mcp
2 tools, 5 items
18:29
Message Claude...

Tools your productivity agent reaches for on Microsoft 365, scoped per user.

CALL ANY TOOL
Each tool maps to a specific Microsoft Graph API endpoint and enforces the minimal OAuth scope required for that operation.
microsoft365_excel_add_table_column
Excel add table column
Add a new column to an existing Excel table in OneDrive. Optionally specify the column name, its zero-based insertion index (null = append at end), and initial cell values as a 2D array (first row is the header). Returns the created column object.
Parameters
Name
Type
Required
Description
item_id
string
Required
OneDrive item ID of the Excel (.xlsx) file. Example: '01BYE5RZ6QN3ZWBTUFOFD3GSPGOHDJD36K'.
table_id
string
Required
Name or ID of the table to add the column to. Example: 'Table1' or the GUID assigned by Excel.
index
integer
Optional
Zero-based index position at which to insert the column. Null or omitted means append the column at the right end of the table. Example: 0 inserts as the first column.
name
string
Optional
Display name for the new column header. If omitted, Excel auto-generates a name (e.g., 'Column1'). Example: 'Revenue'.
session_id
string
Optional
Optional workbook session ID from createSession. When provided, sent as the workbook-session-id header. Example: 'cluster=SN2&session=...'.
values
array
Optional
2D array of initial cell values for the column, including the header row in the first element. Example: [["Header"],["row1val"],["row2val"]]. Each inner array is one row. If omitted, the column is created empty.
microsoft365_excel_calculate_workbook
Excel calculate workbook
microsoft365_excel_create_chart
Excel create chart
microsoft365_excel_delete_chart
Excel delete chart
microsoft365_excel_get_range
Excel get range
microsoft365_excel_list_charts
Excel list charts
microsoft365_excel_update_chart
Excel update chart
microsoft365_onedrive_discard_checkout
Onedrive discard checkout
microsoft365_onedrive_get_version_content
Onedrive get version content
microsoft365_onedrive_search_drive_items
Onedrive search drive items
microsoft365_onedrive_upload_large_file
Onedrive upload large file
microsoft365_outlook_create_calendar
Outlook create calendar
microsoft365_outlook_create_mail_folder
Outlook create mail folder
microsoft365_outlook_delete_calendar_group
Outlook delete calendar group
microsoft365_outlook_forward_event
Outlook forward event
microsoft365_outlook_get_mail_tips
Outlook get mail tips
microsoft365_outlook_list_contacts
Outlook list contacts
microsoft365_outlook_send_draft_message
Outlook send draft message
microsoft365_outlook_todo_checklist_items_delete
Delete outlook todo checklist items
microsoft365_outlook_todo_tasks_update
Update outlook todo tasks
microsoft365_outlook_update_message
Outlook update message
microsoft365_powerpoint_read_presentation
Powerpoint read presentation
microsoft365_sharepoint_create_site_page
Sharepoint create site page
microsoft365_sharepoint_get_site
Sharepoint get site
microsoft365_sharepoint_list_followed_sites
Sharepoint list followed sites
microsoft365_sharepoint_publish_site_page
Sharepoint publish site page
microsoft365_sharepoint_remove_group_member
Sharepoint remove group member
microsoft365_sharepoint_renew_webhook
Sharepoint renew webhook
microsoft365_teams_archive_channel
Teams archive channel
microsoft365_teams_set_preferred_presence
Teams set preferred presence

For more tools, view docs.

Build your Agent
One token vault, one scope check, one audit trail — same pattern whether your agent runs on LangChain, the OpenAI SDK, Anthropic, or Google ADK.
Python · LlamaIndex
Try these prompts
Drop any of these into your agent to see per-user Microsoft 365 access in action.
Email & communication
Copy the prompt
Copied
Summarize my unread emails from the last 24 hours.
Copy the prompt
Copied
Draft a reply to the latest email from [name] and send it when I approve.
Copy the prompt
Copied
Find all emails about the Q3 budget and pull out the key numbers.
Copy the prompt
Copied
Who emailed me most this week?
Calendar & scheduling
Copy the prompt
Copied
What does my week look like? Flag any double-bookings.
Copy the prompt
Copied
Find a 30-minute slot tomorrow where both me and [colleague] are free.
Copy the prompt
Copied
Summarize the agenda and attendees for my next meeting.
Copy the prompt
Copied
How many hours am I in meetings this week?
Files & docs
Copy the prompt
Copied
Find the latest version of the Q3 review deck in my OneDrive.
Copy the prompt
Copied
Summarize the document [file name] and pull out all action items.
Copy the prompt
Copied
List everything in my Documents folder modified in the last 7 days.
SEE HOW AUTH WORKS
User authorizes once via OAuth 2.0; Scalekit vaults the token, refreshes it automatically, and enforces scope on every subsequent tool call.
1
Authorize
Your user connects
Microsoft 365
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Microsoft 365
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Microsoft 365
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Microsoft 365
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
The same per-user OAuth vault works across every connector — swap Microsoft 365 for Slack, Google Calendar, or any other service with zero new auth code.
GTM and RevOps Teams
Deal room sync
Pulls opportunity context from Salesforce, captures key decisions from Slack, and syncs a running summary to the deal room doc in Google Drive, but only when the deal actually changed.
People Ops and HR teams
Performance review collector
Collects review feedback from Airtable and Google Forms scoped to each manager's direct reports, writes per-employee summaries to Notion, and DMs the manager a Slack digest.
People Ops and HR teams
Offer letter routing agent
Drafts the offer in PandaDoc, blocks on the hiring manager's approval in Slack, then emails the candidate their e-signature link. Every call runs as the recruiter who triggered it, never a shared HR bot.
Support and Ops Teams
Support ticket automation agent
Fetches new Zendesk tickets, drafts a reply from Notion knowledge base articles, digests what it cannot answer to Slack, and archives the rest, acting as the support agent rather than a shared API key.
Test other agents
The same per-user OAuth vault works across every connector — swap Microsoft 365 for Slack, Google Calendar, or any other service with zero new auth code.
GTM
Deal room sync agent
Pull opportunity context from Salesforce, capture decisions from Slack, and keep the Google Drive deal room doc current.
PEOPLE OPS
Performance review collector agent
Collect review feedback from Airtable and Google Forms per manager, summarise each report in Notion, and DM the digest in Slack.
PEOPLE OPS
Offer letter routing agent
Draft the offer in PandaDoc, gate it on hiring manager approval in Slack, then email the candidate their signature link.
SUPPORT
Support ticket automation (Google ADK)
Fetch, annotate, and archive Zendesk tickets with Notion context, digesting anything it cannot answer to Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared service account token looks fine in a demo. In production every Graph API call is attributed to the service account — not the real user who triggered the agent. Scalekit resolves the delegated credential so audit logs say the right name.
// shared token
audit → bot_service_account
mail.read → all users' inboxes

// scalekit
audit → alice@company.com ✓
mail.read → alice's inbox only ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Microsoft 365 today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does each user need their own OAuth token, or can I use a shared service account?
Each user authorizes individually via OAuth 2.0 delegated flow. Scalekit stores and resolves a separate token per user, so every Microsoft Graph API call is attributed to the real user — not a service account. This is required for accurate audit logs and correct permission enforcement across tenants.
How are OAuth tokens stored and protected?
Tokens are encrypted at rest with AES-256 and resolved at request time inside Scalekit's vault. They are never written to agent context, logs, or LLM prompts. Refresh is handled automatically before expiry so your agent never surfaces an expired-token error to users.
Can I limit which Microsoft Graph API scopes my agent is allowed to use?
Yes. Use listScopedTools to declare the exact set of tools — and therefore the exact set of Graph scopes — available to a given agent or tenant. Scalekit enforces this allowlist at call time; tools not in scope return a 403 before the Graph API is ever contacted.
What happens when a user revokes consent or their Microsoft 365 subscription lapses?
Scalekit detects token invalidation on the next refresh attempt and marks the credential as revoked in the vault. Subsequent tool calls return an actionable error that your agent can surface to the user prompting them to re-authorize — no stale tokens silently failing in the background.
Does the connector support Microsoft 365 Business and Enterprise tenants, or only personal accounts?
The connector works with both personal Microsoft accounts and Azure AD-backed organizational (work/school) tenants. For enterprise deployments, admin consent may be required for certain Graph API scopes — Scalekit surfaces this in the OAuth flow and documents the required scopes per tool so your IT admin can grant consent in advance.
What other MCP connectors does Scalekit support?
Scalekit runs the Slack MCP server, Trello MCP server, and Monday.com MCP server on the same per-user auth, token vault, and audit trail. Browse 500+ connectors in the MCP connector directory.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""microsoft365"": {
""url"": ""https://mcp.scalekit.com/microsoft365"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.microsoft365]
url = ""https://mcp.scalekit.com/microsoft365""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""microsoft365"": {
""url"": ""https://mcp.scalekit.com/microsoft365"",
""type"": ""http""
}
}
}