Work IQ
OFFICIAL SERVERMicrosoft's own MCP server for querying and changing Microsoft 365 mail, meetings, files and Teams
Reads and changes Outlook mail, calendars, OneDrive, Teams, SharePoint and more through Microsoft Graph
By Softeria TypeScript Local · stdio CommunicationProductivityFiles and storage
84 popularity score ★ 1.1k ↓ 52k/wk
Opens the app, which asks before it adds the server.
claude mcp add microsoft-365 -- npx -y @softeria/ms-365-mcp-server{
"mcpServers": {
"microsoft-365": {
"command": "npx",
"args": [
"-y",
"@softeria/ms-365-mcp-server"
]
}
}
}{
"mcpServers": {
"microsoft-365": {
"command": "npx",
"args": [
"-y",
"@softeria/ms-365-mcp-server"
]
}
}
}{
"servers": {
"microsoft-365": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@softeria/ms-365-mcp-server"
]
}
}
}[mcp_servers.microsoft-365]
command = "npx"
args = ["-y", "@softeria/ms-365-mcp-server"]gemini mcp add --scope user microsoft-365 npx -- -y @softeria/ms-365-mcp-serverOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/softeria/ms-365-mcp-server.git
cd ms-365-mcp-server
npm install
npm run generate
npm run buildclaude mcp add microsoft-365 -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js' --org-mode{
"mcpServers": {
"microsoft-365": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js",
"--org-mode"
]
}
}
}{
"mcpServers": {
"microsoft-365": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js",
"--org-mode"
]
}
}
}{
"servers": {
"microsoft-365": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js",
"--org-mode"
]
}
}
}[mcp_servers.microsoft-365]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js", "--org-mode"]gemini mcp add --scope user microsoft-365 node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js' --org-mode| Set together: own app | |
|---|---|
MS365_MCP_CLIENT_ID |
Optional: Client ID of your own Azure app instead of the built-in one; needed for GCC High and app mode. |
MS365_MCP_CLIENT_SECRET secret |
Optional: Secret for that app; needed for --obo, and one of the app-mode credentials. |
MS365_MCP_TENANT_ID |
Optional: Tenant to sign in against; consumers for personal accounts, a real tenant in app mode. |
MS365_MCP_ORG_MODE |
Optional: Turns on work or school tools, like --org-mode. |
READ_ONLY |
Optional: Disables all tools that change data, like --read-only. |
ENABLED_TOOLS |
Optional: Regex that limits which tools are registered; overrides --preset. |
ENABLED_TOOLS_FILE |
Optional: File with one tool regex per line, joined with |; wins over ENABLED_TOOLS and --preset. |
MS365_MCP_REQUIRE_CONFIRM |
Optional: Set to true so destructive tools need confirm: true in the call. |
MS365_MCP_CLIENT_CERTIFICATE_PATH |
Optional: PEM file with the certificate and unencrypted private key, as the app-mode credential. |
MS365_MCP_FEDERATED_TOKEN_FILE |
Optional: File holding a federated identity token, reread on each token request, as the app-mode credential. |
MS365_MCP_MANAGED_IDENTITY |
Optional: system, or a user-assigned identity's client ID, for app mode on an Azure host. |
MS365_MCP_KEYVAULT_URL |
Optional: Azure Key Vault to read the client ID, tenant, secret and cloud type from. |
Microsoft 365 MCP Server is an independent project from Softeria that connects an assistant to Microsoft 365 through the Microsoft Graph API. Almost every tool is a single Graph endpoint, declared in one endpoints file that now lists 362 of them, from Outlook mail and calendars to OneDrive, Excel, OneNote, To Do, Planner, Teams, SharePoint, meeting transcripts, presence and directory users. Seven more tools are written in code. They move file bytes, parse Teams links and read mail as cleaned text with quoted history and tracking redirects stripped (read-mail-text). Six handle sign-in and switching between accounts, so the full count is 375, though some only show up in certain modes.
A personal Microsoft account gets the mail, calendar, file, task and notebook tools. Teams, SharePoint, shared mailboxes, meetings and user management need a work or school account and --org-mode from the first start.
Out of the box it runs over stdio and signs you in with a device code against a built-in Softeria app registration. The README recommends your own Azure app for production. There is also a Streamable HTTP mode where each request brings an OAuth bearer token, optionally exchanged On-Behalf-Of and restricted to listed tenants or users.
The newer app mode (--app-mode) has no signed-in user at all. It runs with application permissions across the whole tenant, authenticating with a secret, a certificate, a federated token file or an Azure managed identity. It is stdio only, and of the 362 endpoint tools it offers just the 143 that carry application scopes in the endpoints file.
Presets, a regex filter (inline or from a file), a scope allowlist and read-only mode cut the tool list down. Besides the global cloud it supports 21Vianet's China cloud and US Government GCC High. TOON output is marked experimental.
One switch the README never mentions: MS365_MCP_REQUIRE_CONFIRM=true makes every destructive tool refuse until the call includes confirm: true.
| Runtime | Node.js 18+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Microsoft 365 / Microsoft account | Free tierA personal account covers mail, calendar and files; Teams, SharePoint, shared mailboxes and meetings need a work or school account |
The package asks for Node.js 18 or newer and the README recommends 20. On a work or school tenant an admin may have to consent to the Graph permissions. For GCC High or production, register your own Azure app and set MS365_MCP_CLIENT_ID and MS365_MCP_TENANT_ID. --obo also needs MS365_MCP_CLIENT_SECRET. App mode needs your own app with admin-consented application permissions, a real tenant ID and exactly one credential, unless it runs on an Azure host with a managed identity. Key Vault secrets rely on the optional @azure/identity and @azure/keyvault-secrets packages, which a normal npm install brings.
Teams, SharePoint, shared mailbox, meeting and presence tools do not work with personal accounts, and organisation mode must be on from the start. Bring-your-own-token mode does not refresh tokens. The README notes that from June 2026 personal accounts using the default 'common' tenant lose their session about an hour after sign-in unless MS365_MCP_TENANT_ID is set to consumers. Tools that need new scopes require a fresh consent. Paging is capped by default at 100 pages or 10,000 items. The --user-fields filter is not a full authorisation boundary, and the TOON output is experimental.
Suits someone who wants an assistant to work across their own Microsoft 365 mailbox, calendar and files, plus Teams and SharePoint with a work account, running on their own machine. It can send mail, post messages and delete files, so a careful start is --read-only, a narrow --preset, or MS365_MCP_REQUIRE_CONFIRM so deletes need an explicit confirm. GCC High tenants can use it with their own app registration. Admins who want unattended jobs without a signed-in user can use app mode, but its grants reach every mailbox and drive the permissions cover, so it fits teams able to scope them with Exchange application RBAC or Sites.Selected. It is a community project, not Microsoft's own.
30 only read, 25 change things, 5 can delete or overwrite. A ? marks an optional parameter.
graph-batch changesread-mail-textmessageIds?: arrayfolderId?: stringtop?: integerfilter?: stringsearch?: stringmaxChars?: integeraccount?: stringlist-mail-messagesget-mail-messageget-mail-message-mimelist-mail-folderssend-mail changescreate-draft-email changessend-draft-message changesreply-mail-message changesforward-mail-message changesmove-mail-message changesupdate-mail-message changesdelete-mail-message deletesadd-mail-attachment changesget-mail-attachment-contentcreate-mail-rule changeslist-shared-mailbox-messagessend-shared-mailbox-mail changeslist-calendar-eventsget-calendar-viewcreate-calendar-event changesupdate-calendar-event changesdelete-calendar-event deletesaccept-calendar-event changesfind-meeting-timesget-schedulelist-driveslist-folder-filessearch-onedrive-filesupload-file-content deletesmove-rename-onedrive-item changesdelete-onedrive-file deletescreate-drive-item-share-link changesget-excel-rangeupdate-excel-range deletesadd-excel-table-rows changeslist-onenote-notebooksget-onenote-page-contentcreate-onenote-page changeslist-todo-taskscreate-todo-task changesupdate-todo-task changeslist-planner-taskscreate-planner-task changeslist-outlook-contactscreate-outlook-contact changesget-current-userlist-userslist-chatslist-chat-messagessend-chat-message changeslist-channel-messagessend-channel-message changessearch-sharepoint-siteslist-sharepoint-site-list-itemssearch-queryget-meeting-transcript-contentdownload-bytes-to-file changeslogin