home / mcp / google calendar mcp server
Streamable HTTP MCP server for Google Calendar to manage events, check availability, and schedule meetings across calendars.
Configuration
View docs{
"mcpServers": {
"iceener-google-calendar-streamable-mcp-server": {
"url": "http://127.0.0.1:3000/mcp",
"headers": {
"RS_TOKENS_ENC_KEY": "BASE64_ENCODED_KEY",
"OAUTH_REDIRECT_URI": "http://127.0.0.1:3001/oauth/callback",
"PROVIDER_CLIENT_ID": "YOUR_CLIENT_ID",
"PROVIDER_CLIENT_SECRET": "YOUR_CLIENT_SECRET",
"OAUTH_REDIRECT_ALLOWLIST": "alice://oauth/callback,http://127.0.0.1:3001/oauth/callback"
}
}
}
}This Google Calendar MCP Server lets you manage events, check availability, and schedule meetings across all calendars through an MCP client. It supports local Node/Bun setups as well as remote Cloudflare Worker deployments, with OAuth 2.1 PKCE for secure access. Use it to search calendars, create and update events, add Google Meet links, and handle invitations in a streamlined MCP workflow.
You connect your MCP client to the Google Calendar MCP Server to search across calendars, create events, check availability, and handle invitations. When you run in local mode, start the MCP server and use an MCP client to point at the local endpoint. When you run in remote mode, deploy the Cloudflare Worker and point your MCP client at the worker URL. Every event returned includes the calendar it belongs to, so you can filter, update, or delete with confidence.
Common workflows you can perform: search events across all calendars, create events with optional Google Meet links, check availability before scheduling, and respond to invitations. Use natural language input to create events like βLunch tomorrow at noonβ or provide structured details such as title, start, end, attendees, and recurrence. All actions respect the access you have for each calendar and provide feedback about the calendar that contains the affected event.
Prerequisites: you need Bun and Node.js 20+ installed locally. You also need a Google Cloud project with Calendar API access for OAuth.
# 1) Clone the project and install runtime dependencies
git clone <repo>
cd google-calendar-mcp
bun install
# 2) Create and configure environment
cp env.example .envEdit the .env with your OAuth credentials and redirect settings.
PORT=3000
AUTH_ENABLED=true
PROVIDER_CLIENT_ID=your_client_id
PROVIDER_CLIENT_SECRET=your_client_secret
OAUTH_SCOPES=https://www.googleapis.com/auth/calendar.events https://www.googleapis.com/auth/calendar.readonly
OAUTH_REDIRECT_URI=http://127.0.0.1:3001/oauth/callback
OAUTH_REDIRECT_ALLOWLIST=alice://oauth/callback,http://127.0.0.1:3001/oauth/callbackRun the server locally with OAuth available on port 3001 for the authorization flow and port 3000 for MCP endpoints.
bun dev
# MCP: http://127.0.0.1:3000/mcp
# OAuth: http://127.0.0.1:3001Configure your MCP client to connect to the local MCP endpoint or to a remote worker endpoint as shown in the client examples.
Two main deployment modes are supported: local Node/Bun development for quick testing and a remote Cloudflare Worker for production access.
Local development and OAuth flow use port 3000 for MCP and port 3001 for the OAuth authorization server.
Cloudflare Worker deployment provides a remote MCP endpoint at a worker URL. You should add the worker's redirect URI to your Google Cloud OAuth app's allowed redirect URIs.
Pre-authentication is recommended for clients with short timeouts. You can pre-authenticate your MCP client to cache tokens before starting interactive sign-in.
Use OAuth with PKCE for secure token flow. Tokens can be encrypted at rest using a 32-byte key and stored securely in your chosen storage backend. If you deploy to production, enable TLS, token validation, strict origin checks, and proper audit logging.
Create an event with a Google Meet link and attendees.
Check availability before scheduling to avoid conflicts.
Discover available calendars and IDs so you know what calendars you can query.
Search across calendars by default, returning merged events with their originating calendar information.
Check free/busy status across calendars to identify open times before scheduling.
Create events using natural language or structured input, with optional Google Meet links.
Update or move existing events across calendars.
Delete events from a calendar.
Accept, decline, or tentatively respond to invitations.