meeting-scheduler-mcp
An MCP server that schedules meetings across organisations by querying free/busy calendars from Google and Microsoft accounts — without exposing anyone's calendar data to the other party.
Works with Claude Desktop, Cursor, and any MCP-compatible client.
How it works
You configure one primary account (the calendar where events are created and invites sent) and one or more shadow accounts (read-only access to query free/busy within another org's tenant).
Claude uses the MCP tools to:
- Find slots where everyone is free
- Book the meeting from your primary calendar
- Reschedule or cancel if plans change
Prerequisites
Google account
- Go to Google Cloud Console → APIs & Services → Credentials
- Create a project (or use an existing one)
- Enable the Google Calendar API
- Create an OAuth client ID — application type: Desktop app
- Download the client ID and client secret
Microsoft / Outlook account
- Go to Azure Portal → App registrations
- Register a new application — supported account types: Accounts in any organizational directory and personal Microsoft accounts
- Under Authentication, add a Mobile and desktop application redirect URI:
http://localhost - Note the Application (client) ID — no client secret needed for delegated auth
Installation
Recommended — zero install via uvx
uvx meeting-scheduler-mcp setup
This runs the setup wizard without permanently installing anything. Once configured, Claude Desktop launches the server automatically using the same uvx command.
Alternative — pip
pip install meeting-scheduler-mcp
meeting-scheduler setup
Setup wizard
Run the wizard once to configure your accounts and authorise them:
$ uvx meeting-scheduler-mcp setup
Meeting Scheduler — Setup Wizard
==================================================
This wizard will:
1. Collect your calendar account details
2. Write ~/.config/meeting-scheduler/config.toml
3. Open a browser to authorise each account
The wizard asks for each account's email, provider (google/microsoft), and OAuth credentials, then opens a browser window for each one.
After setup, re-authorise a single account at any time:
uvx meeting-scheduler-mcp auth you@company.com
Check that all accounts are connected:
uvx meeting-scheduler-mcp status
Claude Desktop configuration
Add this to your Claude Desktop MCP config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"meeting-scheduler": {
"command": "uvx",
"args": ["meeting-scheduler-mcp"]
}
}
}
Restart Claude Desktop. You should see the meeting-scheduler tools available.
Configuration file
The wizard writes ~/.config/meeting-scheduler/config.toml. You can also edit it directly:
[[accounts]]
org = "Acme Corp"
email = "you@acme.com"
provider = "google"
is_primary = true
client_id = "YOUR_GOOGLE_CLIENT_ID.apps.googleusercontent.com"
client_secret = "YOUR_GOOGLE_CLIENT_SECRET"
[[accounts]]
org = "Partner Inc"
email = "you@partner.com"
provider = "microsoft"
is_primary = false
client_id = "YOUR_AZURE_APP_CLIENT_ID"
[rules]
default_duration_minutes = 30
buffer_before_minutes = 0
buffer_after_minutes = 15
default_working_hours_start = "09:00"
default_working_hours_end = "17:00"
working_days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
advance_notice_hours = 24
max_days_ahead = 30
slot_limit = 10
Set MEETING_SCHEDULER_CONFIG to use a different path:
export MEETING_SCHEDULER_CONFIG=/path/to/my-config.toml
Available MCP tools
| Tool | Description |
|---|---|
find_available_slots |
Find free slots for all participants within a time window |
book_meeting |
Create a calendar event and send invites |
reschedule_meeting |
Move an existing event to a new time |
cancel_meeting |
Delete an event |
list_accounts |
Show configured accounts and connection status |
health_check |
Verify all accounts can authenticate |
Token security
Credentials are stored locally and never sent anywhere except the respective calendar provider:
- Google — refresh token is AES-256-GCM encrypted; the encryption key lives in an ACL-locked macOS Keychain item (or DPAPI-protected blob on Windows) that only this process can read
- Microsoft — token cache managed by msal-extensions, stored in macOS Keychain (ACL-locked) or a DPAPI-encrypted file on Windows
Development
git clone https://github.com/shathish/meeting-scheduler-mcp
cd meeting-scheduler-mcp
pip install -e ".[dev]"
pytest tests/
To run the server locally against Claude Desktop, point the config at the repo:
{
"mcpServers": {
"meeting-scheduler": {
"command": "python3",
"args": ["/path/to/meeting-scheduler-mcp/mcp_server.py"]
}
}
}
License
MIT — see LICENSE
Metadata
Release files for meeting-scheduler-mcp 1.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| meeting_scheduler_mcp-1.1.8.tar.gz | 54.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| meeting_scheduler_mcp-1.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 96.9 kB
Release files / meeting_scheduler_mcp-1.1.8.tar.gz
| Download URL | meeting_scheduler_mcp-1.1.8.tar.gz |
|---|---|
| Size | 54.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3fc651a8babcec04be3b3e23a8f5beb94e1f41459161a7b64dc5d51ee235483a
|
|
BLAKE2b-256 checksum How to use checksums |
686c13a49632c813932bb58a0ba932276d58f51fcbd60bb043077431bbf4e665
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|
Release files / meeting_scheduler_mcp-1.1.8-py3-none-any.whl
| Download URL | meeting_scheduler_mcp-1.1.8-py3-none-any.whl |
|---|---|
| Size | 42.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
36918801c8aa95122243bb29c7948ca1f97697d3acea97d4fd8079c18755a28f
|
|
BLAKE2b-256 checksum How to use checksums |
7803cfd693ec5b30a4ecfbfbe58e6156f8fdb0aa5e778f4bc17d4048a8fad98e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.2
|