Google Calendar MCP server with full calendar management, allowing you to create, update, and delete events, going beyond the read-only integrations officially offered by ChatGPT and Claude.
The Google Calendar MCP server currently exposes these tools:
list_events— list events in a required time window.search_events— search events by text query in a required time window.create_event— create timed or all-day events.update_event— update timed or all-day events.delete_event— delete an event.find_availability— aggregate busy windows and suggest available slots.
At the time of writing Claude is the recommended choice for custom MCPs. While both use the same API with the same feature set, ChatGPT's connector is situationally limited, notably slower, and constrained by restrictive security policies — these are ChatGPT's own limitations, not issues with this project.
- Google Cloud project with the Google Calendar API enabled (no billing required, setup is described below).
- Valid HTTPS domain.
- Web server with PHP 8.5+.
- If you're familiar with Docker, you can use
compose.ymlsupplied in this repository (based on frankenstack image) by tweaking configuration to your needs.
- If you're familiar with Docker, you can use
- Create a Google Cloud project and enable the Google Calendar API.
- Configure the OAuth consent screen under Google Auth Platform (Branding / Audience / Data Access):
- Audience: set to
External(Internalrequires Google Workspace but also works). - Add your Google account as a test user and leave the app in testing mode.
- Add your domain (e.g.
your-domain.com) under Authorized domains. - Add the following scopes:
openidhttps://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profilehttps://www.googleapis.com/auth/calendar
- Audience: set to
This client is used for the one-time token bootstrap flow to authenticate in Google Calendar.
- Go to Google Auth Platform > Clients > Create client.
- Application type: Web application.
- Name: e.g.
mcp-calendar-bootstrap. - Authorized redirect URI:
https://your-domain.com/oauth/google/bootstrap/callback - Save and copy the
client_idandclient_secret.
Add these to your .env:
GOOGLE_OAUTH_CLIENT_ID=your-client-id
GOOGLE_OAUTH_CLIENT_SECRET=your-client-secret
GOOGLE_OAUTH_REDIRECT_URI=https://your-domain.com/oauth/google/bootstrap/callbackOptionally, override the calendar used by the integration (defaults to primary):
GOOGLE_CALENDAR_DEFAULT_ID=primaryCreate a separate OAuth client for each MCP client (Claude, ChatGPT, or both).
-
Go to Google Auth Platform > Clients > Create client.
-
Application type: Web application.
-
Set Authorized redirect URIs per client:
Claude (e.g.
mcp-claude-auth):https://claude.ai/api/mcp/auth_callbackhttps://claude.com/api/mcp/auth_callback
ChatGPT (e.g.
mcp-chatgpt-auth):https://chatgpt.com/connector_platform_oauth_redirecthttps://platform.openai.com/apps-manage/oauth
-
Save and copy each client's
client_idandclient_secret— you'll need them when connecting the MCP client.
Whitelist the client IDs in .env (comma-separated):
GOOGLE_OAUTH_ALLOWED_AUDIENCES=your-claude-client-id,your-chatgpt-client-id-
Run the bootstrap command:
php artisan app:google-calendar:bootstrap
-
Open the printed URL, sign in with your Google account, and grant access.
-
On success, the app stores token data in
storage/app/mcp/google-calendar-tokens.json.
Check token status at any time:
php artisan app:google-calendar:token:status- Rotate the OAuth client secret in Google Cloud Console.
- Update the corresponding
.envvalues. - Delete
storage/app/mcp/google-calendar-tokens.json. - Re-run the bootstrap flow to obtain a new refresh token.