Skip to main content
Glama
office365-mcp-server
by eesb99

Office 365 MCP Server

Complete Microsoft Graph API integration for Claude Code CLI with 45 powerful Office 365 tools

License: MIT Node.js Version MCP Protocol Tested

Seamlessly integrate your Office 365 account with Claude Code CLI for intelligent email management, calendar operations, file handling, and more. Built using the official Model Context Protocol (MCP) SDK.


โœจ Features

  • ๐Ÿ“ง Email Management - 16 tools for reading, searching, organizing, and sending emails

  • ๐Ÿ“… Calendar Operations - 9 tools for managing events and schedules

  • ๐Ÿ“ OneDrive Files - 8 tools for file and folder management

  • ๐Ÿ‘ฅ Contacts - 4 tools for contact management

  • ๐Ÿ’ฌ Microsoft Teams - 5 tools for team collaboration

  • โœ… Tasks & To-Do - 4 tools for task management

  • ๐Ÿ” Secure - Environment variable configuration, no hardcoded credentials

  • โšก Fast - Built on official MCP SDK for optimal performance

Total: 45 Production-Ready Tools


Related MCP server: outpost

๐Ÿ“‹ Table of Contents


๐Ÿ”ง Requirements

  • Node.js 18.0.0 or higher

  • Claude Code CLI installed and configured

  • Microsoft 365 Account (Office 365)

  • Azure AD Application with appropriate permissions

  • Admin Consent for your Azure AD tenant


๐Ÿ“ฆ Installation

1. Clone the Repository

git clone https://github.com/eesb99/office365-mcp-server.git
cd office365-mcp-server

2. Install Dependencies

npm install

Required packages:

  • @modelcontextprotocol/sdk - Official MCP SDK

  • @azure/msal-node - Microsoft Authentication Library

  • @microsoft/microsoft-graph-client - Microsoft Graph API client

  • zod - Schema validation

3. Configure Environment Variables

Copy the example configuration:

cp .env.example .env

Edit .env with your Azure credentials (see Azure Configuration below):

AZURE_CLIENT_ID=your-client-id-here
AZURE_AUTHORITY=https://login.microsoftonline.com/your-tenant-id-here
AZURE_CLIENT_SECRET=your-client-secret-here
OFFICE365_USER_EMAIL=your-email@yourdomain.com

โš ๏ธ NEVER commit the .env file to Git!


โ˜๏ธ Azure Configuration

Step 1: Create Azure AD App Registration

  1. Go to Azure Portal

  2. Navigate to Azure Active Directory โ†’ App registrations

  3. Click + New registration

  4. Configure:

    • Name: Office 365 MCP Server (or your preferred name)

    • Supported account types: Accounts in this organizational directory only

    • Redirect URI: Leave blank

  5. Click Register

Step 2: Note Your Credentials

After registration, note these values:

  • Application (client) ID - Use for AZURE_CLIENT_ID

  • Directory (tenant) ID - Use in AZURE_AUTHORITY URL

Step 3: Create Client Secret

  1. In your app registration, go to Certificates & secrets

  2. Click + New client secret

  3. Add description: MCP Server Secret

  4. Set expiry: 90 days (recommended, or choose your preference)

  5. Click Add

  6. โš ๏ธ IMPORTANT: Copy the Value immediately (shown only once!)

  7. Use this for AZURE_CLIENT_SECRET

Step 4: Configure API Permissions

  1. In your app registration, go to API permissions

  2. Click + Add a permission โ†’ Microsoft Graph โ†’ Application permissions

  3. Add these permissions:

    Required Permissions (Minimum - 4 tools):

    • User.Read.All

    • Mail.Read

    • Calendars.Read

    • Files.Read.All

    Full Feature Set (All 45 tools):

    • Mail.ReadWrite - Email management

    • Mail.Send - Send emails

    • MailboxSettings.ReadWrite - Mailbox configuration

    • Calendars.ReadWrite - Calendar operations

    • Files.ReadWrite.All - File management

    • Contacts.ReadWrite - Contact management

    • Team.ReadBasic.All - Teams access

    • Channel.ReadBasic.All - Channel information

    • ChannelMessage.Send - Send channel messages

    • ChannelMessage.Read.All - Read channel messages

    • Chat.ReadWrite - Chat management

    • Tasks.ReadWrite - Task management

  4. Click Add permissions

โš ๏ธ CRITICAL: After adding permissions:

  1. Click โœ“ Grant admin consent for [Your Organization]

  2. Click Yes to confirm

  3. Wait for all permissions to show โœ“ Granted status

