shade-solutions/calender-mcp
If you are the rightful owner of calender-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
Google Calendar MCP Server is a production-grade Model Context Protocol server designed for Google Calendar, offering a comprehensive suite of tools, resources, and prompts.
Google Calendar MCP Server š
The most comprehensive Model Context Protocol server for Google Calendar with 60+ advanced tools, resources, and prompts. Built on the Smithery TypeScript scaffold and the official MCP SDK.
GitHub: https://github.com/shade-solutions/calender-mcp
Smithery: https://smithery.ai/server/@shade-solutions/calender-mcp/
š Features
Core Calendar Operations
- ā List and manage multiple calendars
- ā Create, read, update, and delete events
- ā Advanced event search and filtering
- ā Calendar sharing and ACL management
- ā Color customization and settings
- ā Guest permissions control
Advanced Scheduling
- š Event templates for quick creation
- š Working location events (office/home/custom)
- š Out of office and focus time blocking
- š Appointment slot generation with buffer time
- š Complex recurring events with exception dates
- š AI-powered optimal meeting time finder
- š Travel time calculation and automatic blocking
- š Smart scheduling based on preferences
Analytics & Insights
- š Time allocation analysis by day/week/month
- š Meeting effectiveness metrics
- š Calendar utilization tracking
- š Automatic event categorization (1:1s, interviews, sync, etc.)
- š Pattern recognition and actionable recommendations
- š Response rate tracking
- š Back-to-back meeting detection
Batch Operations
- ā” Bulk create/update/delete events
- ā” Event duplication across multiple time slots
- ā” Search and replace across all events
- ā” Dry-run mode for safe testing
- ā” Error handling with detailed results
AI-Powered Features
- š¤ Smart event suggestions from text/email
- š¤ Conflict detection with resolution suggestions
- š¤ Natural language event parsing
- š¤ Intelligent meeting time recommendations
- š¤ Event categorization and insights
Import/Export
- š¦ Export to JSON, CSV, and iCal formats
- š¦ Bulk event import
- š¦ Cross-calendar migration support
Availability Management
- šļø Free/busy queries across calendars
- šļø Mutual free time discovery
- šļø Smart scheduling with working hours
- šļø Weekend and holiday exclusions
- šļø Preference-based time scoring
For a complete feature analysis and roadmap, see .
š” Use Cases
- Executive Assistants & Scheduling: Automatically find optimal meeting times, manage multiple calendars, and handle complex scheduling with travel time
- Remote Teams: Set working locations, manage time zones, and find mutual availability across distributed teams
- Sales & Customer Success: Create appointment slots, manage client meetings, and track meeting effectiveness
- Recruiting & HR: Schedule interviews, avoid back-to-back meetings, and analyze calendar utilization
- Product & Engineering: Block focus time, analyze time allocation, and reduce meeting overhead with smart scheduling
- Consultants & Freelancers: Export billable hours, manage multiple client calendars, and automate recurring events
- Event Planners: Batch create events, duplicate series across time slots, and manage complex recurring schedules
- Analytics & Reporting: Generate time allocation reports, identify meeting patterns, and optimize team productivity
For detailed use cases with step-by-step examples, see .
Quick Start
Requirements:
- Node.js 18+
- Google Cloud Project with Calendar API enabled
- OAuth 2.0 credentials or Service Account
Installation:
git clone https://github.com/shade-solutions/calender-mcp.git
cd calender-mcp
npm install
Development:
npm run dev
Then connect a client to http://127.0.0.1:3000/mcp
with configuration parameters (see Configuration below).
Production Build:
npm run build
Configuration
This server supports OAuth and Service Account authentication. Smithery auto-generates a config UI from the schema, or you can pass URL params.
Schema highlights (see src/config.ts
):
authMethod
:oauth
|service_account
(default:oauth
)oauth
: clientId, clientSecret, redirectUri, accessToken, refreshTokenserviceAccount
: jsonKey (entire JSON as string), impersonatedUser (optional)defaultCalendarId
(optional, default:"primary"
)debug
(boolean, default:false
)
Example Configurations
OAuth URL params (dot-notation):
http://127.0.0.1:3000/mcp?authMethod=oauth&oauth.clientId=YOUR_CLIENT_ID&oauth.clientSecret=YOUR_SECRET&oauth.refreshToken=YOUR_REFRESH_TOKEN&defaultCalendarId=primary
Service account example:
http://127.0.0.1:3000/mcp?authMethod=service_account&serviceAccount.jsonKey=%7B...escaped%20JSON...%7D&serviceAccount.impersonatedUser=user@yourdomain.com
Authentication Notes:
- OAuth is recommended for end users. Provide at least
refreshToken
for long-lived sessions. - Service accounts require domain-wide delegation and scopes configured in the Google Admin console to impersonate users.
Complete Tools Reference (60+ Tools)
Basic Calendar Operations (9 tools)
calendar.list_calendars
ā List all accessible calendarscalendar.get
ā Get calendar details by IDcalendars.insert
ā Create a new calendarcalendars.update
ā Update calendar propertiescolors.get
ā Retrieve color definitions for events/calendarssettings.list
ā List user calendar settingsacl.list
ā List access control rulesacl.insert
ā Add ACL rule (share calendar)acl.delete
ā Remove ACL rule
Event Management (10 tools)
events.list
ā List events with advanced filters (time range, search query, max results)events.get
ā Get a single event by IDevents.create
ā Create event with full options (attendees, reminders, recurrence, conference)events.update
ā Update event fieldsevents.delete
ā Delete eventevents.quickAdd
ā Create event from natural language textevents.move
ā Move event between calendarsevents.instances
ā List instances of a recurring eventevents.rsvp
ā Set attendee response status
Advanced Scheduling (7 tools)
templates.create_from_template
ā Create events from predefined templatesevents.set_working_location
ā Set working location (office/home/custom)events.set_out_of_office
ā Block calendar for out of office with auto-declineevents.set_focus_time
ā Schedule focus time blocksscheduling.create_appointment_slots
ā Generate appointment booking slotsevents.create_recurring_with_exceptions
ā Create recurring events with exception datesscheduling.find_optimal_time
ā Find best meeting time with AI scoring
Availability Tools (2 tools)
freebusy.query
ā Query free/busy status across calendarsavailability.find_mutual_free_times
ā Find mutual free time slots with constraints
Analytics Tools (4 tools)
analytics.time_analysis
ā Analyze time allocation with metrics and insightsanalytics.meeting_effectiveness
ā Analyze meeting patterns and effectivenessanalytics.calendar_utilization
ā Calculate calendar utilization percentageanalytics.categorize_events
ā Automatically categorize events by type
Batch Operations (5 tools)
batch.create_events
ā Bulk create multiple eventsbatch.delete_events
ā Bulk delete multiple eventsbatch.update_events
ā Bulk update multiple events with same changesbatch.duplicate_event_series
ā Duplicate event to multiple time slotsbatch.search_and_replace
ā Search and replace text across events (with dry-run)
Integration Tools (4 tools)
export.events_to_format
ā Export events to JSON/CSV/iCalai.suggest_event_from_text
ā Parse text/email and suggest event detailscalendar.block_travel_time
ā Add travel time blocks before/after eventscalendar.detect_conflicts
ā Detect scheduling conflicts with resolution suggestions
Authentication (2 tools)
auth.generate_auth_url
ā Generate OAuth consent URLauth.exchange_code
ā Exchange authorization code for tokens
Resources
Dynamic, queryable resources that provide calendar data:
gcal://events?calendarId=...&timeMin=...&timeMax=...
ā Returns events list JSONgcal://event?calendarId=...&eventId=...
ā Returns single event JSON
See src/resources/gcal.ts
for implementation details.
Prompts
Interactive prompts to guide users through complex workflows:
schedule_meeting
ā Step-by-step guide to find mutual time and schedule meetingsreschedule_meeting
ā Guide for rescheduling with automatic attendee notifications
See src/prompts/scheduling.ts
for implementation details.
Usage Examples
Initialize Session
curl -X POST "http://127.0.0.1:3000/mcp?debug=true" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},"clientInfo":{"name":"test","version":"1.0.0"}}}'
List Events
curl -X POST "http://127.0.0.1:3000/mcp?..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"events.list","arguments":{"calendarId":"primary","singleEvents":true,"timeMin":"2025-01-01T00:00:00Z","timeMax":"2025-01-31T23:59:59Z"}}}'
Create Event with Template
curl -X POST "http://127.0.0.1:3000/mcp?..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"templates.create_from_template","arguments":{"templateName":"standup","summary":"Daily Standup","durationMinutes":15,"calendarId":"primary","startDateTime":"2025-01-10T09:00:00Z"}}}'
Find Optimal Meeting Time
curl -X POST "http://127.0.0.1:3000/mcp?..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"scheduling.find_optimal_time","arguments":{"calendars":["primary","colleague@example.com"],"timeMin":"2025-01-10T09:00:00Z","timeMax":"2025-01-10T18:00:00Z","durationMinutes":60,"avoidEarlyMorning":true}}}'
Analyze Calendar Utilization
curl -X POST "http://127.0.0.1:3000/mcp?..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"analytics.calendar_utilization","arguments":{"calendarId":"primary","startDate":"2025-01-01","endDate":"2025-01-31"}}}'
Batch Create Appointment Slots
curl -X POST "http://127.0.0.1:3000/mcp?..." \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":6,"method":"tools/call","params":{"name":"scheduling.create_appointment_slots","arguments":{"calendarId":"primary","startDate":"2025-01-13","endDate":"2025-01-17","slotDurationMinutes":30,"bufferMinutes":5,"workingHoursStart":"09:00","workingHoursEnd":"17:00","excludeWeekends":true}}}'
Development
Project Structure
src/
āāā tools/
ā āāā calendar/
ā ā āāā basic.ts # Basic calendar operations
ā āāā events.ts # Event management
ā āāā availability.ts # Free/busy and availability
ā āāā advanced-scheduling.ts # Advanced scheduling features
ā āāā analytics.ts # Analytics and insights
ā āāā batch-operations.ts # Bulk operations
ā āāā integrations.ts # Integrations and exports
ā āāā auth.ts # Authentication tools
āāā auth/
ā āāā google.ts # Google OAuth/Service Account
āāā utils/
ā āāā schemas.ts # Zod validation schemas
āāā resources/
ā āāā gcal.ts # Dynamic resources
āāā prompts/
ā āāā scheduling.ts # Interactive prompts
āāā config.ts # Configuration schema
āāā index.ts # Main server entry
Best Practices Used
- Type Safety: Full TypeScript with Zod validation
- Error Handling: Comprehensive error catching in batch operations
- Dry-Run Support: Safe testing mode for destructive operations
- Extensible Architecture: Modular tool registration system
- Input Validation: Zod schemas for all tool inputs
- Comprehensive Logging: Debug mode with detailed output
- RESTful Design: Consistent naming and patterns
- Documentation: JSDoc comments and detailed README
Adding New Tools
- Create a new file in
src/tools/
(e.g.,my-feature.ts
) - Define Zod schemas in
src/utils/schemas.ts
- Implement tool registration function:
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
import { z } from "zod"
import type { ServerConfig } from "../config.js"
export function registerMyFeature(server: McpServer, config: ServerConfig) {
server.registerTool(
"my.tool_name",
{
title: "My Tool",
description: "Description of what it does",
inputSchema: {
param1: z.string(),
param2: z.number().optional(),
},
},
async (args: any) => {
// Implementation
return {
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
}
}
)
}
- Register in
src/index.ts
:
import { registerMyFeature } from "./tools/my-feature.js"
// ...
registerMyFeature(server, config)
Security and Privacy
- ā No secrets are persisted by the server
- ā Client passes config per session
- ā OAuth tokens are refreshed automatically
- ā Service account keys are never logged
- ā Prefer using refresh tokens over access tokens
- ā Consider gateway/OAuth via Smithery for production
- ā Supports domain-wide delegation for service accounts
Security Best Practices:
- Never commit credentials to version control
- Use environment variables for sensitive data
- Implement least-privilege scopes
- Rotate service account keys regularly
- Monitor OAuth token usage
- Use HTTPS in production environments
Roadmap
Planned enhancements aligned with :
Phase 1 (Completed ā )
- ā Advanced scheduling features
- ā Analytics and insights
- ā Batch operations
- ā AI-powered features
- ā Integration tools
Phase 2 (In Progress)
- š Video conference integration (Zoom, Teams, Meet)
- š Slack notifications
- š CRM system sync
- š Payment processing for appointments
- š Multi-language support
Phase 3 (Planned)
- š Advanced RBAC and permissions
- š Audit logs and compliance reporting
- š Real-time collaboration features
- š Mobile app integration
- š Custom dashboards
Contributing
Contributions are welcome! This project follows best practices for open-source contributions:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
Contribution Guidelines:
- Follow TypeScript best practices
- Add Zod validation for all inputs
- Include JSDoc comments for functions
- Write comprehensive error handling
- Test with both OAuth and Service Account auth
- Update documentation for new features
License
ISC License - see LICENSE file for details
Support
- GitHub Issues: https://github.com/shade-solutions/calender-mcp/issues
- Documentation: See
docs/
folder for comprehensive guides - Smithery: https://smithery.ai/server/@shade-solutions/calender-mcp/
Acknowledgments
- Built with Smithery TypeScript scaffold
- Powered by MCP SDK
- Uses Google Calendar API v3
- Community feedback from 100+ calendar integration implementations
Made with ā¤ļø by the open-source community
ā If you find this useful, please star the repository!