MCP Outlook Scheduler
Enables AI assistants to intelligently schedule meetings by checking Microsoft Outlook calendars, finding available time slots across multiple participants, and automatically booking meetings with Teams integration. Uses Microsoft Graph API with smart fallback logic for optimal scheduling.
README
MCP Outlook Scheduler
An MCP (Model Context Protocol) server that connects to Microsoft Outlook via Microsoft Graph to schedule meetings among multiple participants by checking their calendars and proposing or booking the earliest viable time slots.
Features
- Smart Meeting Scheduling: Uses Microsoft Graph's
findMeetingTimesAPI when available, with fallback to local intersection logic - Multi-Participant Support: Check availability across N participants and find common free time slots
- Flexible Constraints: Support for working hours, buffer times, minimum attendance requirements, and timezone handling
- Automatic Booking: Create Outlook calendar events with Teams integration
- MCP Integration: Exposes tools for AI assistants to schedule meetings programmatically
Prerequisites
- Node.js 20+
- Microsoft 365 account with Exchange Online
- Azure AD application registration (for authentication)
Setup
1. Azure Application Registration
- Go to Azure Portal → Azure Active Directory → App registrations
- Click "New registration"
- Enter a name (e.g., "MCP Outlook Scheduler")
- Select "Accounts in this organizational directory only" for single tenant, or "Accounts in any organizational directory" for multi-tenant
- Click "Register"
2. Configure API Permissions
-
In your app registration, go to "API permissions"
-
Click "Add a permission" → "Microsoft Graph"
-
Add these Application permissions (for app-only auth) or Delegated permissions (for user auth):
Calendars.Read- Read calendar availabilityCalendars.ReadWrite- Create and manage calendar eventsUser.Read- Read user informationOnlineMeetings.ReadWrite- Create Teams meetings (optional)
-
Click "Grant admin consent" (requires admin privileges)
3. Get Application Credentials
- Go to "Certificates & secrets" → "Client secrets"
- Create a new client secret and copy the value
- Copy the Application (client) ID from the Overview page
- Copy the Directory (tenant) ID from the Overview page
4. Environment Configuration
- Copy
env.exampleto.env - Fill in your Azure application details:
# Microsoft Graph Configuration
GRAPH_TENANT_ID=your_tenant_id_or_common
GRAPH_CLIENT_ID=your_app_id
GRAPH_CLIENT_SECRET=your_client_secret
GRAPH_AUTH_MODE=app # or 'delegated' for user auth
# Default Organizer
GRAPH_ORGANIZER_EMAIL=organizer@yourdomain.com
# Time Zone and Server Settings
DEFAULT_TIMEZONE=Asia/Dubai
PORT=7337
# Token Cache
TOKEN_CACHE_PATH=.tokens.json
# Logging
LOG_LEVEL=info
5. Install Dependencies
npm install
6. Build and Run
# Development mode
npm run dev
# Build and run production
npm run build
npm start
MCP Tools
The server exposes the following tools:
1. health_check
Check server health and authentication status.
Input: None
Output:
{
"ok": true,
"graphScopes": ["Calendars.Read", "Calendars.ReadWrite"],
"organizer": "organizer@example.com"
}
2. get_availability
Get free/busy availability for multiple participants.
Input:
{
"participants": ["user1@example.com", "user2@example.com"],
"windowStart": "2025-01-15T09:00:00+04:00",
"windowEnd": "2025-01-15T17:00:00+04:00",
"granularityMinutes": 30,
"workHoursOnly": true,
"timeZone": "Asia/Dubai"
}
Output:
{
"timeZone": "Asia/Dubai",
"users": [
{
"email": "user1@example.com",
"workingHours": {
"start": "09:00",
"end": "17:00",
"days": [1, 2, 3, 4, 5]
},
"busy": [
{
"start": "2025-01-15T10:00:00+04:00",
"end": "2025-01-15T11:00:00+04:00",
"subject": "Team Meeting"
}
],
"free": [
{
"start": "2025-01-15T09:00:00+04:00",
"end": "2025-01-15T10:00:00+04:00"
}
]
}
]
}
3. propose_meeting_times
Find available meeting time slots for participants.
Input:
{
"participants": ["user1@example.com", "user2@example.com", "user3@example.com"],
"durationMinutes": 45,
"windowStart": "2025-01-15T06:00:00+04:00",
"windowEnd": "2025-01-20T20:00:00+04:00",
"maxCandidates": 5,
"bufferBeforeMinutes": 10,
"bufferAfterMinutes": 10,
"workHoursOnly": true,
"minRequiredAttendees": 3,
"timeZone": "Asia/Dubai"
}
Output:
{
"source": "graph_findMeetingTimes",
"candidates": [
{
"start": "2025-01-17T10:00:00+04:00",
"end": "2025-01-17T10:45:00+04:00",
"attendeeAvailability": {
"user1@example.com": "free",
"user2@example.com": "free",
"user3@example.com": "free"
},
"confidence": 1.0
}
]
}
4. book_meeting
Create a calendar event and invite attendees.
Input:
{
"subject": "Q3 Planning Sync",
"participants": ["user1@example.com", "user2@example.com", "user3@example.com"],
"start": "2025-01-17T10:00:00+04:00",
"end": "2025-01-17T10:45:00+04:00",
"onlineMeeting": true,
"location": "Teams",
"allowConflicts": false,
"remindersMinutesBeforeStart": 10
}
Output:
{
"eventId": "AAMkAGI2TG93AAA=",
"iCalUid": "040000008200E00074C5B7101A82E00800000000",
"webLink": "https://outlook.office365.com/owa/?itemid=AAMkAGI2TG93AAA%3D",
"organizer": "organizer@example.com"
}
5. cancel_meeting
Cancel an existing meeting.
Input:
{
"eventId": "AAMkAGI2TG93AAA=",
"comment": "Meeting cancelled due to scheduling conflict"
}
Output:
{
"cancelled": true,
"eventId": "AAMkAGI2TG93AAA="
}
Scheduling Logic
Primary Method: Microsoft Graph findMeetingTimes
The server first attempts to use Microsoft Graph's findMeetingTimes API, which provides intelligent meeting scheduling with:
- Conflict detection
- Working hours consideration
- Attendee preferences
- Travel time calculation (when available)
Fallback Method: Local Intersection
When findMeetingTimes is unavailable (due to tenant policies, insufficient permissions, or API limitations), the server falls back to local intersection logic:
- Fetch free/busy data for each participant
- Apply buffer times and working hour constraints
- Compute intersecting free time slots
- Rank candidates by:
- Earliest start time
- Least fragmented calendars
- Maximum attendee availability
Configuration Options
Authentication Modes
- Delegated: User authentication via device code flow (recommended for personal use)
- Application: Service principal authentication (recommended for production/automation)
Timezone Handling
- All internal calculations use UTC
- Input/output times include timezone offsets (ISO 8601 format)
- Working hours are interpreted in the specified timezone
Working Hours
- Default: Monday-Friday, 9:00 AM - 5:00 PM
- Can be overridden per user via mailbox settings
- Configurable via
workHoursOnlyparameter
Error Handling
The server provides consistent error responses:
{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable error message",
"details": "Additional error context"
}
}
Common error codes:
INVALID_INPUT: Input validation failedAUTHENTICATION_FAILED: Microsoft Graph authentication errorINSUFFICIENT_PERMISSIONS: Missing required API permissionsSCHEDULING_CONFLICT: No common free time slots foundBOOKING_FAILED: Failed to create calendar event
Development
Running Tests
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test -- --coverage
Code Quality
# Lint code
npm run lint
# Format code
npm run format
Building
# Build TypeScript
npm run build
# Clean build artifacts
npm run clean
Architecture
src/
├── index.ts # Server bootstrap
├── mcp.ts # MCP tool registration
├── config.ts # Configuration management
├── types.ts # Zod schemas and types
├── graph/
│ ├── auth.ts # OAuth authentication
│ └── client.ts # Graph client factory
├── scheduling/
│ ├── availability.ts # Free/busy data processing
│ ├── intersect.ts # Time slot intersection
│ ├── find.ts # Meeting time discovery
│ └── book.ts # Calendar event management
└── utils/
└── time.ts # Timezone and interval utilities
Troubleshooting
Authentication Issues
- Invalid client secret: Regenerate the client secret in Azure
- Insufficient permissions: Ensure admin consent is granted for all required permissions
- Tenant restrictions: Check if your tenant allows the required Graph API calls
Scheduling Issues
-
No meeting times found:
- Verify participants have accessible calendars
- Check if working hours are too restrictive
- Ensure the time window is reasonable
-
Graph API fallback:
- The server automatically falls back to local intersection when
findMeetingTimesfails - Check logs for fallback reasons
- The server automatically falls back to local intersection when
Performance Issues
- Slow availability checks:
- Reduce the number of participants
- Use smaller time windows
- Consider caching availability data
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Ensure all tests pass
- Submit a pull request
License
MIT License - see LICENSE file for details.
Support
For issues and questions:
- Check the troubleshooting section
- Review Microsoft Graph API documentation
- Open an issue on GitHub
Changelog
v1.0.0
- Initial release
- MCP server with 5 core tools
- Microsoft Graph integration
- Local intersection fallback
- Comprehensive test coverage
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。