Enables interaction with Google Calendar to list events, create and update meetings, delete events, and find available time slots within a specified time range.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Google Calendar MCP Servershow my meetings for tomorrow"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Google Calendar MCP Server
This MCP server allows Claude to interact with your Google Calendar, enabling capabilities like listing events, creating meetings, and finding free time slots.
Prerequisites
Node.js (v16 or higher)
Claude Desktop App
A Google Cloud Project
Google Calendar API enabled
OAuth 2.0 credentials
Setup Instructions
1. Create a Google Cloud Project
Go to the Google Cloud Console
Create a new project or select an existing one
Enable the Google Calendar API:
Go to "APIs & Services" > "Library"
Search for "Google Calendar API"
Click "Enable"
2. Configure OAuth Consent Screen
Go to "APIs & Services" > "OAuth consent screen"
Select "External" user type (unless you have a Google Workspace organization)
Fill in the required information:
App name
User support email
Developer contact information
Add the following scopes:
https://www.googleapis.com/auth/calendarhttps://www.googleapis.com/auth/calendar.events
Add your email address as a test user
3. Create OAuth 2.0 Credentials
Go to "APIs & Services" > "Credentials"
Click "Create Credentials" > "OAuth client ID"
Select "Desktop app" as the application type
Name your client (e.g., "MCP Calendar Client")
Click "Create"
Download the client configuration file (you'll need the client ID and client secret)
4. Get Refresh Token
Create a new file named
getToken.js:
const { google } = require('googleapis');
const http = require('http');
const url = require('url');
// Replace these with your OAuth 2.0 credentials
const CLIENT_ID = 'your-client-id';
const CLIENT_SECRET = 'your-client-secret';
const REDIRECT_URI = 'http://localhost:3000/oauth2callback';
// Configure OAuth2 client
const oauth2Client = new google.auth.OAuth2(
CLIENT_ID,
CLIENT_SECRET,
REDIRECT_URI
);
// Define scopes
const scopes = [
'https://www.googleapis.com/auth/calendar',
'https://www.googleapis.com/auth/calendar.events'
];
async function getRefreshToken() {
return new Promise((resolve, reject) => {
try {
// Create server to handle OAuth callback
const server = http.createServer(async (req, res) => {
try {
const queryParams = url.parse(req.url, true).query;
if (queryParams.code) {
// Get tokens from code
const { tokens } = await oauth2Client.getToken(queryParams.code);
console.log('\n=================');
console.log('Refresh Token:', tokens.refresh_token);
console.log('=================\n');
console.log('Save this refresh token in your configuration!');
// Send success response
res.end('Authentication successful! You can close this window.');
// Close server
server.close();
resolve(tokens);
}
} catch (error) {
console.error('Error getting tokens:', error);
res.end('Authentication failed! Please check console for errors.');
reject(error);
}
}).listen(3000, () => {
// Generate auth url
const authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: scopes,
prompt: 'consent' // Force consent screen to ensure refresh token
});
console.log('1. Copy this URL and paste it in your browser:');
console.log('\n', authUrl, '\n');
console.log('2. Follow the Google authentication process');
console.log('3. Wait for the refresh token to appear here');
});
} catch (error) {
console.error('Server creation error:', error);
reject(error);
}
});
}
// Run the token retrieval
getRefreshToken().catch(console.error);Install required dependency:
npm install googleapisUpdate the script with your OAuth credentials:
Replace
your-client-idwith your actual client IDReplace
your-client-secretwith your actual client secret
Run the script:
node getToken.jsFollow the instructions in the console:
Copy the provided URL
Paste it into your browser
Complete the Google authentication process
Copy the refresh token that appears in the console
5. Configure Claude Desktop
Open your Claude Desktop configuration file:
For MacOS:
code ~/Library/Application\ Support/Claude/claude_desktop_config.jsonFor Windows:
code %AppData%\Claude\claude_desktop_config.jsonAdd or update the configuration:
{
"mcpServers": {
"google-calendar": {
"command": "node",
"args": [
"/ABSOLUTE/PATH/TO/YOUR/build/index.js"
],
"env": {
"GOOGLE_CLIENT_ID": "your_client_id_here",
"GOOGLE_CLIENT_SECRET": "your_client_secret_here",
"GOOGLE_REDIRECT_URI": "http://localhost",
"GOOGLE_REFRESH_TOKEN": "your_refresh_token_here"
}
}
}
}Save the file and restart Claude Desktop
Initial Project Setup
Create a new directory for your project:
mkdir google-calendar-mcp
cd google-calendar-mcpInitialize a new npm project:
npm init -yInstall dependencies:
npm install @modelcontextprotocol/sdk googleapis google-auth-library zod
npm install -D @types/node typescriptCreate a tsconfig.json file:
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./build",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}Update package.json:
{
"type": "module",
"scripts": {
"build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\""
}
}Create your source directory:
mkdir srcCreate a .env file for local development (don't commit this file):
GOOGLE_CLIENT_ID=your_client_id_here
GOOGLE_CLIENT_SECRET=your_client_secret_here
GOOGLE_REDIRECT_URI=http://localhost
GOOGLE_REFRESH_TOKEN=your_refresh_token_hereBuilding and Running
Build the server:
npm run buildThe server will automatically start when you open Claude Desktop
Available Tools
The server provides the following tools:
list_events: List calendar events within a specified time rangecreate_event: Create a new calendar eventupdate_event: Update an existing calendar eventdelete_event: Delete a calendar eventfind_free_time: Find available time slots in the calendar
Example Usage in Claude
After setup, you can use commands like:
"Show me my calendar events for next week"
"Schedule a meeting with [email_id] tomorrow at 2 PM for 1 hour"
"Find a free 30-minute slot this afternoon"
"Update my 3 PM meeting to 4 PM"
"Cancel my meeting with ID [event_id]"
Troubleshooting
Common Issues
Tools not appearing in Claude:
Check Claude Desktop logs:
tail -f ~/Library/Logs/Claude/mcp*.logVerify all environment variables are set correctly
Ensure the path to index.js is absolute and correct
Authentication Errors:
Verify your OAuth credentials are correct
Check if refresh token is valid
Ensure required scopes are enabled
Server Connection Issues:
Check if the server built successfully
Verify file permissions on build/index.js (should be 755)
Try running the server directly:
node /path/to/build/index.js
Viewing Logs
To view server logs:
# For MacOS/Linux:
tail -n 20 -f ~/Library/Logs/Claude/mcp*.log
# For Windows:
Get-Content -Path "$env:AppData\Claude\Logs\mcp*.log" -Wait -Tail 20Environment Variables
If you're getting environment variable errors, verify each one:
GOOGLE_CLIENT_ID: Should start with something like "123456789-..."
GOOGLE_CLIENT_SECRET: Usually ends in ".apps.googleusercontent.com"
GOOGLE_REDIRECT_URI: Should be "http://localhost"
GOOGLE_REFRESH_TOKEN: A long string that doesn't expire
Security Considerations
Keep your OAuth credentials secure
Don't commit credentials to version control
Use environment variables for sensitive data
Regularly rotate refresh tokens
Monitor API usage in Google Cloud Console
License
MIT License - See LICENSE file for details.
Support
If you encounter any issues:
Check the troubleshooting section above
Review Claude Desktop logs
Open an issue on GitHub
Contact the maintainer