From Google Calendar
Creates, reads, updates, moves, and deletes Google Calendar events; checks free/busy; manages calendars and ACL sharing. Useful for scheduling and availability queries.
How this skill is triggered — by the user, by Claude, or both
Slash command
/google-calendar:google-calendarThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
_Independent, unofficial connector for Google Calendar. Not affiliated with, endorsed by, or sponsored by Google Calendar. "Google Calendar" is a trademark of its owner, used only to identify the service this connector works with._
CHANGELOG.mdLICENSENOTICEREADME.mdcli.jscli.tsconnections.tsevals/evals.jsonindex.tslib/google-calendar.tspackage.jsonreferences/google-calendar-api-gotchas.mdscripts/addEventAttendees.tsscripts/createAclRule.tsscripts/createCalendar.tsscripts/createEvent.tsscripts/deleteAclRule.tsscripts/deleteEvent.tsscripts/getCalendar.tsscripts/getColors.tsIndependent, unofficial connector for Google Calendar. Not affiliated with, endorsed by, or sponsored by Google Calendar. "Google Calendar" is a trademark of its owner, used only to identify the service this connector works with.
Tools for managing Google Calendar — create, read, update, move, and delete events; search a calendar; list and create calendars; check free/busy availability; resolve the event-color palette; and manage calendar sharing (ACL). Wraps the Google Calendar API v3 (https://www.googleapis.com/calendar/v3/). Authentication is OAuth 2.0 over a single connection — capability is gated by scope and by each calendar's access role, not by token type.
owner role).This is an agentskills.io skill.
If this connector is already exposed to you as callable tools (e.g. mcp__google-calendar__<tool>), that's a valid path — call them directly. Everything below is only for standalone terminal use when no such tools are loaded.
If the connector has not been installed as a skill yet, install it first with npx skills zapier/connectors --skill google-calendar (or your harness's own skill-install mechanism), then continue here.
The connector runs on Node.js 22.18+ and needs a one-time npm install in this directory. cli.js is the entry point — list every script with node cli.js --help, then learn a script's inputs and connections with node cli.js run <script> --help. On older Node, run node cli.js --help anyway: it detects your runtime and prints how to run without upgrading (the prebuilt npm package, or another runtime) — don't skip the connector just because Node is old.
cli.js self-checks readiness before running: if dependencies aren't installed it exits non-zero with the exact install command (it disambiguates a read-only directory from a sandbox-blocked package cache). Run that, then re-run your command.
| Script | Script name | Connections | Description |
|---|---|---|---|
scripts/createEvent.ts | createEvent | Single ("google-calendar") | Create an event (timed/all-day, recurring, attendees, reminders, color, Google Meet). |
scripts/quickAddEvent.ts | quickAddEvent | Single ("google-calendar") | Create an event from a simple text string — parses a title and date/time. |
scripts/updateEvent.ts | updateEvent | Single ("google-calendar") | Partially update an event. Array fields REPLACE; use addEventAttendees to add guests. |
scripts/addEventAttendees.ts | addEventAttendees | Single ("google-calendar") | Add guests to an event without removing the existing attendees (read-modify-write). |
scripts/moveEvent.ts | moveEvent | Single ("google-calendar") | Move an event to another calendar (default events only). |
scripts/deleteEvent.ts | deleteEvent | Single ("google-calendar") | Delete an event. Idempotent — already-deleted events still report success. |
scripts/listEvents.ts | listEvents | Single ("google-calendar") | List/search events on a calendar by time window, text, or event type. |
scripts/getEvent.ts | getEvent | Single ("google-calendar") | Retrieve a single event by id (e.g. to read a resolved Google Meet link). |
scripts/listEventInstances.ts | listEventInstances | Single ("google-calendar") | List the occurrences of a recurring event; resolves instance ids for single-occurrence edits. |
scripts/listCalendars.ts | listCalendars | Single ("google-calendar") | List calendars with id, access role, primary flag, and timezone. The primary calendarId resolver. |
scripts/getCalendar.ts | getCalendar | Single ("google-calendar") | Get a calendar's metadata; getCalendar("primary") returns the user's default timezone. |
scripts/createCalendar.ts | createCalendar | Single ("google-calendar") | Create a new secondary calendar. |
scripts/queryFreeBusy.ts | queryFreeBusy | Single ("google-calendar") | Return busy time blocks across one or more calendars in a window. |
scripts/getColors.ts | getColors | Single ("google-calendar") | Return the event + calendar color palettes (colorId index → hex). |
scripts/listAclRules.ts | listAclRules | Single ("google-calendar") | List a calendar's sharing rules. Requires the owner role. |
scripts/createAclRule.ts | createAclRule | Single ("google-calendar") | Share a calendar with a user/group/domain at a role (or change a share's role). Requires owner. |
scripts/deleteAclRule.ts | deleteAclRule | Single ("google-calendar") | Remove a sharing rule (revoke access). Requires owner. |
Each script's inputSchema / outputSchema (Zod) in the script file is the source of truth for its contract.
listCalendars, count exact (case-insensitive) summary matches: exactly one → act on it; two or more that tie → stop, list the candidates with their id + accessRole, and ask which one. The same applies to events resolved by listEvents (a person can have several events with the same title) and to ACL rules resolved by listAclRules. Never silently pick the first match.calendars.clear), import externally-originated events (events.import), do "this-and-following" recurring edits in one call, or set up triggers/notifications (watch channels). If a user asks for one of these, say it's not supported and stop — don't substitute a different tool (e.g. deleting events one by one to simulate "clear the calendar", or patching the master to fake "this and following") and report success for an action you didn't perform. For a single recurring occurrence, use listEventInstances → updateEvent on the instance id.Pass auth as one connection string with --connection [<resolver>:]<value>. The value is a selector, not the secret; the <resolver>: prefix is optional (a bare value goes to the first resolver that claims it). Each script declares the connections it needs and the resolvers each accepts — always run node cli.js run <script> --help to see them rather than relying on this file.
Google Calendar ships two resolvers, Zapier-first: prefer zapier; fall back to env.
zapier:<connection-id> (recommended) — route through a Zapier Google Calendar connection. Prerequisite: a Zapier account (free signup at https://zapier.com). The user authorises Google once via Zapier's OAuth flow at https://zapier.com/app/connections; Zapier then handles token refresh transparently. A bare, UUID-shaped value auto-claims this resolver, so --connection <connection-id> works without the zapier: prefix.
Finding the connection ID (the connections UI doesn't expose IDs):
npx zapier-sdk get-profile. If unauthenticated, run npx zapier-sdk login once.npx zapier-sdk list-connections GoogleCalendarCLIAPI — prints title (connection ID) per matching connection. Add --json for machine-readable output. If the user has multiple Google Calendar connections, list the titles and ask which to use.npx zapier-sdk --can-include-shared-connections list-connections GoogleCalendarCLIAPI --include-shared. Ask the user first before retrying with this on.env:<ENV_VAR> (fallback) — read a Google OAuth access token from the named environment variable and send it as Authorization: Bearer <token>. The value is the env-var NAME, not the token; the token stays in env and never touches argv. Conventionally --connection env:GOOGLE_CALENDAR_ACCESS_TOKEN. Caveat: Google access tokens expire ~1 hour after issue and this resolver does NOT refresh them — direct mode suits short-lived/testing use; the Zapier-managed connection (recommended) refreshes transparently.
The connect step grants the https://www.googleapis.com/auth/calendar scope (full read/write across events, calendars, freebusy, colors, and ACL). A request made with too narrow a scope returns 403 insufficientPermissions — the connector surfaces "reconnect with calendar access". A 403 caused by too low an access role on a specific calendar (e.g. sharing changes need owner) is surfaced as a permission error — reconnecting won't fix it; the calendar's owner must grant access.
If no connection is passed the script fails with an actionable error telling you to Pass --connection [<resolver>:]<value> and lists the resolvers in match order.
After npm install, run a script by name with node cli.js run <script>, or execute its file directly — both take the same arguments and both accept --help. Always run a script's --help first to learn its exact input schema and connections, then invoke it:
# default — via the entry point; self-checks readiness and prints friendly diagnostics
node cli.js run <script> '<input-json>' --connection [<resolver>:]<value>
# shorthand — runs the script file directly (same args, same Node 22.18+ need, no readiness check)
./scripts/<script>.ts '<input-json>' --connection [<resolver>:]<value>
When a harness can't execute scripts directly, fall back to MCP — node cli.js mcp serves every script as a tool over stdio. Register it as a local MCP server in your client: the stanza is harness-specific (an mcpServers entry in Claude Desktop, Cursor, Claude Code, …) with command: "node", args: ["cli.js", "mcp"], run from this directory. Run node cli.js mcp --help for auth options. Add the stanza yourself if you can edit the client's MCP config; otherwise guide the user. If a local server isn't possible, guide the user to use Zapier's remote MCP servers at https://mcp.zapier.com instead.
Every script returns a { data, meta } envelope:
data — the script's result (the shape its outputSchema declares; run the script's --help to see that exact schema).meta.outputDataValidation — what validating data did:
{ skipped: false, droppedPaths: null } — validated, nothing removed.{ skipped: false, droppedPaths: [...], instruction } — validated, but those paths were stripped from data: fields the script returned from the API that the outputSchema doesn't declare. If you need them, re-run with output validation skipped.{ skipped: true } — validation was bypassed; data is the raw, unchecked script output.Reading dropped fields / skipOutputDataValidation. To receive the raw, unvalidated result, append --skipOutputDataValidation to the script invocation. Input validation is never skipped.
Trimming the result / filterOutputData. To shrink a large result down to the fields you need, append --filterOutputData '<jq>' — a jq expression that post-processes data. The jq runs against data only, NOT the { data, meta } envelope, so write it rooted at data (run the script's --help to see its output schema). The transformed value replaces data, meta is preserved, and the result is NOT re-validated against the output schema.
Load the matching reference file before working in that area:
| Reference | Covers | Load it when |
|---|---|---|
| google-calendar-api-gotchas.md | The error envelope + recovery, all-day exclusive end.date, timeZone-required-for-recurrence, event-type creation constraints, async Meet creation, pagination caps, free/busy per-calendar errors, and ACL owner-role rules. | Before building event dates/times, recurrence, colors, or Google Meet links; when handling 401/403/404/410 errors; when updating events (array fields replace wholesale); or when sharing calendars (ACL). |
npx claudepluginhub zapier/marketplace --plugin google-calendarAutomate Google Calendar: create/update/delete events, find free slots, manage attendees, list calendars using Rube MCP and Composio toolkit.
Automates Google Calendar workflows including event creation, scheduling, availability checks, and attendee management using Rube MCP (Composio) toolkit.
Reads and manages Google Calendar events, agenda, free-busy, and invitations using the Calendar v3 REST API. Handles scheduling, rescheduling, and cancellations.