Note: Admin consent is required for Application permissions. Contact your Microsoft 365 administrator if you don't have sufficient privileges.

For detailed instructions, see AZURE_PERMISSIONS_SETUP.md.


๐Ÿค– Claude Code CLI Setup

Configuration

Add this MCP server to your Claude Code configuration:

Location: ~/.claude.json

{
  "mcpServers": {
    "office365": {
      "type": "stdio",
      "command": "node",
      "args": ["/absolute/path/to/office365-mcp-server/office365-sdk.js"],
      "env": {
        "AZURE_CLIENT_ID": "your-client-id-here",
        "AZURE_CLIENT_SECRET": "your-client-secret-here",
        "AZURE_AUTHORITY": "https://login.microsoftonline.com/your-tenant-id-here",
        "OFFICE365_USER_EMAIL": "your-email@yourdomain.com"
      }
    }
  }
}

Important:

  • Replace /absolute/path/to/office365-mcp-server/ with the actual path

  • Use absolute paths, not relative paths

  • Add your actual Azure credentials to the env section

Verify Installation

  1. Restart Claude Code CLI

  2. In a new conversation, type:

    list office 365 tools
  3. You should see 45 available tools

Troubleshooting: If tools don't appear, check:

  • Path to office365-sdk.js is absolute and correct

  • All environment variables are set in ~/.claude.json

  • Node.js 18+ is installed: node --version

  • Dependencies are installed: npm install


๐Ÿš€ Usage

Once configured in Claude Code CLI, you can use natural language to interact with Office 365:

Example Commands

Email:

"Show me my last 10 emails"
"Search for emails from jeff@example.com about Q4 budget"
"Send an email to team@company.com with subject 'Meeting Notes'"
"What emails are in my Sent Items folder?"

Calendar:

"What's on my calendar this week?"
"Create a meeting tomorrow at 2pm for 1 hour"
"Show all events in the next 30 days"

Files:

"List files in my OneDrive root folder"
"Search for files containing 'proposal'"
"Show me PDF files modified this month"

Contacts:

"List all my contacts"
"Find contact information for John Smith"

Teams:

"List all my Teams"
"Show channels in the Marketing team"
"Get recent messages from the General channel"

Tasks:

"Show my task lists"
"What tasks are incomplete?"
"Create a task in my To-Do list"

๐Ÿ“š Available Tools

๐Ÿ“ง Email Management (16 tools)

Tool

Description

get_recent_emails

Get recent emails from inbox

search_emails

Search emails with query

get_email_by_id

Get specific email details

send_email

Send an email

reply_to_email

Reply to an email

forward_email

Forward an email

list_mail_folders

List all mail folders

get_folder_emails

Get emails from specific folder

search_in_folder

Search within specific folder

move_email

Move email to folder

delete_email

Delete an email

mark_as_read

Mark email as read

mark_as_unread

Mark email as unread

get_email_attachments

List email attachments

download_attachment

Download attachment

create_mail_folder

Create new folder

๐Ÿ“… Calendar Operations (9 tools)

Tool

Description

get_calendar_events

Get upcoming calendar events

get_event_by_id

Get specific event details

create_calendar_event

Create new calendar event

update_calendar_event

Update existing event

delete_calendar_event

Delete an event

list_calendars

List all calendars

get_calendar_view

Get events in date range

find_meeting_times

Find available meeting times

accept_event

Accept meeting invitation

๐Ÿ“ OneDrive Files (8 tools)

Tool

Description

list_drive_items

List files in folder

get_file_by_id

Get file details

search_drive

Search for files

download_file

Download file content

upload_file

Upload new file

create_folder

Create new folder

delete_file

Delete file or folder

move_file

Move file to folder

๐Ÿ‘ฅ Contacts (4 tools)

Tool

Description

list_contacts

List all contacts

get_contact_by_id

Get specific contact

create_contact

Create new contact

search_contacts

Search contacts

๐Ÿ’ฌ Microsoft Teams (5 tools)

Tool

Description

list_teams

List all teams

list_channels

List channels in team

get_channel_messages

Get channel messages

send_channel_message

Send message to channel

list_chats

List recent chats

โœ… Tasks & To-Do (4 tools)

Tool

Description

list_todo_lists

List all task lists

get_list_tasks

Get tasks from list

create_task

Create new task

update_task

Update existing task

For complete tool documentation, see OFFICE365_TOOLS.md


