Labsco
anoopt logo

Outlook Meetings Scheduler

16

from anoopt

Schedule meetings in Microsoft Outlook using the Microsoft Graph API.

🔥🔥🔥✓ VerifiedFreeAdvanced setup

MseeP.ai Security Assessment Badge

Outlook Meetings Scheduler MCP Server

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.

Outlook Meetings Scheduler Server MCP server

Sample queries

  • 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.

Usage with GitHub MCP Server

  • 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.

Demo

Demo

Tools

  1. find-person

    • Find a person's email address by their name
    • Input: name (string)
    • Returns: List of matching people with names and email addresses
  2. create-event

    • 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")
    • Returns: Event details including URL and ID
  3. create-event-with-attendees

    • 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) }
    • Returns: Event details including URL, ID, and attendees list
  4. get-event

    • Get details of a calendar event by its ID
    • Input:
      • eventId (string): ID of the event to retrieve
    • Returns: Detailed event information including subject, time, attendees, and URL
  5. list-events

    • 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
    • Returns: List of calendar events with basic information and IDs
  6. delete-event

    • Delete a calendar event
    • Input:
      • eventId (string): ID of the event to delete
    • Returns: Confirmation of event deletion
  7. update-event

    • 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) }
    • Returns: Updated event details showing changes
  8. update-event-attendees

    • 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
    • Returns: Updated event attendee information

Example Scenarios

Integration with GitHub MCP Server

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.

This will:

  1. Use the GitHub MCP server to create the issue
  2. 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.

This will:

  1. Use GitHub MCP server to find the pull request and identify contributors
  2. Use the Outlook Meetings Scheduler MCP server to schedule a meeting with those team members

Environment Variables

Interactive Mode (Default)

VariableDescriptionRequiredDefault
AUTH_MODEAuthentication modeNointeractive
CLIENT_IDAzure AD Application (Client) IDNoBuilt-in multi-tenant app
TENANT_IDAzure AD Tenant IDNocommon (multi-tenant)
USER_EMAILEmail address of the userNoAuto-detected from signed-in user
REDIRECT_URICustom redirect URINohttp://localhost

Client Credentials Mode

VariableDescriptionRequired
AUTH_MODEAuthentication modeYes
CLIENT_IDAzure AD Application (Client) IDYes
CLIENT_SECRETAzure AD Application Client SecretYes
TENANT_IDAzure AD Tenant IDYes
USER_EMAILEmail address of the user whose calendar to accessYes

Client Provided Token Mode

VariableDescriptionRequiredDefault
AUTH_MODEAuthentication modeYes-
ACCESS_TOKENPre-acquired access tokenYes-
USER_EMAILEmail address of the userYes-
TOKEN_EXPIRES_ONToken expiration date (ISO format)No1 hour from start time

How to Obtain an Access Token

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

Note: The Azure CLI token has broad permissions but may not include specific calendar scopes (Calendars.ReadWrite). For production use, consider methods 3 or 4 below with explicit scope configuration.

2. PowerShell REST API (Recommended for Windows):

# For client credentials flow (app-only) - most reliable method
$clientId = "your-client-id"
$clientSecret = "your-client-secret" 
$tenantId = "your-tenant-id"

$body = @{
    grant_type = "client_credentials"
    client_id = $clientId
    client_secret = $clientSecret
    scope = "https://graph.microsoft.com/.default"
}

$response = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" -Method Post -Body $body
$token = $response.access_token
Write-Host "Access Token: $token"

3. From Your Own Application (Most Reliable):

// Using @azure/identity with specific scopes
import { ClientSecretCredential } from '@azure/identity';

const credential = new ClientSecretCredential(
  'your-tenant-id',
  'your-client-id', 
  'your-client-secret'
);

// Request token with specific Microsoft Graph scopes
const token = await credential.getToken([
  'https://graph.microsoft.com/Calendars.ReadWrite',
  'https://graph.microsoft.com/People.Read', 
  'https://graph.microsoft.com/User.Read'
]);

// Use token.token as your ACCESS_TOKEN
console.log(token.token);

4. Using OAuth2 Device Code Flow (Interactive):

# For personal Microsoft accounts or when you need user consent
curl -X POST \
  https://login.microsoftonline.com/common/oauth2/v2.0/devicecode \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'client_id={your-client-id}&scope=https://graph.microsoft.com/Calendars.ReadWrite https://graph.microsoft.com/People.Read https://graph.microsoft.com/User.Read'

# Follow the device code instructions, then exchange for token
curl -X POST \
  https://login.microsoftonline.com/common/oauth2/v2.0/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=urn:ietf:params:oauth:grant-type:device_code&client_id={your-client-id}&device_code={device-code-from-step-1}'

5. Client Credentials Flow (App-Only):

curl -X POST \
  https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=client_credentials&client_id={client-id}&client_secret={client-secret}&scope=https://graph.microsoft.com/.default'

Important: Ensure your Azure AD app registration has the required delegated or application permissions:

  • Delegated: Calendars.ReadWrite, People.Read, User.Read
  • Application: Calendars.ReadWrite, People.Read.All, User.ReadBasic.All (requires admin consent)

Authentication Mode Details

client_credentials

  • Best for: Automated scenarios, server-to-server communication
  • Requires: CLIENT_ID, CLIENT_SECRET, TENANT_ID, USER_EMAIL
  • Permissions: Application permissions (e.g., Calendars.ReadWrite)
  • Note: Requires admin consent for the application

interactive (Default)

  • Best for: User-impersonation scenarios, delegated access (most common use case)
  • Setup: Zero configuration required - works out of the box
  • Requires: Nothing (uses built-in multi-tenant app)
  • Optional: CLIENT_ID and TENANT_ID for custom app
  • Permissions: Delegated permissions (e.g., Calendars.ReadWrite)
  • Authentication Flow:
    • Attempts browser-based interactive login first
    • Falls back to device code flow if browser auth fails
    • Device code and URL appear in MCP client chat for easy access
    • User will be prompted to authenticate in their browser
  • Note: Uses built-in multi-tenant app (works for any organization)

client_provided_token

  • Best for: Custom token management, integration with existing auth systems
  • Requires: ACCESS_TOKEN, USER_EMAIL
  • Optional: TOKEN_EXPIRES_ON (if not provided, assumes 1-hour validity from start time)
  • Token Sources: Microsoft Graph PowerShell, custom applications, OAuth2 flows, Azure CLI (with limitations)
  • Use Cases: Testing with specific scopes, integration with existing auth flows, CI/CD pipelines, development/debugging
  • Note: Token refresh must be handled externally

Build

# Install dependencies
npm install

# Build the project
npm run build

# Docker build
docker build -t mcp/outlook-meetings-scheduler .

Disclaimer

This MCP server is not affiliated with Microsoft or Microsoft Graph API. Use at your own risk. Ensure you comply with your organization's policies and guidelines when using this tool.