MCP Microsoft Office Bridge

A secure, multi-user server connecting LLMs to Microsoft 365 services.

MseeP.ai Security Assessment Badge

MCP Microsoft Office

One MCP server. Multiple users. Real Microsoft 365 traffic on your test tenant.


The Problem

Test tenants sit empty. Static test data does not exercise real workflows. When you need agents that send real emails, schedule real meetings, and collaborate in real Teams channels, mocks and stubs fall short.

What This Solves

This project connects any MCP-compatible AI client to Microsoft 365 through the Graph API. Each agent authenticates as a distinct tenant user and performs real operations against real data.

  • 117 tools across 12 modules: Mail, Calendar, Files, Excel, Word, PowerPoint, Teams, Contacts, To-Do, Groups, People, Search
  • Multi-user: one server supports your entire team, each with isolated data
  • Real Graph API calls: every operation hits the actual tenant, not a mock
  • Secure: tokens encrypted at rest, no credentials stored on third-party servers

Architecture

                    ┌──────────────────┐
                    │  MCP Client      │
                    │  (Claude, etc.)  │
                    └────────┬─────────┘
                             │ JSON-RPC (stdin/stdout)
                    ┌────────▼─────────┐
                    │  MCP Adapter     │
                    │  (runs locally)  │
                    └────────┬─────────┘
                             │ HTTP + Bearer Token
                    ┌────────▼─────────┐
                    │  MCP Server      │
                    │  (local or       │
                    │   remote)        │
                    └────────┬─────────┘
                             │ Microsoft Graph API
                    ┌────────▼─────────┐
                    │  Microsoft 365   │
                    │  (your tenant)   │
                    └──────────────────┘

Three parts:

  1. MCP Client -- the AI you interact with
  2. MCP Adapter -- a Node.js process that translates MCP protocol to HTTP requests (runs on the same machine as the client)
  3. MCP Server -- handles authentication and calls the Microsoft Graph API (runs locally or on a remote server)

Permissions

The server requires 18 Microsoft Graph delegated permissions. Twelve work without admin consent. Six require a tenant administrator to grant consent.

No Admin Consent Required

PermissionTools Unlocked
User.ReadAuthentication, user profile
Mail.ReadWritereadMail, readMailDetails, markEmailRead, flagMail, getMailAttachments, addMailAttachment, removeMailAttachment
Mail.SendsendMail, replyToMail
Calendars.ReadWritegetEvents, createEvent, updateEvent, cancelEvent, acceptEvent, tentativelyAcceptEvent, declineEvent, getAvailability, findMeetingTimes, getRooms, getCalendars, addAttachment, removeAttachment
Files.ReadWrite.AlllistFiles, uploadFile, downloadFile, getFileMetadata, getFileContent, setFileContent, updateFileContent, createSharingLink, getSharingLinks, removeSharingPermission, listChannelFiles, uploadFileToChannel, readChannelFile, all Excel workbook tools, all Word/PowerPoint tools
Contacts.ReadWritelistContacts, getContact, createContact, updateContact, deleteContact, searchContacts
Tasks.ReadWritelistTaskLists, getTaskList, createTaskList, updateTaskList, deleteTaskList, listTasks, getTask, createTask, updateTask, deleteTask, completeTask
Chat.ReadWritelistChats, createChat, getChatMessages, sendChatMessage
Channel.ReadBasic.AlllistTeamChannels, getChannelMessages
ChannelMessage.SendsendChannelMessage, replyToMessage
Channel.CreatecreateTeamChannel
OnlineMeetings.ReadWritecreateOnlineMeeting, getOnlineMeeting, listOnlineMeetings, getMeetingByJoinUrl

Requires Admin Consent

PermissionAdditional Tools Unlocked
User.Read.AllResolve user IDs across Teams, People search
People.Read.AllfindPeople, getRelevantPeople, getPersonById
Group.Read.AlllistGroups, getGroup, listGroupMembers, listMyGroups
ChannelMember.ReadWrite.AlladdChannelMember
ChannelMessage.Read.AllRead channel message history
OnlineMeetingTranscript.Read.AllgetMeetingTranscripts, getMeetingTranscriptContent

Without admin consent, you get Mail, Calendar, Files, Excel workbooks, Word documents, PowerPoint presentations, Contacts, To-Do, Chat, and basic Teams channel operations. With admin consent, you add People directory search, Groups, channel member management, and meeting transcripts.


Quick Start

Prerequisites

  • Node.js 18+ (download)
  • Claude Desktop (download) or another MCP client
  • Microsoft 365 account (work, school, or personal)

Step 1: Azure App Registration

  1. Go to Azure Portal > Microsoft Entra ID > App registrations > New registration
  2. Name it MCP-Microsoft-Office, register with your preferred account type
  3. Copy the Application (client) ID and Directory (tenant) ID
  4. Go to API permissions > Add a permission > Microsoft Graph > Delegated permissions
  5. Add the 18 permissions listed above
  6. If you are a tenant admin, click Grant admin consent
  7. Go to Authentication > Add a platform > Web
    • Redirect URI: http://localhost:3000/api/auth/callback
    • Enable Allow public client flows