๐Ÿงช Testing

Option 1: Test with Claude Code CLI

Simply use the natural language commands in Claude Code after setup.

Option 2: Standalone Testing

Test the server independently:

# Test basic authentication
node tests/simple-test.js

# Test MCP server protocol
node tests/simple-mcp-server.js

Note: Standalone testing requires credentials in .env file.


๐Ÿ” Security

Best Practices

โœ… Environment Variables: All credentials stored in environment variables โœ… No Hardcoded Secrets: No credentials in source code โœ… Git Protection: .gitignore prevents credential commits โœ… Validation: Startup validation ensures all required variables are set โœ… Admin Consent: Application permissions require admin approval

Security Features

  • Application Permissions: Server-to-service authentication (no user prompts)

  • Scoped Access: Limited to configured user account

  • Audit Logging: Use Azure AD audit logs to monitor access

  • Secret Rotation: Rotate client secrets every 90 days (recommended)

Security Documentation

โš ๏ธ Never commit .env files or expose credentials in code!


๐Ÿ› Troubleshooting

Tools Not Appearing in Claude Code

Check:

  1. Path in ~/.claude.json is absolute (not relative)

  2. All environment variables are set in ~/.claude.json env section

  3. Claude Code CLI has been restarted after configuration

  4. Run node office365-sdk.js - should start without errors

Authentication Errors

401 Unauthorized:

  • Verify AZURE_CLIENT_SECRET is correct (use Value, not Secret ID)

  • Check secret hasn't expired in Azure Portal

  • Ensure AZURE_CLIENT_ID and AZURE_AUTHORITY are correct

403 Forbidden:

  • Admin consent not granted - check Azure Portal API permissions

  • Wait 5-10 minutes after granting consent for propagation

  • Verify permissions show "โœ“ Granted" status

Missing Permissions

Error: "Insufficient privileges to complete the operation"

Solution:

  1. Go to Azure Portal โ†’ App registrations โ†’ Your app

  2. API permissions โ†’ Check all required permissions are added

  3. Click "Grant admin consent" again

  4. Verify all show "โœ“ Granted" status

Connection Issues

Server fails to start:

  • Check Node.js version: node --version (need 18+)

  • Reinstall dependencies: rm -rf node_modules && npm install

  • Verify all environment variables are set

  • Check for typos in ~/.claude.json (validate JSON syntax)

For more troubleshooting, see AZURE_PERMISSIONS_SETUP.md


๐Ÿค Contributing

Contributions are welcome! This is an open-source project.

How to Contribute

  1. Fork the repository

  2. Create a feature branch: git checkout -b feature/amazing-feature

  3. Make your changes

  4. Test thoroughly with Claude Code CLI

  5. Commit your changes: git commit -m 'Add amazing feature'

  6. Push to your fork: git push origin feature/amazing-feature

  7. Open a Pull Request

Development Guidelines

  • Follow existing code style (2-space indentation for JavaScript)

  • Add tests for new features

  • Update documentation for new tools

  • No hardcoded credentials in code

  • Use environment variables for configuration

Reporting Issues

Found a bug or have a suggestion? Open an issue

Include:

  • Claude Code CLI version

  • Node.js version

  • Operating system

  • Error messages (remove any credentials!)

  • Steps to reproduce


๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

MIT License

Copyright (c) 2025 eesb99

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

๐Ÿ™ Acknowledgments


๐Ÿ“ž Support & Contact


๐Ÿ“Š Project Stats

  • Version: 2.0.0 (Security Hardened)

  • Total Tools: 45

  • Code Quality: Production Ready

  • Testing: Tested with Claude Code CLI

  • Security Audit: Passed (see FINAL_SECURITY_AUDIT.md)

  • Last Updated: 2025-10-29


๐ŸŒŸ Star History

If you find this project useful, please consider giving it a star on GitHub! โญ


Made with โค๏ธ for the Claude Code community

Available Tools

45 tools
create_calendar_eventC

Create a new calendar event

Inputs: subject (required), start (required), end (required), attendees, +2 more.

create_contactC

Create a new contact

Inputs: displayName (required), emailAddress (required), mobilePhone, companyName, +1 more.

create_draftC

Create an email draft

Inputs: to (required), subject (required), body (required), attachments.

create_folderA

Create a new folder in OneDrive

Inputs: folderName (required), path.

create_inbox_ruleC

Create an automated inbox rule for email organization

Inputs: ruleName (required), conditions (required), actions (required).

create_taskC

Create a new task in a To-Do list

