readMailLABSCO SUMMARY
Every call hits the real tenant, which is the point and also the thing to plan for.
There are no mocks here: mail is sent, meetings are booked, workbook cells are written — which is exactly what you want on a test tenant that static fixtures never exercise. Two practical notes: without admin consent you still get Mail, Calendar, Files, Excel, Word, PowerPoint, Contacts, To-Do, Chat and basic channels, and since Claude Desktop caps out around 55 tools per server, the project's own config splits the tools across three entries pointed at the same backend.
What it is
A server that connects any MCP client to Microsoft 365 through the Graph API, with a local adapter process translating MCP to HTTP. Every agent authenticates as a distinct tenant user, so operations run against real data with that user's permissions.
What you get
- Tools across 12 modules: Mail, Calendar, Files, Excel, Word, PowerPoint, Teams, Contacts, To-Do, Groups, People and Search
- Excel gets 30 tools that work on workbooks in place through the Graph workbook API — ranges, formatting, tables, sorting, filtering, and
callWorkbookFunctionfor spreadsheet functions - Word and PowerPoint: create documents and decks from structured content, read them back as HTML or per-slide text, and convert either to PDF
- Teams covers chats, channels, messages, channel files, online meetings, and meeting transcripts
- One server serves a whole team, each user's data isolated from the others
MCP_MODULESfilters which modules an adapter exposes, so you can split the surface across several client entries
Requirements
Node.js 18+, an Azure app registration, and a Microsoft 365 account. The app needs 18 delegated Graph permissions; 12 work without admin consent and 6 require a tenant administrator. Set MICROSOFT_CLIENT_ID and MICROSOFT_TENANT_ID, add http://localhost:3000/api/auth/callback as the redirect URI, then sign in through the local web UI and paste the generated token into your client as MCP_BEARER_TOKEN alongside MCP_SERVER_URL.
Setup effort
Follow the published steps — git clone https://github.com/Aanerud/MCP-Microsoft-Office.git
USE CASES
Building a budget spreadsheet that lives in OneDrive
Create the workbook, write the ranges, turn them into a table and recalculate — no download, no upload.
Finding a meeting slot and booking it
Check free-busy, get the suggested times, then create the event with a room attached.
Turning an email thread into a document
Read the full message content, then create a Word document from structured headings and paragraphs and convert it to PDF.
Catching up on a Teams channel
List the channels, read the recent messages, and reply in thread.
Getting a client that caps tool counts to work
Split the modules across several server entries with MCP_MODULES, all pointing at the same backend and token.
116 tools
Listed in project docs. Your client may show a different list.
sendMailreplyToMailreadMailDetailsmarkEmailReadflagMailgetMailAttachmentsaddMailAttachmentremoveMailAttachmentgetEventscreateEventupdateEventcancelEventacceptEventtentativelyAcceptEventdeclineEventgetAvailabilityfindMeetingTimesgetRoomsgetCalendarsaddAttachmentremoveAttachmentlistFilesuploadFiledownloadFilegetFileMetadatagetFileContentsetFileContentupdateFileContentcreateSharingLinkgetSharingLinksremoveSharingPermissioncreateWorkbookSessioncloseWorkbookSessionlistWorksheetsaddWorksheetgetWorksheetupdateWorksheetdeleteWorksheetgetRangeupdateRangegetRangeFormatupdateRangeFormatsortRangemergeRangeunmergeRangelistTablescreateTableupdateTabledeleteTablelistTableRowsaddTableRowdeleteTableRowlistTableColumnsaddTableColumndeleteTableColumnsortTablefilterTableclearTableFilterconvertTableToRangecallWorkbookFunctioncalculateWorkbookcreateWordDocumentreadWordDocumentgetWordDocumentMetadatagetWordDocumentAsHtmlconvertDocumentToPdfcreatePresentationreadPresentationgetPresentationMetadataconvertPresentationToPdflistChatscreateChatgetChatMessagessendChatMessagelistJoinedTeamslistTeamChannelscreateTeamChanneladdChannelMembergetChannelMessagessendChannelMessagereplyToMessagelistChannelFilesuploadFileToChannelreadChannelFilecreateOnlineMeetinggetOnlineMeetinglistOnlineMeetingsgetMeetingByJoinUrlgetMeetingTranscriptsgetMeetingTranscriptContentlistContactsgetContactcreateContactupdateContactdeleteContactsearchContactslistTaskListsgetTaskListcreateTaskListupdateTaskListdeleteTaskListlistTasksgetTaskcreateTaskupdateTaskdeleteTaskcompleteTasklistGroupsgetGrouplistGroupMemberslistMyGroupsfindPeoplegetRelevantPeoplegetPersonByIdsearchBEFORE YOU INSTALL
What to know first
Tools you get
116 tools named in the project's documentation.
Requires
- Node.js 18+
- A Microsoft 365 account and an Azure app registration
- MICROSOFT_CLIENT_ID in .env
- MICROSOFT_TENANT_ID in .env
- MCP_SERVER_URL and MCP_BEARER_TOKEN in the client config (token generated at http://localhost:3000)
INSTALLATION
Connect your client
Server setup
Go to the Azure Portal (https://portal.azure.com) > Microsoft Entra ID > App registrations > New registration
Name it MCP-Microsoft-Office, register with your preferred account type
Copy the Application (client) ID and Directory (tenant) ID
Go to API permissions > Add a permission > Microsoft Graph > Delegated permissions, and add the 18 permissions the README lists (if you are a tenant admin, click Grant admin consent)
Go to Authentication > Add a platform > Web, set the redirect URI to http://localhost:3000/api/auth/callback and enable Allow public client flows
git clone https://github.com/Aanerud/MCP-Microsoft-Office.git
cd MCP-Microsoft-Office
npm install
cp .env.example .envEdit .env and set MICROSOFT_CLIENT_ID and MICROSOFT_TENANT_ID to your Azure app details
npm run dev:webOpen http://localhost:3000 in your browser. Click Login with Microsoft, sign in, and grant permissions. Then click Generate MCP Token and copy the token
Paste the Claude Desktop block on this page into your Claude Desktop config, with <YOUR_PATH_TO_MCP_MICROSOFT_OFFICE> set to the full path of the MCP-Microsoft-Office folder you cloned and <YOUR_MCP_BEARER_TOKEN> set to the token, then restart Claude Desktop
MCP Clients
Claude Desktop
{
"mcpServers": {
"microsoft-365": {
"command": "node",
"args": [
"<YOUR_PATH_TO_MCP_MICROSOFT_OFFICE>/mcp-adapter.cjs"
],
"env": {
"MCP_SERVER_URL": "http://localhost:3000",
"MCP_BEARER_TOKEN": "<YOUR_MCP_BEARER_TOKEN>",
"MCP_MODULES": "search,mail,calendar,files,people,contacts,groups,query"
}
},
"microsoft-365-teams": {
"command": "node",
"args": [
"<YOUR_PATH_TO_MCP_MICROSOFT_OFFICE>/mcp-adapter.cjs"
],
"env": {
"MCP_SERVER_URL": "http://localhost:3000",
"MCP_BEARER_TOKEN": "<YOUR_MCP_BEARER_TOKEN>",
"MCP_MODULES": "teams,todo"
}
},
"microsoft-365-office": {
"command": "node",
"args": [
"<YOUR_PATH_TO_MCP_MICROSOFT_OFFICE>/mcp-adapter.cjs"
],
"env": {
"MCP_SERVER_URL": "http://localhost:3000",
"MCP_BEARER_TOKEN": "<YOUR_MCP_BEARER_TOKEN>",
"MCP_MODULES": "excel,word,powerpoint,files"
}
}
}
}The configuration on this page does not set MICROSOFT_CLIENT_ID and MICROSOFT_TENANT_ID; the project's instructions put them in a .env file. To supply them without depending on where the server looks for that file, use the block's "env" section.