Google Workspace MCP Server
Gmail, Calendar, Drive, Docs, Sheets, Tasks, Meet and Contacts across several Google accounts
Read, create and manage Google Calendar events across one or more Google accounts
By Nathan Spady (individual) TypeScript Local · stdio Productivity
76 popularity score ★ 1.2k ↓ 13k/wk
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs GOOGLE_OAUTH_CREDENTIALS. Replace each <NAME> with your value.
claude mcp add google-calendar -e GOOGLE_OAUTH_CREDENTIALS=<GOOGLE_OAUTH_CREDENTIALS> -- npx @cocal/google-calendar-mcp{
"mcpServers": {
"google-calendar": {
"command": "npx",
"args": [
"@cocal/google-calendar-mcp"
],
"env": {
"GOOGLE_OAUTH_CREDENTIALS": "<GOOGLE_OAUTH_CREDENTIALS>"
}
}
}
}{
"mcpServers": {
"google-calendar": {
"command": "npx",
"args": [
"@cocal/google-calendar-mcp"
],
"env": {
"GOOGLE_OAUTH_CREDENTIALS": "<GOOGLE_OAUTH_CREDENTIALS>"
}
}
}
}{
"servers": {
"google-calendar": {
"type": "stdio",
"command": "npx",
"args": [
"@cocal/google-calendar-mcp"
],
"env": {
"GOOGLE_OAUTH_CREDENTIALS": "<GOOGLE_OAUTH_CREDENTIALS>"
}
}
}
}[mcp_servers.google-calendar]
command = "npx"
args = ["@cocal/google-calendar-mcp"]
[mcp_servers.google-calendar.env]
GOOGLE_OAUTH_CREDENTIALS = "<GOOGLE_OAUTH_CREDENTIALS>"gemini mcp add --scope user -e GOOGLE_OAUTH_CREDENTIALS=<GOOGLE_OAUTH_CREDENTIALS> google-calendar npx -- @cocal/google-calendar-mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs GOOGLE_OAUTH_CREDENTIALS. Replace each <NAME> with your value.
git clone https://github.com/nspady/google-calendar-mcp.git
cd google-calendar-mcp
cp <PATH_TO_GCP_OAUTH_KEYS_JSON> ./gcp-oauth.keys.json
chmod 644 ./gcp-oauth.keys.json
docker compose up -d
docker compose exec calendar-mcp npm run authclaude mcp add google-calendar -e GOOGLE_OAUTH_CREDENTIALS=<GOOGLE_OAUTH_CREDENTIALS> -- docker run -e GOOGLE_OAUTH_CREDENTIALS --rm -i --mount 'type=bind,src=<PATH_TO_GCP_OAUTH_KEYS_JSON>,dst=/app/gcp-oauth.keys.json' --mount 'type=volume,src=google-calendar-mcp_calendar-tokens,dst=/home/nodejs/.config/google-calendar-mcp' calendar-mcp{
"mcpServers": {
"google-calendar": {
"command": "docker",
"args": [
"run",
"-e",
"GOOGLE_OAUTH_CREDENTIALS",
"--rm",
"-i",
"--mount",
"type=bind,src=<PATH_TO_GCP_OAUTH_KEYS_JSON>,dst=/app/gcp-oauth.keys.json",
"--mount",
"type=volume,src=google-calendar-mcp_calendar-tokens,dst=/home/nodejs/.config/google-calendar-mcp",
"calendar-mcp"
],
"env": {
"GOOGLE_OAUTH_CREDENTIALS": "<GOOGLE_OAUTH_CREDENTIALS>"
}
}
}
}{
"mcpServers": {
"google-calendar": {
"command": "docker",
"args": [
"run",
"-e",
"GOOGLE_OAUTH_CREDENTIALS",
"--rm",
"-i",
"--mount",
"type=bind,src=<PATH_TO_GCP_OAUTH_KEYS_JSON>,dst=/app/gcp-oauth.keys.json",
"--mount",
"type=volume,src=google-calendar-mcp_calendar-tokens,dst=/home/nodejs/.config/google-calendar-mcp",
"calendar-mcp"
],
"env": {
"GOOGLE_OAUTH_CREDENTIALS": "<GOOGLE_OAUTH_CREDENTIALS>"
}
}
}
}{
"servers": {
"google-calendar": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-e",
"GOOGLE_OAUTH_CREDENTIALS",
"--rm",
"-i",
"--mount",
"type=bind,src=<PATH_TO_GCP_OAUTH_KEYS_JSON>,dst=/app/gcp-oauth.keys.json",
"--mount",
"type=volume,src=google-calendar-mcp_calendar-tokens,dst=/home/nodejs/.config/google-calendar-mcp",
"calendar-mcp"
],
"env": {
"GOOGLE_OAUTH_CREDENTIALS": "<GOOGLE_OAUTH_CREDENTIALS>"
}
}
}
}[mcp_servers.google-calendar]
command = "docker"
args = ["run", "-e", "GOOGLE_OAUTH_CREDENTIALS", "--rm", "-i", "--mount", "type=bind,src=<PATH_TO_GCP_OAUTH_KEYS_JSON>,dst=/app/gcp-oauth.keys.json", "--mount", "type=volume,src=google-calendar-mcp_calendar-tokens,dst=/home/nodejs/.config/google-calendar-mcp", "calendar-mcp"]
[mcp_servers.google-calendar.env]
GOOGLE_OAUTH_CREDENTIALS = "<GOOGLE_OAUTH_CREDENTIALS>"gemini mcp add --scope user -e GOOGLE_OAUTH_CREDENTIALS=<GOOGLE_OAUTH_CREDENTIALS> google-calendar docker -- run -e GOOGLE_OAUTH_CREDENTIALS --rm -i --mount 'type=bind,src=<PATH_TO_GCP_OAUTH_KEYS_JSON>,dst=/app/gcp-oauth.keys.json' --mount 'type=volume,src=google-calendar-mcp_calendar-tokens,dst=/home/nodejs/.config/google-calendar-mcp' calendar-mcpGOOGLE_OAUTH_CREDENTIALS |
Required: Absolute path to your OAuth desktop-app credentials JSON; required with npx. A service account key can be given via GOOGLE_SERVICE_ACCOUNT_KEY instead. |
|---|---|
GOOGLE_SERVICE_ACCOUNT_KEY |
Optional: Path to a service account key; switches to service account mode and fails startup if unusable. |
GOOGLE_SERVICE_ACCOUNT_SUBJECT |
Optional: Workspace user to impersonate with domain-wide delegation. |
GOOGLE_APPLICATION_CREDENTIALS |
Optional: Shared Google credentials file, used only when no OAuth credentials file is found. |
GOOGLE_CALENDAR_MCP_TOKEN_PATH |
Optional: Where sign-in tokens are stored; defaults under the user config directory. |
GOOGLE_ACCOUNT_MODE |
Optional: Account nickname for single-account operations and the auth command. |
ENABLED_TOOLS |
Optional: Comma-separated list of tools to expose; manage-accounts is always on. |
TRANSPORT |
Optional: stdio (default) or http. |
PORT |
Optional: Port for the HTTP transport, default 3000. |
HOST |
Optional: Bind address for the HTTP transport, default 127.0.0.1. |
GOOGLE_OAUTH_REDIRECT_BASE |
Optional: Public base URL for the OAuth callback when signing in through a tunnel or proxy. |
GOOGLE_CALENDAR_API_BASE_URL |
Optional: Send Calendar API calls to a proxy you control instead of googleapis.com. |
In a container, a setting goes in with -e NAME=value after docker run.
Google Calendar MCP Server is a community-built server that connects an assistant to the Google Calendar API using credentials you create in your own Google Cloud project. It can list calendars, list and search events, fetch a single event, check free/busy time, and create, update or delete events, including whole batches of events in one call and edits to recurring series. It can also accept, decline or tentatively answer invitations and apply calendar colour labels.
Several Google accounts can be connected at once, for example work and personal. Read tools merge results from every connected account unless one is named, and write tools pick an account that has the right permissions. Accounts are added or removed through the manage-accounts tool, the CLI, or a small web page when it runs over HTTP.
It runs locally over stdio by default, from npm with npx, from a cloned and built checkout, or in a Docker container built from the repository. An HTTP transport is also available for local testing. Sign-in is normally an OAuth desktop-app flow in the browser; a Google service account key can be used instead for headless machines. The ENABLED_TOOLS setting trims the exposed tools, for instance to read-only ones.
The author also sells a separate hosted product, Cocal, which the README promotes; this page covers only the open-source server.
| Runtime | Node.jsorDocker |
|---|
Node.js (an LTS release) for the npx or source routes, or Docker for the container route. A Google Cloud project with the Google Calendar API enabled and an OAuth 2.0 client of the Desktop app type, saved as a JSON key file, with your address added as a test user; alternatively a service account key with the target calendars shared to it. A Google account with a calendar.
While the OAuth app stays in Google's test mode, tokens expire after 7 days and you must sign in again; publishing the app avoids this but Google then shows an unverified-app warning. In service account mode it cannot invite attendees (without domain-wide delegation), list-calendars returns nothing, and calendar IDs must be given explicitly. Calendars shared with you by others are not reachable by a service account. Calendar tools fail until you have authenticated once. The HTTP mode has no authentication of its own and is meant for localhost only. Browser sign-in may fail on some non-Chromium browsers.
Suits people who want an assistant to plan around and edit their own Google Calendar from a local machine, especially with more than one Google account, and who are willing to set up a Google Cloud project and OAuth client themselves. It is not published by Google. Those who do not want to create Cloud credentials or handle weekly re-sign-in in test mode may prefer a hosted option such as the author's Cocal, which the README names. For a read-only setup, restrict it with ENABLED_TOOLS.
list-calendarslist-eventsget-eventsearch-eventscreate-eventcreate-eventsupdate-eventdelete-eventrespond-to-eventget-freebusyget-current-timelist-colorsmanage-accounts