Google Calendar MCP Server
This is a Model Context Protocol (MCP) server that provides integration with Google Calendar. It allows LLMs to read, create, update and search for calendar events through a standardized interface.
Example Usage
Along with the normal capabilities you would expect for a calendar integration you can also do really dynamic, multi-step processes like:
Add events from screenshots and images:
Add this event to my calendar based on the attached screenshot.
Supported image formats: PNG, JPEG, GIFImages can contain event details like date, time, location, and description
Calendar analysis:
What events do I have coming up this week that aren't part of my usual routine?
Check attendance:
Which events tomorrow have attendees who have not accepted the invitation?
Auto coordinate events:
Here's some available that was provided to me by someone. Take a look at the available times and create an event that is free on my work calendar.
Provide your own availability:
Please provide availability looking at both my personal and work calendar for this upcoming week. Choose times that work well for normal working hours on the East Coast. Meeting time is 1 hour
Requirements
- Node.js (Latest LTS recommended)
- TypeScript 5.3 or higher
- A Google Cloud project with the Calendar API enabled
- OAuth 2.0 credentials (Client ID and Client Secret)
Google Cloud Setup
- Go to the Google Cloud Console
- Create a new project or select an existing one.
- Enable the Google Calendar API for your project. Ensure that the right project is selected from the top bar before enabling the API.
- Create OAuth 2.0 credentials:
- Go to Credentials
- Click "Create Credentials" > "OAuth client ID"
- Choose "User data" for the type of data that the app will be accessing
- Add your app name and contact information
- Add the following scopes (optional):
https://www.googleapis.com/auth/calendar.events
(or broaderhttps://www.googleapis.com/auth/calendar
if needed)
- Select "Desktop app" as the application type
- Add your email address as a test user under the OAuth Consent screen
- Note: it will take a few minutes for the test user to be added. The OAuth consent will not allow you to proceed until the test user has propogated.
- Note about test mode: While an app is in test mode the auth tokens will expire after 1 week and need to be refreshed by running
npm run auth
.
Installation
- Clone the repository
- Install dependencies (this also builds the js via postinstall):
npm install
- Download your Google OAuth credentials from the Google Cloud Console (under "Credentials") and rename the file to
gcp-oauth.keys.json
and place it in the root directory of the project.- Ensure the file contains credentials for a "Desktop app".
- Alternatively, copy the provided template file:
cp gcp-oauth.keys.example.json gcp-oauth.keys.json
and populate it with your credentials from the Google Cloud Console.
Available Scripts
npm run build
- Build the TypeScript code (compilessrc
tobuild
)npm run typecheck
- Run TypeScript type checking without compilingnpm run start
- Start the compiled server (usingnode build/index.js
)npm run dev
- Start the server in development mode using ts-node (watches for changes)npm run auth
- Manually start the authentication server for Google OAuth flow (useful if automatic flow fails or for testing)npm test
- Run the unit/integration test suite using Vitestnpm run test:watch
- Run tests in watch modenpm run coverage
- Run tests and generate a coverage report
Authentication
The server supports both automatic and manual authentication flows:
Automatic Authentication (Recommended)
- Place your Google OAuth credentials in
gcp-oauth.keys.json
. - Start the MCP server:
npm start
ornpm run dev
. - If no valid authentication tokens are found in
.gcp-saved-tokens.json
, the server will automatically:- Start an authentication server (on ports 3000-3004 by default)
- Open a browser window for the OAuth flow
- Save the tokens securely to
.gcp-saved-tokens.json
once authenticated - Shut down the auth server
- Continue normal MCP server operation
The server automatically manages token refresh.
Manual Authentication
Run npm run auth
to start only the authentication server. Authenticate via the browser, and the tokens will be saved.
Testing
Unit and integration tests are implemented using Vitest.
- Run tests:
npm test
- Run tests in watch mode:
npm run test:watch
- Generate coverage report:
npm run coverage
Tests mock external dependencies (Google API, filesystem) to ensure isolated testing of server logic and handlers.
Security Notes
- The server runs locally and requires OAuth authentication.
- OAuth credentials (
gcp-oauth.keys.json
) and saved tokens (.gcp-saved-tokens.json
) should never be committed to version control. Ensure they are added to your.gitignore
file. - For production use, consider getting your OAuth application verified by Google.
Usage with Claude Desktop
Add this configuration to your Claude Desktop config file. E.g.
/Users/<user>/Library/Application Support/Claude/claude_desktop_config.json
:{ "mcpServers": { "google-calendar": { "command": "node", "args": ["<absolute-path-to-project-folder>/build/index.js"] } } }
Note: Replace
<absolute-path-to-project-folder>
with the actual path to your project directory.Restart Claude Desktop
Development
Troubleshooting
OAuth Token expires after one week (7 days)
- If your Google Cloud app is in testing mode, tokens expire weekly. Re-authenticate by running
npm run auth
or restarting the server.
- If your Google Cloud app is in testing mode, tokens expire weekly. Re-authenticate by running
OAuth Token Errors / Authentication Failures
- Ensure
gcp-oauth.keys.json
exists in the project root and contains valid Desktop App credentials. - Try deleting
.gcp-saved-tokens.json
and re-authenticating. - Check the Google Cloud Console to ensure the Calendar API is enabled and your user is listed as a test user if the app is in testing mode.
- Verify no other process is using ports 3000-3004 when the auth server needs to start.
- Ensure
Build Errors
- Run
npm install
again. - Check Node.js version.
- Delete the
build/
directory and runnpm run build
.
- Run
License
MIT