Inputs: listId (required), title (required), dueDateTime, importance.

delete_calendar_eventC

Delete a calendar event

Inputs: eventId (required).

delete_emailB

Delete an email

Inputs: emailId (required).

download_attachmentC

Download a specific email attachment (max 10MB)

Inputs: emailId (required), attachmentId (required).

find_meeting_timesC

Find optimal meeting times based on attendee availability

Inputs: attendees (required), startTime (required), endTime (required), duration.

get_calendar_eventsC

Get upcoming calendar events

Inputs: days.

get_calendar_viewC

Get calendar events in a specific date range

Inputs: startDateTime (required), endDateTime (required).

get_channel_messagesB

Get recent messages from a Teams channel

Inputs: teamId (required), channelId (required), maxResults.

get_email_attachmentsB

List all attachments for a specific email

Inputs: emailId (required).

get_email_detailsA

Get complete email details including full body, recipients, and metadata

Inputs: emailId (required).

get_event_detailsC

Get complete details for a specific calendar event

Inputs: eventId (required).

get_file_contentB

Download file content from OneDrive (max 10MB)

Inputs: fileId (required).

get_file_metadataA

Get file metadata without downloading content

Inputs: fileId (required).

get_folder_emailsC

Get emails from a specific folder (e.g., Sent Items, Archive)

Inputs: folderId (required), maxResults.

get_free_busy_scheduleB

Get free/busy schedule for attendees

Inputs: attendees (required), startTime (required), endTime (required).

get_recent_emailsC

Get recent emails from Office 365

Inputs: count.

list_calendarsB

Get all calendars for the user

Inputs: no named parameters.

list_contactsC

Get all contacts

Inputs: maxResults.

list_drive_itemsC

List files and folders in OneDrive

Inputs: path, orderBy, maxResults.

list_mail_foldersA

Get all mail folders (Inbox, Sent Items, Archive, etc.)

Inputs: no named parameters.

list_tasksC

Get tasks from a specific To-Do list

Inputs: listId (required), maxResults.

list_team_channelsB

Get all channels in a specific team

Inputs: teamId (required).

list_teamsA

Get all teams the user is a member of

Inputs: no named parameters.

list_todo_listsB

Get all To-Do task lists

Inputs: no named parameters.

mark_as_readB

Mark email as read or unread

Inputs: emailId (required), isRead.

move_emailB

Move an email to a different folder

Inputs: emailId (required), destinationFolderId (required).

move_fileB

Move a file or folder to a different location

Inputs: itemId (required), destinationPath (required).

search_contactsA

Search contacts by name, email, or company

Inputs: query (required).

search_emailsC

Search emails with optional text query

Inputs: query, maxResults.

search_filesB

Search for files and folders in OneDrive

Inputs: query (required).

search_in_folderB

Search emails within a specific folder

Inputs: folderId (required), query, maxResults.

send_channel_messageC

Send a message to a Teams channel

Inputs: teamId (required), channelId (required), message (required).

send_chat_messageC

Send a direct chat message

Inputs: chatId (required), message (required).

send_emailB

Send an email via Office 365

Inputs: to (required), subject (required), body (required).

send_email_with_attachmentsC

Send email with file attachments

Inputs: to (required), subject (required), body (required), attachments.

share_fileB

Create a sharing link for a file or folder

Inputs: itemId (required), type, scope.

update_calendar_eventC

Update an existing calendar event

Inputs: eventId (required), updates (required).

update_contactC

Update an existing contact

Inputs: contactId (required), updates (required).

update_taskC

Update an existing task

Inputs: listId (required), taskId (required), updates (required).

upload_fileB

Upload a file to OneDrive (max 4MB)

Inputs: path (required), fileName (required), contentBytes (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelogโ€ฆ

    TDQS

    B3.3/5.0

    Scored across 45 tools

    Disambiguation5/5

    Each tool targets a distinct resource or action with clear descriptions, e.g., send_email vs send_email_with_attachments, search_emails vs search_in_folder. No two tools are ambiguous.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern using underscores (e.g., create_calendar_event, get_recent_emails). No mixing of styles.

    Tool Count4/5

    45 tools is high but justified by covering multiple Office 365 domains (email, calendar, contacts, tasks, OneDrive, Teams). The set is well-scoped, though slightly larger than ideal for coherence.

    Completeness4/5

    Covers most core operations across domains. Minor gaps: missing delete for contacts, tasks, and files; no update for files. Overall, agents can accomplish common tasks.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers