Skip to main content
Glama

Google Calendar MCP

English | Русский

npm CI Glama License: MIT

A1 Google Calendar MCP lets an AI app manage Google Calendar in plain language. Review your week, schedule a meeting with guests and a Google Meet link, reschedule or cancel it, find a slot when everyone is free, and block Out of Office or Focus Time.

It uses the Google Calendar API with your Google account. It distinguishes a whole recurring series from a single occurrence and makes the limits of the Calendar API explicit instead of implying that every calendar task is possible.

  • 13 tools. Inspect calendars, events and free/busy, create and edit events, expand recurring series, and block Out of Office and Focus Time.

  • Nobody is emailed by accident. The Calendar API's default for invitations, changes and cancellations is silence; guests get email only when you ask for it via send_updates.

  • Writes are never replayed. After an ambiguous failure the server does not retry a write — a duplicated event could re-email every guest.

  • Minimal Google scopes. It uses calendar.events and calendar.readonly, without the broad calendar scope.

Start with a read-only question:

What's on my calendar this week? Point out any overlapping meetings.

Connect the server · Explore use cases · Open technical documentation


See it work in a minute

You: What does my Thursday look like, and when are Anna and I both free?

Assistant: Shows Thursday's events and the free slots you share. Nothing changes.

You: Book a 45-minute design review with Anna in the first shared slot, with a Google Meet link.

Assistant: Shows the proposed time, guest list and Meet link, then asks for confirmation before creating the event.

You: Confirm.

Assistant: Creates the event. Nobody gets an email unless you ask it to send invitations.

Related MCP server: Google Calendar MCP Server

Contents

Quick start

You need Node.js 20+, a Google account and OAuth credentials from a Google Cloud project with the Google Calendar API enabled.

  1. Prepare Google OAuth access.

  2. Add the server to your AI app.

  3. Ask the read-only question above.

In the app: open Settings → MCP servers, select Add server, choose STDIO, enter the command npx -y @a1-x-tech/mcp-google-calendar@latest and environment variables GOOGLE_CALENDAR_CLIENT_ID, GOOGLE_CALENDAR_CLIENT_SECRET, GOOGLE_CALENDAR_REFRESH_TOKEN, then select Save and Restart.

From the command line:

codex mcp add google-calendar \
  --env GOOGLE_CALENDAR_CLIENT_ID=your_client_id \
  --env GOOGLE_CALENDAR_CLIENT_SECRET=your_client_secret \
  --env GOOGLE_CALENDAR_REFRESH_TOKEN=your_refresh_token \
  -- npx -y @a1-x-tech/mcp-google-calendar@latest
codex mcp list

Codex MCP documentation

claude mcp add \
  --env GOOGLE_CALENDAR_CLIENT_ID=your_client_id \
  --env GOOGLE_CALENDAR_CLIENT_SECRET=your_client_secret \
  --env GOOGLE_CALENDAR_REFRESH_TOKEN=your_refresh_token \
  --transport stdio --scope user google-calendar \
  -- npx -y @a1-x-tech/mcp-google-calendar@latest
claude mcp list

Claude Code MCP documentation

The current official path is Settings → Extensions. For a custom desktop extension, open Advanced settings → Extension Developer → Install Extension…, select a .mcpb file and follow the prompts.

This repository currently publishes an npm stdio package and does not contain a .mcpb bundle. For Claude Desktop builds that still support local configuration, use the following JSON stdio configuration as a fallback:

{
  "mcpServers": {
    "google-calendar": {
      "command": "npx",
      "args": ["-y", "@a1-x-tech/mcp-google-calendar@latest"],
      "env": {
        "GOOGLE_CALENDAR_CLIENT_ID": "your_client_id",
        "GOOGLE_CALENDAR_CLIENT_SECRET": "your_client_secret",
        "GOOGLE_CALENDAR_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}

In those builds, save it to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.

Claude Desktop MCP documentation

Add this to ~/.cursor/mcp.json on macOS/Linux or %USERPROFILE%\.cursor\mcp.json on Windows:

{
  "mcpServers": {
    "google-calendar": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@a1-x-tech/mcp-google-calendar@latest"],
      "env": {
        "GOOGLE_CALENDAR_CLIENT_ID": "your_client_id",
        "GOOGLE_CALENDAR_CLIENT_SECRET": "your_client_secret",
        "GOOGLE_CALENDAR_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}

Cursor MCP documentation

Run MCP: Open User Configuration and add:

{
  "servers": {
    "google-calendar": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@a1-x-tech/mcp-google-calendar@latest"],
      "env": {
        "GOOGLE_CALENDAR_CLIENT_ID": "${input:calendar_client_id}",
        "GOOGLE_CALENDAR_CLIENT_SECRET": "${input:calendar_client_secret}",
        "GOOGLE_CALENDAR_REFRESH_TOKEN": "${input:calendar_refresh_token}"
      }
    }
  },
  "inputs": [
    { "type": "promptString", "id": "calendar_client_id", "description": "Google OAuth client ID" },
    { "type": "promptString", "id": "calendar_client_secret", "description": "Google OAuth client secret", "password": true },
    { "type": "promptString", "id": "calendar_refresh_token", "description": "Google OAuth refresh token", "password": true }
  ]
}

Check it with MCP: List Servers.

VS Code MCP documentation

What you can ask it to do

See your schedule

  • What meetings do I have this week? Include the recurring ones.

  • Show tomorrow's 1:1 with its guests, Meet link and reminders.

  • List every occurrence of the team sync in March.

Plan and change meetings

  • Create a 45-minute review on Thursday with two guests and a Google Meet link.

  • Reschedule the retro one hour later and update the guest list — but don't email anyone yet.

  • Move the planning event to the team calendar.

  • Cancel Friday's occurrence of the standup, leaving the rest of the series alone.

Protect your time

  • When are Anna, Boris and I all free for an hour next week?

  • Block Out of Office for my vacation and auto-decline new invitations.

  • Create two hours of Focus Time tomorrow morning and silence Google Chat.

How an event changes

  1. calendar_id: "primary" is your main calendar; other calendars come from list_calendars, and writes need writer access.

  2. A recurring series and a single occurrence have different ids: the series id changes or cancels every occurrence, an instance id (from list_event_instances) exactly one.

  3. update_event changes only the fields you provide, but a nested object replaces its predecessor wholesale — a new attendees list replaces the whole guest list.

  4. No write emails anybody unless send_updates says so — the Calendar API's default is silence.

Out of Office and Focus Time blocks exist only on the primary calendar of a Google Workspace account; consumer Gmail and secondary calendars reject them. Creating an event does not check for conflicts — ask for a free/busy check first. All-day events end on an exclusive date: an event through Friday ends on Saturday's date.

What can change

Operation

What happens

Confirmation boundary

Read calendars, events and free/busy

Reads schedule data; free/busy shows busy blocks without titles

No change

Create an event

Adds a timed, all-day or recurring event, optionally with guests and Google Meet

Changes a calendar

Create an Out of Office or Focus Time block

Adds a special event that can auto-decline invitations or silence Google Chat

Changes a calendar

Update an event

Reschedules or edits an event; a series id edits every occurrence

Changes a calendar

Move an event

Re-homes an event to another calendar

Changes two calendars

Delete an event

Cancels an event or an entire series; there is no undelete

Destructive

Raw API request

Can call API methods without a dedicated tool

Potentially destructive

The AI client controls confirmation prompts. The server marks reads, writes and destructive tools so the client can distinguish an inspection from a live change.

Getting access

Access to your own calendars requires OAuth 2.0; an API key is not enough.

  1. Create or select a Google Cloud project and enable Google Calendar API.

  2. Configure the OAuth consent screen and create a Desktop app OAuth client.

  3. Authorize the Google account whose calendars you want to manage. The OAuth 2.0 Playground can obtain the refresh token when Use your own OAuth credentials is enabled.

  4. Request both scopes:

    https://www.googleapis.com/auth/calendar.events
    https://www.googleapis.com/auth/calendar.readonly

    The broad https://www.googleapis.com/auth/calendar scope is needed only for raw_request calls that manage calendars or sharing rules themselves.

Testing-mode OAuth refresh tokens can expire after seven days. Publish the OAuth app, or use an Internal app in a Workspace domain, when you need long-lived access. Treat the client secret and refresh token as passwords.

Configuration

Variable

Required

Description

GOOGLE_CALENDAR_CLIENT_ID

Yes*

OAuth client ID.

GOOGLE_CALENDAR_CLIENT_SECRET

Yes*

OAuth client secret.

GOOGLE_CALENDAR_REFRESH_TOKEN

Yes*

OAuth refresh token.

GOOGLE_CALENDAR_ACCESS_TOKEN

Yes*

Short-lived (~1 hour) alternative to the OAuth trio.

GOOGLE_CALENDAR_API_BASE

No

Google API base URL override; default https://www.googleapis.com.

GOOGLE_CALENDAR_TIMEOUT_MS

No

Per-request timeout; default 60000 ms.

GOOGLE_CALENDAR_MAX_RETRIES

No

Temporary-error retries; default 3.

* Provide either the OAuth trio or an access token. Without credentials the server still starts and completes the MCP handshake; the first tool call then names the exact variables to set.

Data, limits and background work

  • Requests go to Google Calendar. The local server refreshes Google OAuth tokens and calls the Calendar API. Its anonymous telemetry contains an installation ID, package version, AI client and platform versions, and tool names — never OAuth tokens, calendar data, tool arguments or prompts. Set ASKADS_TELEMETRY=0 to opt out.

  • Google applies per-project quotas. On 429, the server retries with backoff; reads also retry after network and 5xx errors, while writes are not replayed after an uncertain failure — a duplicated event could re-email every guest.

  • There is no background polling. The server runs only when called. list_events supports incremental checks via updated_min; if your AI app supports scheduled tasks, it can check your calendar periodically.

Technical documentation

Support

Found a bug or need a scenario? Create an issue or write in Telegram.

Available Tools

13 tools
create_eventCreate an eventA

Creates an event and returns it (id, htmlLink, start/end, attendees, hangoutLink when add_meet). Times: EITHER start_date_time + end_date_time (RFC3339; add time_zone for recurring events) OR start_date + end_date for all-day (end_date is EXCLUSIVE — the day after the last day). recurrence makes it a recurring series. attendees invites guests — but the API sends invitation emails ONLY with send_updates=all (the default notifies nobody). add_meet attaches a Google Meet link (may come back status=pending — re-run get_event for the final URL). This is a plain calendar write: it does not check for conflicts — call query_free_busy first to find a free slot. Never blindly re-send after a timeout or 5xx: the event may already exist — check with list_events first, or you will create a duplicate and re-invite everyone.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryYesEvent title.
add_meetNoAttach a Google Meet conference. The returned conferenceData may be status=pending — re-run get_event for the final Meet link.
color_idNoEvent color id ("1".."11"; the palette is fixed by Google).
end_dateNoAll-day event end date, EXCLUSIVE — the day after the last day (a one-day event on the 5th ends on the 6th).
locationNoFree-form location, e.g. a room name or address.
attendeesNoGuest list. On update this REPLACES the whole list — fetch the event first and send the complete new list. Invitation emails go out only with send_updates=all.
remindersNoCustom reminders (max 5). Setting this turns default reminders off for the event.
time_zoneNoIANA time zone for start/end (e.g. "Europe/Berlin"). REQUIRED for recurring events; otherwise optional when the RFC3339 offsets already say everything.
recurrenceNoRRULE/RDATE/EXRULE/EXDATE lines (RFC 5545) making the event recurring, e.g. ["RRULE:FREQ=WEEKLY;BYDAY=MO,WE"]. Requires the timed pair plus time_zone.
start_dateNoAll-day event start date (YYYY-MM-DD). Pair with end_date.
visibilityNoWho can see event details on a shared calendar.
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.
descriptionNoEvent description (plain text or simple HTML).
send_updatesNoWho receives an email about this change: all guests, only guests outside your organization, or nobody. Defaults to none — attendees are NOT notified unless you pass all.
transparencyNoopaque = the event blocks time in free/busy (default); transparent = it does not (shows as free).
end_date_timeNoTimed event end, RFC3339. Pair with start_date_time.
start_date_timeNoTimed event start, RFC3339 (e.g. 2026-09-01T10:00:00+02:00 or ...Z). Pair with end_date_time.
guests_can_modifyNoWhether guests may edit the event.
use_default_remindersNoUse the calendar's default reminders (ignored when reminders[] is given).
guests_can_invite_othersNoWhether guests may invite more people.
guests_can_see_other_guestsNoWhether guests can see the guest list.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as a non-read, non-idempotent write, and the description goes well beyond them: it discloses no conflict checking, the pending Meet link behavior, notification defaults, and duplicate-creation risk. These are critical behavioral traits the agent would otherwise only discover at runtime.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries high-value information and there is no filler, but the description is a single dense paragraph that could be easier to scan with structured bullets. It is appropriately sized for a 21-parameter creation tool, just not optimally organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity, the absence of an output schema, and the minimal annotations, the description is exceptionally complete: it explains return values, time semantics, recurrence requirements, attendee notifications, the pending Meet state, conflict checking, and idempotency risks. An agent has enough to call it correctly and even to avoid common failures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds essential semantic rules the schema does not convey: the EITHER/OR time-mode pairing, end_date exclusivity, time_zone being required for recurring events, recurrence requiring the timed pair, and send_updates defaulting to no notifications. This meaningfully exceeds the structured field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Creates an event' and immediately lists what is returned. It distinguishes itself from siblings like update_event and get_event by making it a creation operation with a clear output contract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance and alternatives: call query_free_busy first to find a free slot, and check list_events before re-sending after timeouts to avoid duplicates. It also warns about send_updates defaults, which directly affects whether invitations are sent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_focus_timeCreate a Focus Time blockA

Creates a Focus Time event: blocks the slot, can auto-decline conflicting invitations (auto_decline + decline_message) and can flip Google Chat to Do Not Disturb (chat_status). ONLY works on the PRIMARY calendar of a Google Workspace account — consumer Gmail and secondary calendars get HTTP 400. Always timed (start/end date_time), never all-day. Manage it afterwards like any event: update_event / delete_event, and list_events with event_types=["focus_time"] to find existing blocks. Not retried after an ambiguous failure — check list_events before re-sending.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryNoTitle (defaults to "Focus time").
time_zoneNoIANA time zone name, e.g. "Europe/Berlin" or "America/New_York".
calendar_idNoThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.primary
chat_statusNoGoogle Chat presence during the block.
auto_declineNoWhich conflicting meeting invitations Calendar auto-declines: none, all overlapping ones, or only new ones arriving after the block is created (existing meetings survive).
send_updatesNoWho receives an email about this change: all guests, only guests outside your organization, or nobody. Defaults to none — attendees are NOT notified unless you pass all.
end_date_timeYesBlock end, RFC3339.
decline_messageNoMessage sent with each auto-declined invitation.
start_date_timeYesBlock start, RFC3339 (these blocks are always timed, never all-day).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations note readOnlyHint=false and destructiveHint=false, and the description adds rich behavioral context: the tool can auto-decline invitations, affect Chat presence, is always timed, rejects consumer Gmail, and is not retried after ambiguous failures. This goes well beyond the annotations and helps an agent anticipate side effects and error modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it covers creation behavior, hard constraints, lifecycle management, and failure handling. Key constraints like primary-calendar-only and always-timed are front-loaded, and there is no filler or repetition of schema boilerplate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description tells the agent everything needed to call the tool correctly: what it does, where it works, what can be configured, how to manage/find the created blocks afterward, and how to handle ambiguous failures. This is complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description mentions auto_decline, decline_message, and chat_status in a behavioral context, but the schema already documents each parameter clearly. No substantial new parameter-level meaning is added beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: "Creates a Focus Time event" and immediately distinguishes it from ordinary event creation by naming unique behaviors like auto-declining conflicting invitations and flipping Chat to Do Not Disturb. It clearly identifies the primary-calendar-only scope, making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when not to use the tool: it only works on the primary calendar of a Google Workspace account, and consumer Gmail or secondary calendars return HTTP 400. It also names the follow-up tools and pattern for verification: update_event, delete_event, and list_events with event_types=["focus_time"]. This gives an agent clear routing and alternative actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_out_of_officeCreate an Out of Office blockA

Creates an Out of Office event that can auto-decline meeting invitations while it lasts (auto_decline: all overlapping meetings, or only new invitations; decline_message customizes the reply). ONLY works on the PRIMARY calendar of a Google Workspace account — consumer Gmail and secondary calendars get HTTP 400. Always timed (start/end date_time), never all-day. Manage it afterwards like any event: update_event to change it, delete_event to remove it, list_events with event_types=["out_of_office"] to find existing blocks. Not retried after an ambiguous failure — check list_events before re-sending.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryNoTitle (defaults to "Out of office").
time_zoneNoIANA time zone name, e.g. "Europe/Berlin" or "America/New_York".
calendar_idNoThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.primary
auto_declineNoWhich conflicting meeting invitations Calendar auto-declines: none, all overlapping ones, or only new ones arriving after the block is created (existing meetings survive).
send_updatesNoWho receives an email about this change: all guests, only guests outside your organization, or nobody. Defaults to none — attendees are NOT notified unless you pass all.
end_date_timeYesBlock end, RFC3339.
decline_messageNoMessage sent with each auto-declined invitation.
start_date_timeYesBlock start, RFC3339 (these blocks are always timed, never all-day).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (not read-only, not idempotent), the description discloses concrete side effects: auto-decline applies to 'all overlapping meetings, or only new invitations', send_updates defaults to no notifications, and ambiguous failures are not retried — advising list_events verification. This gives an agent a realistic model of the call's effects and failure semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five tightly written sentences, each carrying distinct operational value: behavior, compatibility constraint, scheduling format, management pattern, and retry policy. No filler or repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create operation with no output schema, it covers all non-obvious aspects: auto-decline modes, decline message, calendar restriction, always-timed constraint, post-creation management via sibling tools, and handling of ambiguous failures. An agent has enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds crucial clarification that calendar_id effectively only supports the primary calendar in practice, contradicting the schema's hint that any calendar_id from list_calendars works, and reinforces that start/end_date_time must be timed. This extra meaning pushes it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Creates an Out of Office event' with a distinguishing behavior, auto-declining meeting invitations. This clearly separates it from sibling tools like create_event and create_focus_time even before reading parameters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: only for primary Google Workspace calendars, always timed, and how to manage the block afterward via update_event, delete_event, and list_events. It does not explicitly contrast with create_event for non-OOO events, but the limitation and management guidance effectively scope when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_eventDelete an eventA
Destructive

Deletes (cancels) an event — there is no undelete. Deleting a series master id cancels the ENTIRE recurring series; deleting one instance id (from list_event_instances) cancels only that occurrence. On an event with guests this cancels the meeting for everyone, but cancellation emails go out only with send_updates=all. Returns {deleted:true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesThe event id from list_events or create_event output. A recurring-instance id (masterId_20260101T100000Z from list_event_instances) addresses one occurrence.
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.
send_updatesNoWho receives an email about this change: all guests, only guests outside your organization, or nobody. Defaults to none — attendees are NOT notified unless you pass all.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description reveals the permanence (no undelete), the side effect on all guests, the conditional email behavior, and the return payload {deleted:true}. It fully discloses what happens at the domain level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences front-load the most important warning (no undelete) and then cover series semantics, guest impact, email behavior, and return value without any filler. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent operation with no output schema, the description covers the outcome, return value, recurrence nuances, and email side-effect. The schema covers the remaining parameter details, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the schema already documents all parameters, the description adds critical meaning: it explains which event_id form affects the whole series versus one occurrence, and it emphasizes that attendees are not notified unless send_updates=all, reinforcing the default. This materially helps an agent choose the right parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource — "Deletes (cancels) an event" — and immediately distinguishes recurring-series deletion from single-instance deletion by naming list_event_instances. This clearly separates it from siblings like update_event, move_event, and create_event.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete selection guidance: pass the series master id to cancel the entire series, or an instance id from list_event_instances to cancel only one occurrence. It also clarifies the send_updates option's effect on notification emails, though it does not explicitly contrast delete with non-destructive alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_calendarGet a calendarA
Read-onlyIdempotent

Fetches one calendar-list entry: summary, description, timeZone (the calendar's default IANA zone — use it to interpret event times), accessRole, defaultReminders and primary. Works only for calendars on the user's list; for a shared calendar never added to the list, use raw_request with path calendar/v3/calendars/ instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that the operation is read-only and idempotent. The description adds useful behavioral context beyond those hints, particularly the constraint that it only works for calendars already on the user's list and the guidance to interpret event times using the returned timeZone. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact: one sentence enumerates the returned fields and one sentence covers the limitation and fallback. Every clause earns its place, and important constraints are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one required parameter, the description covers the return fields, the key caveat about calendar-list membership, and the recommended alternative for out-of-scope calendars. There is no output schema, so enumerating fields is valuable and sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter calendar_id is already fully documented in the schema (100% coverage), including the 'primary' special value. The description reinforces the 'user's list' context but does not add substantial parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetches') and identifies the resource as 'one calendar-list entry', followed by an explicit list of returned fields (summary, description, timeZone, accessRole, defaultReminders, primary). This clearly distinguishes it from list_calendars and other siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the tool's scope ('Works only for calendars on the user's list') and provides a precise alternative for a known edge case: use raw_request with path calendar/v3/calendars/<id> for a shared calendar never added to the list. This tells the agent exactly when to choose this tool versus another.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_eventGet an eventA
Read-onlyIdempotent

Fetches one event by id: summary, description, location, start/end, attendees with their responseStatus (accepted/declined/tentative/needsAction), organizer, recurrence rules, recurringEventId (present on instances of a series), conferenceData/hangoutLink (Google Meet), reminders, visibility, transparency and eventType. Works for a series master and for an individual instance id alike.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesThe event id from list_events or create_event output. A recurring-instance id (masterId_20260101T100000Z from list_event_instances) addresses one occurrence.
time_zoneNoIANA zone the response times are rendered in.
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior, so the bar is lowered. The description adds valuable behavioral context by listing the response contents, covering recurrence-related behavior, and noting that instance ids are accepted. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-structured sentence that front-loads the core action and then lists relevant response fields. It is somewhat long, but the field enumeration is justified because there is no output schema to carry that information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by detailing the return fields and addressing series/instance behavior. It does not mention not-found or error behavior, but for a simple read operation covered by strong annotations and complete parameter schemas, this is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description does not explain the parameters beyond what the schema already covers, but it does add context about instance id handling that aligns with the schema's event_id documentation. No significant additional semantic value beyond structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Fetches'), a specific resource ('one event by id'), and enumerates the exact fields returned. This clearly distinguishes it from list_events and list_event_instances, and the additional note about series masters vs instances removes ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear this is for fetching a single event by id and explicitly says it works for both series masters and individual instance ids. It does not name sibling alternatives or give exclusion criteria, but the single-event-by-id framing gives strong contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_calendarsList calendarsA
Read-onlyIdempotent

Lists the calendars on the user's calendar list: id (use it as calendar_id in every other tool), summary, description, timeZone (IANA), accessRole (owner/writer/reader/freeBusyReader — writes need writer or owner), primary:true on the main calendar, and hidden/selected flags. The special id "primary" always addresses the main calendar without listing first. Paginate with page_token from nextPageToken. Calendars shared with the user but never added to their list do not appear here — address them by their explicit id.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_tokenNonextPageToken from the previous page.
max_resultsNoMax calendars per page (1..250; API default 100).
show_hiddenNoInclude calendars the user has hidden from their list.
min_access_roleNoOnly calendars where the user has at least this role (e.g. writer to find writable ones).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already declare readOnlyHint, idempotentHint, and destructiveHint, the description adds meaningful behavior beyond those: pagination via nextPageToken, hidden/selected flags, accessRole semantics for write permissions, and the important limitation that shared-but-unadded calendars are not returned. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet information-dense. It front-loads the core purpose and return fields, then adds the primary-id shortcut, pagination, and edge-case behavior in logical order. Every sentence earns its place; there is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description fully compensates by enumerating the returned fields, explaining role semantics, pagination, and the special 'primary' id. It also covers the key edge case of shared calendars not appearing in the list. An agent has enough context to invoke the tool correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four parameters. The description adds extra value by linking accessRole values to write permissions ('writes need writer or owner'), which clarifies the intent of min_access_role, and by explaining how page_token connects to nextPageToken. This goes slightly beyond a baseline schema-only understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Lists the calendars on the user's calendar list' and enumerates the exact fields returned. It further distinguishes this tool from get_calendar by explaining what is absent (shared calendars never added to the list) and how to address them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete when-to-use and when-not-to-use guidance: the 'primary' special id removes the need to call this tool for the main calendar, and calendars not on the user's list must be addressed by explicit id instead. This helps the agent choose list_calendars versus get_calendar without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_event_instancesList instances of a recurring eventA
Read-onlyIdempotent

Expands one recurring event (the series master id) into its individual instances, each with its own id (like masterId_20260901T100000Z) and concrete start/end. Use an instance id with update_event to reschedule a single occurrence, or with delete_event to cancel just that one; exceptions already made to the series show their changed times here. show_deleted=true includes cancelled occurrences. Bound the window with time_min/time_max — an unbounded infinite series is paginated via page_token.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesThe recurring series master id (from list_events without single_events).
time_maxNoOnly instances starting before this RFC3339 moment.
time_minNoOnly instances ending at/after this RFC3339 moment.
time_zoneNoIANA zone the response times are rendered in.
page_tokenNonextPageToken from the previous page.
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.
max_resultsNoMax instances per page (1..2500).
show_deletedNoInclude cancelled instances (status=cancelled).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description adds complementary behavioral detail rather than repeating it. It discloses that exceptions already made to the series show changed times, that show_deleted includes cancelled occurrences, and that unbounded infinite series require pagination via page_token — all useful traits beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: purpose first, then instance-id usage, exception behavior, deleted handling, and pagination. Every sentence contributes distinct information and no content is wasted or redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description still conveys the key return concept (individual ids plus concrete start/end) and covers the operational requirements: correct master id, optional window, deleted-instance flag, and page_token for unbounded series. An agent has enough to call this tool correctly and understand its pagination and filtering behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description raises the value by linking event_id to the recurring series master, explaining the instance id convention, and clarifying how time_min/time_max bound the expansion window. It adds meaning beyond the raw parameter descriptions without needing to restate every field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Expands') and a precise resource: one recurring event series master turned into individual instances with unique ids and concrete start/end times. This clearly separates it from list_events and get_event, and the example id format removes ambiguity about what an 'instance' is.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical guidance: use an instance id with update_event or delete_event for single-occurrence changes, include show_deleted for cancelled instances, and bound the window with time_min/time_max. It does not explicitly state when to prefer this over list_events, but the 'series master id' framing and cross-tool usage instructions make the intended context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_eventsList eventsA
Read-onlyIdempotent

Lists events on a calendar: id, summary, start/end (all-day events carry date with an EXCLUSIVE end; timed events carry dateTime), status, attendees with responseStatus, organizer, recurrence, hangoutLink, eventType. time_min/time_max bound the window (an event overlapping the window is included). single_events=true expands recurring events into individual instances — required for order_by=start_time and the right choice for questions like "what is on my calendar this week"; without it recurring events appear once as the series master. time_zone only changes how times are RENDERED in the response, never the events themselves. q searches summary/description/location/attendees. updated_min + show_deleted enable incremental polling (cancelled events come back as status=cancelled). Paginate with page_token from nextPageToken.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search over summary, description, location and attendees.
order_byNoSort order; start_time works only with single_events=true. Default is unspecified order.
time_maxNoOnly events starting before this RFC3339 moment (window upper bound, exclusive).
time_minNoOnly events ending at/after this RFC3339 moment (window lower bound).
time_zoneNoIANA zone the response times are rendered in (defaults to the calendar's zone).
page_tokenNonextPageToken from the previous page.
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.
event_typesNoOnly these event types (e.g. ["out_of_office"] to see OOO blocks).
max_resultsNoMax events per page (1..2500; API default 250).
updated_minNoOnly events modified after this RFC3339 moment — for incremental polling; too-old values return HTTP 410.
show_deletedNoInclude cancelled events (status=cancelled).
single_eventsNoExpand recurring events into instances (required for order_by=start_time).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, it reveals important runtime behavior: all-day ends are exclusive, overlapping events are included, recurring masters appear once without single_events, time_zone never changes stored events, and cancellations surface as status=cancelled. This is exactly the non-obvious context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but compressed: every sentence covers a distinct semantic point and none restate the schema verbatim. Front-loading the output fields and the core list operation keeps the most important facts first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter read tool with no output schema, it explains the result fields, windowing, recurrence expansion, timezone rendering, search, incremental polling, and pagination. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds relational meaning: time_min/time_max define an inclusive-overlap window, single_events interacts with order_by, updated_min/show_deleted form a polling pair, and page_token comes from nextPageToken. These cross-parameter insights go well beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The lead sentence 'Lists events on a calendar: id, summary, start/end...' names a specific verb, resource, and return fields, making it clear this is a bulk-read tool rather than single-event access. It does not explicitly name sibling tools like get_event or list_event_instances, so sibling differentiation is only implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete usage context: single_events=true is 'required for order_by=start_time and the right choice' for calendar-week questions, time_zone is only render-level, and updated_min+show_deleted enable incremental polling. It doesn't explicitly tell the agent when to pick list_events over list_event_instances or get_event, so it stops short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_eventMove an event to another calendarA
DestructiveIdempotent

Moves an event to a different calendar (changes its organizer calendar; the event id stays the same). Rescheduling to another TIME is update_event, not this. Only regular events can move — Out of Office, Focus Time, working-location and birthday events cannot, and events with attendees can be moved only by their organizer. Needs writer access to both calendars. send_updates=all notifies the guests.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesThe event id from list_events or create_event output. A recurring-instance id (masterId_20260101T100000Z from list_event_instances) addresses one occurrence.
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.
send_updatesNoWho receives an email about this change: all guests, only guests outside your organization, or nobody. Defaults to none — attendees are NOT notified unless you pass all.
destination_calendar_idYesThe calendar id the event moves to (from list_calendars).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate mutation and destructiveness, but the description adds valuable behavioral context: it changes the organizer calendar, preserves the event id, requires writer access to both calendars, restricts which event types can be moved, and notes that send_updates=all notifies guests. This goes well beyond what the annotations alone convey, with no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences with no filler. It front-loads the core action, immediately clarifies the relationship to update_event, and then packs restrictions, permissions, and side effects into the remaining sentences. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with four parameters and no output schema, the description is complete: it defines the operation, states constraints on eligible events, names the required permissions, explains the attendee-notification side effect, and routes to the correct sibling tool. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters thoroughly. The description reinforces the meaning of destination_calendar_id and send_updates, but does not add new parameter-level information beyond what the schema provides. A baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Moves an event to a different calendar') and clarifies the key semantic that the organizer calendar changes while the event id stays the same. It also explicitly distinguishes itself from update_event, so an agent can reliably tell this tool apart from its closest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance and names the alternative: rescheduling to another time is update_event, not this. It also states hard constraints (no Out of Office, Focus Time, working-location, or birthday events; only organizers can move events with attendees), which lets the agent decide whether this tool is appropriate before calling it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_free_busyQuery free/busy timesA
Read-onlyIdempotent

Returns the busy intervals of up to 50 calendars in one time window — the way to find a common free slot before create_event. Input calendar ids (or attendee email addresses, which double as their primary-calendar ids — subject to their sharing settings). The response maps each calendar id to busy:[{start,end}] ranges; gaps between them are free. Only busy blocks come back — never event titles or details — and events marked transparent (free) don't appear. A calendar the user cannot read shows up under errors, not busy. This is a pure read despite being an HTTP POST.

ParametersJSON Schema
NameRequiredDescriptionDefault
time_maxYesWindow end, RFC3339.
time_minYesWindow start, RFC3339.
time_zoneNoIANA zone the busy times are rendered in (default UTC).
calendar_idsYesCalendar ids to check (1..50) — "primary", calendar ids from list_calendars, or attendee emails.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint), the description adds important behavioral details: 'This is a pure read despite being an HTTP POST', the response maps each calendar id to busy ranges, 'Only busy blocks come back – never event titles or details', transparent events are excluded, and inaccessible calendars appear under errors. These disclosures go well beyond what annotations and schema provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured and front-loaded: it starts with the primary output, then explains usage, response behavior, and the read-only nature. Every sentence contributes value with no fluff or repetition. Although it is relatively long, each part is necessary for correct use.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the absence of an output schema, the description fully covers input requirements, output format, error handling, and the distinction from other operations. An agent has everything needed to call it correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all parameters with descriptions, so the baseline is 3. The description adds extra meaning for calendar_ids: 'Input calendar ids (or attendee email addresses, which double as their primary-calendar ids – subject to their sharing settings)', which is not in the schema. This additional semantic context justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Returns the busy intervals of up to 50 calendars in one time window'. It differentiates itself from sibling tools like create_event by explicitly framing itself as 'the way to find a common free slot before create_event', making its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool ('the way to find a common free slot before create_event') and input guidance (calendar ids or attendee emails). However, it does not explicitly state alternatives or when not to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

raw_requestRaw Google Calendar API callA
Destructive

Escape hatch to call any Google Calendar API v3 path directly, for requests the typed tools don't cover — e.g. events.quickAdd ("calendar/v3/calendars/primary/events/quickAdd?text=Lunch tomorrow noon", POST), the colors palette ("calendar/v3/colors"), ACL rules, secondary-calendar creation ("calendar/v3/calendars", POST), removing a Meet conference (PATCH with {"conferenceData":null} and ?conferenceDataVersion=1), watch channels, or an event PUT that replaces every field. The path is relative to https://www.googleapis.com, must stay under calendar/v3/ (other Google APIs on this host — drive/v3, gmail/v1, ... — are rejected before any request is sent) and may carry a query string. The Bearer token is added automatically; the method defaults to GET. Remember: PUT replaces unspecified fields with defaults — prefer PATCH semantics via update_event when possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body (POST/PUT/PATCH only).
pathYesAPI path relative to https://www.googleapis.com, starting with "calendar/v3/", e.g. "calendar/v3/calendars/primary/events".
methodNoHTTP method. Defaults to GET.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the Bearer token is injected automatically, GET is the default method, non-calendar/v3 paths are rejected before sending, and PUT replaces unspecified fields with defaults. These are exactly the behavioral traits an agent needs before invoking an escape hatch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and includes a long example list, but every sentence contributes safety or routing information. The purpose is front-loaded and the dangerous PUT caveat is saved for the end, where it can be read as a warning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world raw API tool with no output schema, the description covers URL construction, authorization, method behavior, path validation, and when to prefer a typed tool. It does not explicitly describe the raw response format or error behavior, but those are strongly implied by the tool's purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all three parameters, so the baseline is 3. The description adds operational semantics the schema lacks: query strings are allowed, paths are relative to https://www.googleapis.com and must remain under calendar/v3, and method defaults to GET.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens by defining the tool as an 'Escape hatch' for directly calling any Google Calendar API v3 path, with concrete examples such as events.quickAdd and colors. This distinguishes it from the typed sibling tools rather than restating the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states this tool is for 'requests the typed tools don't cover' and directs users to prefer 'update_event' for PATCH semantics when possible. The namespace restriction also tells the agent which calls will be rejected, reinforcing when the tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_eventUpdate an eventA
DestructiveIdempotent

Partially updates an event (PATCH): only the provided fields change, but a provided nested object REPLACES its predecessor wholesale — attendees replaces the entire guest list (get_event first, send the complete new list), reminders replaces all overrides, and a time change should carry BOTH the new start and end (start_date_time + end_date_time, or start_date + end_date). To reschedule one occurrence of a recurring series, pass that instance's id (from list_event_instances) as event_id; passing the series master id changes every occurrence. Guests hear about the change only with send_updates=all. Also works to update Out of Office / Focus Time blocks. Returns the updated event.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryNoNew event title.
add_meetNoAttach a Google Meet conference. The returned conferenceData may be status=pending — re-run get_event for the final Meet link.
color_idNoEvent color id ("1".."11"; the palette is fixed by Google).
end_dateNoAll-day event end date, EXCLUSIVE — the day after the last day (a one-day event on the 5th ends on the 6th).
event_idYesThe event id from list_events or create_event output. A recurring-instance id (masterId_20260101T100000Z from list_event_instances) addresses one occurrence.
locationNoFree-form location, e.g. a room name or address.
attendeesNoGuest list. On update this REPLACES the whole list — fetch the event first and send the complete new list. Invitation emails go out only with send_updates=all.
remindersNoCustom reminders (max 5). Setting this turns default reminders off for the event.
time_zoneNoIANA time zone for start/end (e.g. "Europe/Berlin"). REQUIRED for recurring events; otherwise optional when the RFC3339 offsets already say everything.
recurrenceNoRRULE/RDATE/EXRULE/EXDATE lines (RFC 5545) making the event recurring, e.g. ["RRULE:FREQ=WEEKLY;BYDAY=MO,WE"]. Requires the timed pair plus time_zone.
start_dateNoAll-day event start date (YYYY-MM-DD). Pair with end_date.
visibilityNoWho can see event details on a shared calendar.
calendar_idYesThe calendar id from list_calendars, or "primary" for the authenticated user's main calendar.
descriptionNoEvent description (plain text or simple HTML).
send_updatesNoWho receives an email about this change: all guests, only guests outside your organization, or nobody. Defaults to none — attendees are NOT notified unless you pass all.
transparencyNoopaque = the event blocks time in free/busy (default); transparent = it does not (shows as free).
end_date_timeNoTimed event end, RFC3339. Pair with start_date_time.
start_date_timeNoTimed event start, RFC3339 (e.g. 2026-09-01T10:00:00+02:00 or ...Z). Pair with end_date_time.
guests_can_modifyNoWhether guests may edit the event.
use_default_remindersNoUse the calendar's default reminders (ignored when reminders[] is given).
guests_can_invite_othersNoWhether guests may invite more people.
guests_can_see_other_guestsNoWhether guests can see the guest list.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing the wholesale-replacement semantics for attendees and reminders, the necessity of sending both start and end for time changes, the master-vs-instance recurrence behavior, and the notification default (send_updates defaults to none). These are behavioral traits the annotations (readOnly=false, destructiveHint=true, idempotentHint=true, openWorldHint=true) do not convey, and they do not contradict any of them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries a distinct operational warning: PATCH semantics, replacement behavior, time pairing, recurrence addressing, notification defaults, applicability, and return value. The most critical constraint is front-loaded in the first sentence, and there is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter mutation tool with no output schema, the description covers all major failure modes: lost guest lists, broken time updates, accidental series-wide changes, silent notifications, and OOO/focus-time applicability. It also states the return value ("Returns the updated event"). Remaining details like the exclusive end_date are already in the schema, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter is already documented. The description adds update-specific meta-semantics the schema cannot express uniformly: PATCH merge behavior, "a provided nested object REPLACES its predecessor wholesale", the requirement to pair start/end, and the send_updates default. It does not restate individual parameter formats, which the schema already covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening phrase "Partially updates an event (PATCH): only the provided fields change" names a specific verb, resource, and method in one breath. It further distinguishes itself from siblings by spelling out the recurrence nuance (instance id vs series master id) and noting it "Also works to update Out of Office / Focus Time blocks," so an agent can separate it from create_event, delete_event, and move_event without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong conditional routing: "get_event first, send the complete new list" for attendees, "pass that instance's id (from list_event_instances)" for rescheduling one recurrence, and "Guests hear about the change only with send_updates=all". It references sibling tools as preconditions. It does not explicitly contrast against move_event (for a pure time shift) or delete_event, so exclusions are implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 13 tool updatesv0.1.0
    • First observedcreate_event
    • First observedcreate_focus_time
    • First observedcreate_out_of_office
    • First observeddelete_event
    • First observedget_calendar
    • First observedget_event
    • First observedlist_calendars
    • First observedlist_event_instances
    • First observedlist_events
    • First observedmove_event
    • First observedquery_free_busy
    • First observedraw_request
    • First observedupdate_event

TDQS

A4.6/5.0
Disambiguation5/5

Each tool targets a distinct resource and action: calendar listing/fetching, event CRUD, move, instance expansion, free/busy lookup, specialized event creation, and raw API access. The specialized create_out_of_office and create_focus_time are clearly differentiated from create_event by their purpose and constraints.

Naming Consistency4/5

Most tools follow a consistent snake_case verb_noun pattern (list_events, get_event, create_event, update_event, delete_event, move_event), with create_out_of_office and create_focus_time fitting the same style. raw_request is the only exception, but as an intentional escape hatch it is a minor deviation.

Tool Count5/5

13 tools is well within the ideal 3-15 range and each tool earns its place for calendar management. The count covers core CRUD, recurrence handling, availability lookup, specialized event types, and a raw API escape hatch without feeling bloated.

Completeness5/5

The surface covers calendar listing/fetching, full event lifecycle including move and recurring-instance management, free/busy queries, and specialized OOO/focus events. raw_request fills any remaining gaps such as calendar creation, ACLs, colors, quickAdd, and conference cleanup, leaving no significant dead ends.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/A1-x-Tech/mcp-google-calendar'

If you have feedback or need assistance with the MCP directory API, please join our Discord server