Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ASKADS_TELEMETRYNoSet to 0 to opt out of anonymous telemetry.1
GOOGLE_CALENDAR_API_BASENoGoogle API base URL override; default https://www.googleapis.com.https://www.googleapis.com
GOOGLE_CALENDAR_CLIENT_IDNoOAuth client ID.
GOOGLE_CALENDAR_TIMEOUT_MSNoPer-request timeout; default 60000 ms.60000
GOOGLE_CALENDAR_MAX_RETRIESNoTemporary-error retries; default 3.3
GOOGLE_CALENDAR_ACCESS_TOKENNoShort-lived (~1 hour) alternative to the OAuth trio.
GOOGLE_CALENDAR_CLIENT_SECRETNoOAuth client secret.
GOOGLE_CALENDAR_REFRESH_TOKENNoOAuth refresh token.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_calendarsA

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.

get_calendarA

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.

list_eventsA

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.

get_eventA

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.

create_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.

update_eventA

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.

delete_eventA

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}.

move_eventA

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.

list_event_instancesA

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.

query_free_busyA

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.

create_out_of_officeA

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.

create_focus_timeA

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.

raw_requestA

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.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

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