Step 2: Clone and Configure

git clone https://github.com/Aanerud/MCP-Microsoft-Office.git
cd MCP-Microsoft-Office
npm install

Copy .env.example to .env and fill in your Azure app details:

MICROSOFT_CLIENT_ID=your-client-id
MICROSOFT_TENANT_ID=your-tenant-id

Step 3: Start the Server and Authenticate

npm run dev:web

Open http://localhost:3000 in your browser. Click Login with Microsoft, sign in, and grant permissions. Then click Generate MCP Token and copy the token.

Step 4: Configure Claude Desktop

Edit your Claude Desktop config:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "microsoft365": {
      "command": "node",
      "args": ["/path/to/MCP-Microsoft-Office/mcp-adapter.cjs"],
      "env": {
        "MCP_SERVER_URL": "http://localhost:3000",
        "MCP_BEARER_TOKEN": "paste-your-token-here"
      }
    }
  }
}

Restart Claude Desktop. Ask: "What's on my calendar today?"


Tools (117)

Mail (9)

ToolDescription
readMailRead inbox messages
sendMailSend an email
replyToMailReply to an email
readMailDetailsGet full email content
markEmailReadMark email as read/unread
flagMailFlag or unflag an email
getMailAttachmentsList email attachments
addMailAttachmentAdd attachment to email
removeMailAttachmentRemove attachment from email

Calendar (13)

ToolDescription
getEventsGet calendar events
createEventCreate a meeting or event
updateEventModify an existing event
cancelEventCancel an event
acceptEventAccept a meeting invitation
tentativelyAcceptEventTentatively accept
declineEventDecline a meeting invitation
getAvailabilityCheck free/busy times
findMeetingTimesFind optimal meeting slots
getRoomsFind meeting rooms
getCalendarsList all calendars
addAttachmentAdd attachment to event
removeAttachmentRemove event attachment

Files (10)

ToolDescription
listFilesList OneDrive files
uploadFileUpload a file
downloadFileDownload a file
getFileMetadataGet file info
getFileContentRead file contents
setFileContentWrite file contents
updateFileContentUpdate existing file
createSharingLinkCreate a sharing link
getSharingLinksList sharing links
removeSharingPermissionRemove sharing access

Excel (30)

Work directly with Excel workbooks stored in OneDrive or SharePoint — no file download needed. All operations go through Microsoft Graph's workbook API with transparent session management.

ToolDescription
createWorkbookSessionOpen a workbook session (persistent or temporary)
closeWorkbookSessionClose an active workbook session
listWorksheetsList all worksheets in a workbook
addWorksheetAdd a new worksheet
getWorksheetGet a worksheet by name or ID
updateWorksheetRename, reposition, or hide a worksheet
deleteWorksheetDelete a worksheet
getRangeRead cell values, formulas, and formatting
updateRangeWrite values to a cell range
getRangeFormatGet formatting (font, fill, borders)
updateRangeFormatSet formatting (bold, colors, number formats)
sortRangeSort cells in a range
mergeRangeMerge cells
unmergeRangeUnmerge cells
listTablesList all tables in a worksheet
createTableCreate a table from a range
updateTableRename or restyle a table
deleteTableDelete a table
listTableRowsList all rows in a table
addTableRowAdd a row to a table
deleteTableRowDelete a row by index
listTableColumnsList all columns in a table
addTableColumnAdd a column to a table
deleteTableColumnDelete a column
sortTableSort a table by column
filterTableApply a filter to a table column
clearTableFilterClear a column filter
convertTableToRangeConvert a table back to a plain range
callWorkbookFunctionCall any of 300+ Excel functions (SUM, VLOOKUP, PMT, etc.)
calculateWorkbookRecalculate all formulas

Word (5)

Create, read, and convert Word documents. Documents are created from structured JSON and stored in OneDrive. Reading uses mammoth for HTML/text extraction.

ToolDescription
createWordDocumentCreate a .docx from structured content (headings, paragraphs, tables, lists, images)
readWordDocumentRead a document as HTML and plain text
getWordDocumentMetadataGet title, author, dates, keywords
getWordDocumentAsHtmlConvert document content to HTML
convertDocumentToPdfConvert a Word document to PDF

PowerPoint (4)

Create, read, and convert PowerPoint presentations. Presentations are built from structured slide data and stored in OneDrive.

ToolDescription
createPresentationCreate a .pptx with title, content, and blank slides
readPresentationRead slide content (text elements per slide)
getPresentationMetadataGet title, author, slide count, dates
convertPresentationToPdfConvert a presentation to PDF

Teams (21)

ToolDescription
listChatsList Teams chats
createChatCreate a new chat
getChatMessagesRead chat messages
sendChatMessageSend a chat message
listJoinedTeamsList your teams
listTeamChannelsList team channels
createTeamChannelCreate a channel
addChannelMemberAdd member to channel
getChannelMessagesRead channel messages
sendChannelMessagePost to a channel
replyToMessageReply to a channel message
listChannelFilesList files in a channel
uploadFileToChannelUpload file to channel
readChannelFileRead a channel file
createOnlineMeetingCreate a Teams meeting
getOnlineMeetingGet meeting details
listOnlineMeetingsList online meetings
getMeetingByJoinUrlFind meeting by join URL
getMeetingTranscriptsGet meeting transcripts
getMeetingTranscriptContentRead transcript content

(Note: addChannelMember applies to private channels only. Standard channels auto-include all team members.)

Contacts (6)

ToolDescription
listContactsList contacts
getContactGet contact details
createContactCreate a contact
updateContactUpdate contact info
deleteContactDelete a contact
searchContactsSearch contacts

To-Do (11)

ToolDescription
listTaskListsList task lists
getTaskListGet a task list
createTaskListCreate a task list
updateTaskListRename a task list
deleteTaskListDelete a task list
listTasksList tasks
getTaskGet task details
createTaskCreate a task
updateTaskUpdate a task
deleteTaskDelete a task
completeTaskMark task complete

Groups (4)

ToolDescription
listGroupsList Microsoft 365 groups
getGroupGet group details
listGroupMembersList group members
listMyGroupsList your groups

People (3)

ToolDescription
findPeopleSearch the directory
getRelevantPeopleGet frequent contacts
getPersonByIdGet person details

Search (1)

ToolDescription
searchUnified search across emails, files, events, and chat messages

Multi-User

Each user authenticates independently. The server isolates all data by user identity.

  Alice ([email protected])          Bob ([email protected])
  ├─ Her own Microsoft tokens        ├─ His own Microsoft tokens
  ├─ Her own session                  ├─ His own session
  └─ Claude Desktop (her laptop)     └─ Claude Desktop (his PC)

              Complete data isolation.
         Alice never sees Bob's data.

For automated testing with multiple agents, use the ROPC (Resource Owner Password Credentials) flow to authenticate programmatically:

# Start the server
npm run dev:web

# Run the E2E test suite (authenticates 3 users via ROPC)
node tests/run-all.cjs

The test suite authenticates multiple users, then exercises all 117 tools across 12 modules plus 5 cross-module workflows. See tests/ for the full implementation.


E2E Test Suite

The project includes a comprehensive test suite covering all 117 tools.

# Run all tests (requires server running)
node tests/run-all.cjs

# Run a single module
node tests/run-all.cjs --bucket mail --buckets-only

# Run only workflows
node tests/run-all.cjs --workflows-only

Test structure:

tests/
  lib/           Shared auth, HTTP client, reporter
  buckets/       One file per module (12 files, 117 tools)
  workflows/     Cross-module tests (5 files)
  run-all.cjs    Master runner

Tests authenticate via ROPC (no manual token management) and run in ~100 seconds.


Environment Variables

Copy .env.example to .env and configure:

VariableRequiredDescription
MICROSOFT_CLIENT_IDYesAzure App Client ID
MICROSOFT_TENANT_IDYesAzure Tenant ID
MICROSOFT_REDIRECT_URINoOAuth callback URL (default: http://localhost:3000/api/auth/callback)
DEVICE_REGISTRY_ENCRYPTION_KEYProduction32-byte encryption key for token storage
JWT_SECRETProductionSecret for signing JWT tokens
CORS_ALLOWED_ORIGINSProductionComma-separated allowed origins
PORTNoServer port (default: 3000)
NODE_ENVNodevelopment or production

Deployment

Local (Recommended for Getting Started)

npm install
npm run dev:web

Azure App Service

See docs/azure-deployment.md for CI/CD deployment with GitHub Actions.


Security

  • Encrypted storage: all Microsoft tokens encrypted at rest with AES-256
  • No client secrets: uses public client flow (PKCE) for desktop authentication
  • Token isolation: each user's tokens stored separately with different encryption keys
  • Rate limiting: built-in rate limiting protects against abuse
  • CORS protection: origin allowlist in production
  • Session expiry: sessions expire after 24 hours

Production Checklist

  • Set NODE_ENV=production
  • Set DEVICE_REGISTRY_ENCRYPTION_KEY (32 bytes)
  • Set JWT_SECRET (strong random string)
  • Set CORS_ALLOWED_ORIGINS
  • Use HTTPS with a valid certificate

Project Structure

MCP-Microsoft-Office/
├── mcp-adapter.cjs          MCP protocol adapter (runs locally)
├── src/
│   ├── api/                 Express routes and controllers
│   ├── auth/                MSAL authentication
│   ├── core/                Services (cache, storage, tools)
│   ├── graph/               Microsoft Graph API services
│   └── modules/             Feature modules (mail, calendar, excel, word, powerpoint, etc.)
├── public/                  Web UI
└── tests/                   E2E test suite (gitignored)

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Submit a pull request

License

MIT License -- see LICENSE file.

Related Servers