Outlook Meetings Scheduler
About
Schedule meetings in Microsoft Outlook using the Microsoft Graph API.
Details
- Author
- anoopt
- Categories
- Productivity, Other
Jump to
Setup
Install Outlook Meetings Scheduler in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/anoopt/outlook-meetings-scheduler-mcp-server
Follow the installation instructions in the repository README, then restart your MCP client.
Schedule meetings in Microsoft Outlook using the Microsoft Graph API.
MCP Server for scheduling meetings in Microsoft Outlook using Microsoft Graph API.
This MCP server allows you to create calendar events, create events with attendees (including finding their email addresses). It integrates seamlessly with other MCP servers, such as the GitHub MCP server, to enhance your workflow.
- Schedule a meeting with Sarah for tomorrow at 3 PM.
- Create a meeting called "Project Kickoff" for tomorrow at 2 PM. Add Megan and John as required attendees.
- Create an issue in the organization/repo repository titled "Fix pagination bug in user dashboard" with the description "Users report seeing duplicate entries when navigating between pages." Then schedule a calendar reminder for me to review this issue tomorrow at 3 PM.
- Find a person's email address by their name
- Input:name(string)
- Returns: List of matching people with names and email addresses
- Create a calendar event using Microsoft Graph API
- Inputs:
- subject(string): Subject of the calendar event
- body(string): Content/body of the calendar event
- start(optional): ISO format datetime (e.g., 2025-04-20T12:00:00)
- end(optional): ISO format datetime (e.g., 2025-04-20T13:00:00)
- timeZone(optional): Time zone for the event (default: "GMT Standard Time")
- Create a calendar event with attendees using Microsoft Graph API
- Inputs:
- subject(string): Subject of the calendar event
- body(string): Content/body of the calendar event
- start(optional): ISO format datetime (e.g., 2025-04-20T12:00:00)
- end(optional): ISO format datetime (e.g., 2025-04-20T13:00:00)
- timeZone(optional): Time zone for the event (default: "GMT Standard Time")
- location(optional): Location of the event
- attendees: Array of { email, name (optional), type (optional) }
- Get details of a calendar event by its ID
- Input:
- eventId(string): ID of the event to retrieve
- List calendar events with optional filtering
- Inputs:
- subject(optional): Filter events by subject containing this text
- startDate(optional): Start date in ISO format (e.g., 2025-04-20T00:00:00) to filter events from
- endDate(optional): End date in ISO format (e.g., 2025-04-20T23:59:59) to filter events until
- maxResults(optional): Maximum number of events to return
- Delete a calendar event
- Input:
- eventId(string): ID of the event to delete
- Update an existing calendar event
- Inputs:
- eventId(string): ID of the event to update
- subject(optional): New subject for the calendar event
- body(optional): New content/body for the calendar event
- start(optional): New start time in ISO format (e.g., 2025-04-20T12:00:00)
- end(optional): New end time in ISO format (e.g., 2025-04-20T13:00:00)
- timeZone(optional): New time zone for the event
- location(optional): New location for the event
- attendees(optional): Array of { email, name (optional), type (optional) }
- Add or remove attendees from a calendar event
- Inputs:
- eventId(string): ID of the event to update
- addAttendees(optional): Array of attendees to add: { email, name (optional), type (optional) }
- removeAttendees(optional): Array of email addresses to remove from the event
This MCP server supports three authentication modes:
Best for: User-impersonation scenarios, accessing user-specific data
- Prompts user to login interactively
- Uses delegated permissions
- Authenticates as the signed-in user
Best for: Server-to-server scenarios, automated processes
- Uses Azure AD application credentials
- Requires Application permissions
- Works without user interaction
Best for: Custom token management, pre-acquired tokens
- Uses a token provided by the client
- Requires managing token refresh externally
- Register an application in theMicrosoft Azure Portal(or use an existing app)
- Add a redirect URI:http://localhost(Mobile and desktop applications platform)
- Enable public client flows: Go to Authentication > Advanced settings > "Allow public client flows" =YES
- Grant necessaryDelegated permissions: Microsoft Graph API > Delegated permissions > Calendars.ReadWrite, People.Read, User.Read
- Note your Client ID and Tenant ID (Client Secret not needed for interactive mode with custom app)
Note:The server uses a built-in multi-tenant app by default, so custom app setup is optional. When authentication is needed, the device code and login URL will appear directly in your MCP client chat interface.
- Register an application in theMicrosoft Azure Portal
- Create a client secret
- Grant necessaryApplication permissions: Microsoft Graph API > Application permissions > Calendars.ReadWrite, People.Read.All, User.ReadBasic.All
- Grant admin consent for your organization
- Note your Client ID, Client Secret, and Tenant ID
The MCP server supports different authentication modes via theAUTH_MODEenvironment variable:
- interactive(default) - User authentication with browser or device code flow
- client_credentials- App-only authentication with client secret
- client_provided_token- Use a pre-acquired token
Backward Compatibility: IfAUTH_MODEis not specified, the server automatically detects the mode:
- Presence ofCLIENT_SECRET→client_credentialsmode
- Presence ofACCESS_TOKEN→client_provided_tokenmode
- Neither present →interactivemode (default)
You can run the MCP server directly with Node.js from your local build:
- Clone the repository and build the project:
git clone https://github.com/anoopt/outlook-meetings-scheduler-mcp-server.git cd outlook-meetings-scheduler-mcp-server npm install npm run build
- For manual installation, add the following JSON block to your User Settings (JSON) file in VS Code. You can do this by pressingCtrl + Shift + Pand typing Preferences:Open User Settings (JSON).
Optionally, you can add it to a file called.vscode/mcp.jsonin your workspace. This will allow you to share the configuration with others:
Interactive Mode (Default - Zero Configuration):
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "node", "args": [ "/path/to/outlook-meetings-scheduler-mcp-server/build/index.js" ] } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "node", "args": [ "/path/to/outlook-meetings-scheduler-mcp-server/build/index.js" ], "env": { "AUTH_MODE": "interactive", "CLIENT_ID": "<YOUR_CLIENT_ID>", "TENANT_ID": "<YOUR_TENANT_ID>" } } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "node", "args": [ "/path/to/outlook-meetings-scheduler-mcp-server/build/index.js" ], "env": { "AUTH_MODE": "client_credentials", "CLIENT_ID": "<YOUR_CLIENT_ID>", "CLIENT_SECRET": "<YOUR_CLIENT_SECRET>", "TENANT_ID": "<YOUR_TENANT_ID>", "USER_EMAIL": "<YOUR_EMAIL>" } } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "node", "args": [ "/path/to/outlook-meetings-scheduler-mcp-server/build/index.js" ], "env": { "AUTH_MODE": "client_provided_token", "ACCESS_TOKEN": "<YOUR_ACCESS_TOKEN>", "TOKEN_EXPIRES_ON": "2025-10-03T12:00:00Z", "USER_EMAIL": "<YOUR_EMAIL>" } } } }
- Uses a built-in multi-tenant Azure AD app (works for any organization)
- USER_EMAIL is automatically determined from the signed-in user
- Users will see a one-time consent prompt (no admin approval needed)
- Zero configuration required - works out of the box
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "node", "args": [ "/path/to/outlook-meetings-scheduler-mcp-server/build/index.js" ], "env": { "AUTH_MODE": "interactive", "CLIENT_ID": "<YOUR_CLIENT_ID>", "TENANT_ID": "<YOUR_TENANT_ID>" } } } }
Use a custom app if you need specific branding or tenant restrictions.
Replace/path/to/outlook-meetings-scheduler-mcp-serverwith the absolute path to your cloned repository.
Run the MCP server using Docker locally. Build the Docker image with the following command:
docker build -t mcp/outlook-meetings-scheduler .
For manual installation, add the following JSON block to your User Settings (JSON) file in VS Code. You can do this by pressingCtrl + Shift + Pand typing Preferences:Open User Settings (JSON).
Optionally, you can add it to a file called.vscode/mcp.jsonin your workspace. This will allow you to share the configuration with others.
{ "inputs": [ { "type": "promptString", "id": "client_secret", "description": "Enter the client secret", "password": true } ], "servers": { "outlook-meetings-scheduler": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "CLIENT_ID", "-e", "CLIENT_SECRET", "-e", "TENANT_ID", "-e", "USER_EMAIL", "mcp/outlook-meetings-scheduler" ], "env": { "USER_EMAIL": "<YOUR_EMAIL>", "CLIENT_ID": "<YOUR_CLIENT_ID>", "CLIENT_SECRET": "${input:client_secret}", "TENANT_ID": "<YOUR_TENANT_ID>" } } } }
Interactive Mode (Default - Zero Configuration):
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ] } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ], "env": { "AUTH_MODE": "interactive", "CLIENT_ID": "<YOUR_CLIENT_ID>", "TENANT_ID": "<YOUR_TENANT_ID>" } } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ], "env": { "AUTH_MODE": "client_credentials", "CLIENT_ID": "<YOUR_CLIENT_ID>", "CLIENT_SECRET": "<YOUR_CLIENT_SECRET>", "TENANT_ID": "<YOUR_TENANT_ID>", "USER_EMAIL": "<YOUR_EMAIL>" } } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ], "env": { "AUTH_MODE": "client_provided_token", "ACCESS_TOKEN": "<YOUR_ACCESS_TOKEN>", "TOKEN_EXPIRES_ON": "2025-10-03T12:00:00Z", "USER_EMAIL": "<YOUR_EMAIL>" } } } }
- Run the MCP server using Docker locally. Build the Docker image with the following command:
docker build -t mcp/outlook-meetings-scheduler .
- Add the following to yourclaude_desktop_config.json:
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "CLIENT_ID", "-e", "CLIENT_SECRET", "-e", "TENANT_ID", "-e", "USER_EMAIL", "mcp/outlook-meetings-scheduler" ], "env": { "CLIENT_ID": "<YOUR_CLIENT_ID>", "CLIENT_SECRET": "<YOUR_CLIENT_SECRET>", "TENANT_ID": "<YOUR_TENANT_ID>", "USER_EMAIL": "<YOUR_EMAIL>" } } } }
Interactive Mode (Default - Zero Configuration):
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ] } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ], "env": { "AUTH_MODE": "interactive", "CLIENT_ID": "<YOUR_CLIENT_ID>", "TENANT_ID": "<YOUR_TENANT_ID>" } } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ], "env": { "AUTH_MODE": "client_credentials", "CLIENT_ID": "<YOUR_CLIENT_ID>", "CLIENT_SECRET": "<YOUR_CLIENT_SECRET>", "TENANT_ID": "<YOUR_TENANT_ID>", "USER_EMAIL": "<YOUR_EMAIL>" } } } }
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ], "env": { "AUTH_MODE": "client_provided_token", "ACCESS_TOKEN": "<YOUR_ACCESS_TOKEN>", "TOKEN_EXPIRES_ON": "2025-10-03T12:00:00Z", "USER_EMAIL": "<YOUR_EMAIL>" } } } }
You can combine this MCP server with other MCP servers like the GitHub MCP server for powerful workflows.
Create an Issue and Schedule a Follow-up Review
Create an issue in the organization/repo repository titled "Fix pagination bug in user dashboard" with the description "Users report seeing duplicate entries when navigating between pages." Then schedule a calendar reminder for me to review this issue tomorrow at 3 PM.
- Use the GitHub MCP server to create the issue
- Use the Outlook Meetings Scheduler MCP server to create a calendar event for the review
Schedule a Code Review Meeting Based on a Pull Request
Find the open PR about the authentication feature in the organization/app-backend repository and schedule a code review meeting with the contributors for tomorrow morning.
- Use GitHub MCP server to find the pull request and identify contributors
- Use the Outlook Meetings Scheduler MCP server to schedule a meeting with those team members
To use both GitHub and Outlook MCP servers together :
{ "mcpServers": { "outlook-meetings-scheduler": { "command": "npx", "args": [ "-y", "outlook-meetings-scheduler" ], "env": { "CLIENT_ID": "<YOUR_CLIENT_ID>", "CLIENT_SECRET": "<YOUR_CLIENT_SECRET>", "TENANT_ID": "<YOUR_TENANT_ID>", "USER_EMAIL": "<YOUR_EMAIL>" } }, "github": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/github-mcp" ], "env": { "GITHUB_TOKEN": "<YOUR_GITHUB_TOKEN>" } } } }
I need to schedule a meeting with John Smith. Can you find his email address?
Schedule a meeting titled "Weekly Team Sync" for next Monday at 10 AM with the following agenda: - Project updates - Resource allocation - Questions and concerns
Scheduling a Meeting with Single Attendee
Schedule a 1:1 meeting with Sarah for tomorrow at 3 PM.
This will find Sarah's email address and create a calendar event. To find Sarah's email address, the MCP server will use thefind-persontool - which uses the Microsoft Graph API to find relevant people forUSER_EMAILor searches for the name in the organization.
Scheduling a Meeting with Multiple Attendees
Create a meeting called "Project Kickoff" for tomorrow at 2 PM. Add sarah.jones@example.com and mike.thompson@example.com as required attendees. The agenda is: 1. Project overview 2. Timeline discussion 3. Role assignments 4. Next steps
You can obtain an access token through several methods:
1. Azure CLI (For Microsoft Graph - Recommended for testing):
# Login to Azure az login # Get token specifically for Microsoft Graph with correct scopes az account get-access-token --resource=https://graph.microsoft.com --query accessToken --output tsv
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.




