{"id":"7be38262-d089-4d53-b77c-033d6a3466cb","shortId":"uS99wg","kind":"skill","title":"google-calendar","tagline":"Read and manage Google Calendar events / agenda / free-busy / invitations via the Calendar v3 REST API. Use when the user mentions Google Calendar events, today's agenda, this week's meetings, finding conflicts, listing invitations, checking free time, or scheduling / reschedulin","description":"Drive Google Calendar via `curl + jq`. The user's OAuth bearer token\nis in `$GOOGLE_CALENDAR_TOKEN`; every call needs it as\n`Authorization: Bearer $GOOGLE_CALENDAR_TOKEN`. At minimum the token\ncarries `calendar.readonly` plus the identity scopes\n(`openid email profile`); if the user opted in to write at install\ntime it also carries the broader `calendar` scope (read + write).\n\nThe Calendar API returns standard JSON; failures surface as\n`{\"error\": {\"code\": 401|403|..., \"message\": \"...\"}}` — show that\nerror verbatim. `401` means the token expired (re-install). `403\ninsufficientPermissions` on a write means the user only granted\n`calendar.readonly` — ask them to re-install the connector with the\nread+write box checked.\n\n**Always start with `users/me/calendarList`** to learn which calendars\nthe account can see (the user's primary plus any subscribed / shared\nones), AND with `users/me/settings/timezone` so you render times in\nthe user's local zone instead of UTC.\n\n**Before any destructive write** (creating, moving, or cancelling an\nevent that has attendees) show the exact event details and ask the\nuser to confirm. When attendees are involved, also confirm whether\nthey want Google to email the attendees — that's controlled by the\n`sendUpdates` query parameter.\n\n## Optional: Google Workspace CLI (`gws`) for agenda + create\n\n[`gws`](https://github.com/googleworkspace/cli) is Google's official CLI\n(not officially supported — community-maintained on the `googleworkspace`\norg). It dynamically builds its command surface from Google's Discovery\nDocument, exits non-zero on API errors, and ships hand-crafted helper\ncommands (prefixed `+`) for time-aware workflows.\n\n**Use `gws` for two specific cases:**\n\n- `+agenda` reads the user's account timezone from `Settings.timezone`\n  (cached for 24 h) and renders today's events in that zone, so you don't\n  have to fetch the timezone yourself before formatting times.\n- `+insert` shapes the create-event JSON for you (attendees, sendUpdates,\n  reminders) so a one-line invocation produces a well-formed request.\n\nFor everything else (events.list / patch / move / delete, freebusy,\ncalendarList) the curl recipes below are equivalent and shorter — stay\non those.\n\n### Install\n\n```sh\nnpm install -g @googleworkspace/cli   # or: brew install googleworkspace-cli\n# Pre-built binaries also at https://github.com/googleworkspace/cli/releases\ngws --version\n```\n\n### Auth\n\n`gws` reads its OAuth bearer token from the `GOOGLE_WORKSPACE_CLI_TOKEN`\nenvironment variable. The Calendar token used in this skill is in\n`$GOOGLE_CALENDAR_TOKEN`, so re-export it once at the top of every shell\nblock that calls `gws`:\n\n```sh\nexport GOOGLE_WORKSPACE_CLI_TOKEN=\"$GOOGLE_CALENDAR_TOKEN\"\n```\n\n### Agenda + create\n\n```sh\n# Today on the primary calendar, in the account's own timezone\ngws calendar +agenda\n\n# Today / week, with explicit overrides\ngws calendar +agenda --today --tz America/New_York\ngws calendar +agenda --range week\n\n# Create an event (auto-shapes attendees + sendUpdates JSON)\ngws calendar +insert --calendar primary \\\n  --json '{\n    \"summary\":\"Standup\",\n    \"start\":{\"dateTime\":\"2026-05-06T10:00:00-04:00\"},\n    \"end\":  {\"dateTime\":\"2026-05-06T10:30:00-04:00\"},\n    \"attendees\":[{\"email\":\"alice@example.com\"}]\n  }' \\\n  --params '{\"sendUpdates\":\"all\"}'\n```\n\nBoth helpers exit non-zero with a structured JSON error on stderr if\nGoogle rejects the request — surface that verbatim. `+insert` against\nattendees requires the broader `calendar` scope; on `403\ninsufficientPermissions` ask the user to re-install with read+write\nchecked.\n\n## Recipes\n\n### Verify auth + discover calendars (always run first)\n\n```sh\n# Account confirmation + calendars the user can read\ncurl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/calendarList\" \\\n  | jq '.items[] | {id, summary, primary, accessRole, timeZone}'\n\n# User's preferred display zone (use this when formatting times)\ncurl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/settings/timezone\" \\\n  | jq -r .value\n```\n\nThe `id` of each calendar (`primary`, or an email-shaped id like\n`team-monday@group.calendar.google.com`) is what subsequent\n`calendars/{id}/events` calls take.\n\n### Today's agenda on the primary calendar\n\n```sh\nTZ=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/settings/timezone\" | jq -r .value)\nTODAY=$(TZ=$TZ date +%Y-%m-%d)\nSTART=\"${TODAY}T00:00:00Z\"\nEND=\"${TODAY}T23:59:59Z\"\n\ncurl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  --get \"https://www.googleapis.com/calendar/v3/calendars/primary/events\" \\\n  --data-urlencode \"timeMin=$START\" \\\n  --data-urlencode \"timeMax=$END\" \\\n  --data-urlencode 'singleEvents=true' \\\n  --data-urlencode 'orderBy=startTime' \\\n  --data-urlencode \"timeZone=$TZ\" \\\n  | jq '.items[] | {summary, start: (.start.dateTime // .start.date), end: (.end.dateTime // .end.date), location, attendees: [.attendees[]?.email], hangout: .hangoutLink, status, htmlLink}'\n```\n\n`singleEvents=true` flattens recurring meetings into individual\ninstances — almost always what you want for an agenda. Without it,\nyou'd get the recurrence rule once and have to expand it client-side.\n\n### This week's meetings (Mon–Sun)\n\n```sh\nTZ=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/settings/timezone\" | jq -r .value)\n# Bash date math: Monday-of-this-week\nMON=$(TZ=$TZ date -d \"$(TZ=$TZ date +%Y-%m-%d) -$(($(TZ=$TZ date +%u) - 1)) days\" +%Y-%m-%d 2>/dev/null \\\n  || TZ=$TZ date -v-mondayw +%Y-%m-%d)  # macOS fallback\nSUN=$(TZ=$TZ date -d \"$MON +6 days\" +%Y-%m-%d 2>/dev/null \\\n  || TZ=$TZ date -v+6d -j -f %Y-%m-%d \"$MON\" +%Y-%m-%d)\n\ncurl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  --get \"https://www.googleapis.com/calendar/v3/calendars/primary/events\" \\\n  --data-urlencode \"timeMin=${MON}T00:00:00Z\" \\\n  --data-urlencode \"timeMax=${SUN}T23:59:59Z\" \\\n  --data-urlencode 'singleEvents=true' \\\n  --data-urlencode 'orderBy=startTime' \\\n  | jq -r '.items[] | \"\\(.start.dateTime // .start.date)\\t\\(.summary)\\t\\((.attendees // []) | length) attendees\"'\n```\n\n### Search events by query\n\n```sh\nQ='quarterly review'\ncurl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  --get \"https://www.googleapis.com/calendar/v3/calendars/primary/events\" \\\n  --data-urlencode \"q=$Q\" \\\n  --data-urlencode 'singleEvents=true' \\\n  --data-urlencode 'maxResults=20' \\\n  | jq '.items[] | {start: .start.dateTime, summary, htmlLink}'\n```\n\n`q` matches against summary, description, location, attendee emails,\nand creator/organizer.\n\n### Get one event's full details (incl. attendees, location, link)\n\n```sh\nEVENT_ID='abc123def4567890ghijklmnop'\ncurl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events/$EVENT_ID\" \\\n  | jq '{summary, start, end, location, description, attendees, organizer, hangoutLink, conferenceData}'\n```\n\n### Free / busy across multiple calendars (next 7 days)\n\n```sh\nTZ=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/settings/timezone\" | jq -r .value)\nNOW=$(TZ=$TZ date -u +%Y-%m-%dT%H:%M:%SZ)\nNEXT_WEEK=$(TZ=$TZ date -u -d \"+7 days\" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \\\n  || TZ=$TZ date -u -v+7d +%Y-%m-%dT%H:%M:%SZ)\n\ncat > /tmp/freebusy.json <<JSON\n{\n  \"timeMin\": \"$NOW\",\n  \"timeMax\": \"$NEXT_WEEK\",\n  \"timeZone\": \"$TZ\",\n  \"items\": [\n    {\"id\": \"primary\"},\n    {\"id\": \"team-monday@group.calendar.google.com\"}\n  ]\n}\nJSON\n\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data @/tmp/freebusy.json \\\n  \"https://www.googleapis.com/calendar/v3/freeBusy\" \\\n  | jq '.calendars'\n```\n\nEach calendar's response is `{\"busy\": [{\"start\": \"...\", \"end\": \"...\"}]}`\n— gaps between are free.\n\n### List events on a non-primary calendar\n\n```sh\nCAL_ID='team-monday@group.calendar.google.com'\n# URL-encode the @ in the path\nCAL_ENCODED=$(printf %s \"$CAL_ID\" | jq -sRr @uri)\ncurl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  --get \"https://www.googleapis.com/calendar/v3/calendars/$CAL_ENCODED/events\" \\\n  --data-urlencode 'singleEvents=true' \\\n  --data-urlencode 'orderBy=startTime' \\\n  --data-urlencode 'maxResults=20' \\\n  | jq '.items[] | {start: .start.dateTime, summary}'\n```\n\n### Pagination\n\n```sh\nPAGE_TOKEN=''\nwhile : ; do\n  RESP=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n    --get \"https://www.googleapis.com/calendar/v3/calendars/primary/events\" \\\n    --data-urlencode 'singleEvents=true' \\\n    --data-urlencode 'orderBy=startTime' \\\n    --data-urlencode 'maxResults=250' \\\n    ${PAGE_TOKEN:+--data-urlencode \"pageToken=$PAGE_TOKEN\"})\n  echo \"$RESP\" | jq -c '.items[]?'\n  PAGE_TOKEN=$(echo \"$RESP\" | jq -r '.nextPageToken // empty')\n  [ -z \"$PAGE_TOKEN\" ] && break\ndone\n```\n\n## Write recipes\n\nThese all need the broader `calendar` scope. If the user only granted\n`calendar.readonly` you'll get `403 insufficientPermissions` —\nsurface that and ask them to re-install with the read+write box\nchecked. **Always echo the event summary, time and attendee list\nback to the user before creating or cancelling anything.**\n\n### Create a single event (with optional attendees + Google Meet link)\n\n```sh\nTZ=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/settings/timezone\" | jq -r .value)\n\ncat > /tmp/_cal_event.json <<JSON\n{\n  \"summary\": \"Sync — Q2 OKR review\",\n  \"location\": \"Online\",\n  \"description\": \"Drafted by AceDataCloud.\",\n  \"start\": {\"dateTime\": \"2026-05-12T10:00:00\", \"timeZone\": \"$TZ\"},\n  \"end\":   {\"dateTime\": \"2026-05-12T10:30:00\", \"timeZone\": \"$TZ\"},\n  \"attendees\": [\n    {\"email\": \"alice@example.com\"},\n    {\"email\": \"bob@example.com\"}\n  ],\n  \"reminders\": {\"useDefault\": true},\n  \"conferenceData\": {\n    \"createRequest\": {\n      \"requestId\": \"meet-$(date +%s)\",\n      \"conferenceSolutionKey\": {\"type\": \"hangoutsMeet\"}\n    }\n  }\n}\nJSON\n\n# sendUpdates: 'all' = email all attendees; 'externalOnly' = only non-org; 'none' = silent\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data @/tmp/_cal_event.json \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events?conferenceDataVersion=1&sendUpdates=all\" \\\n  | jq '{id, htmlLink, hangoutLink, summary, start, end, attendees}'\n```\n\nDrop the `conferenceData` block if the user didn't ask for a Meet\nlink — it'll fall back to a plain event.\n\n### Create a recurring event\n\n```sh\nTZ=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/settings/timezone\" | jq -r .value)\ncat > /tmp/_cal_recur.json <<JSON\n{\n  \"summary\": \"Weekly 1:1\",\n  \"start\": {\"dateTime\": \"2026-05-12T15:00:00\", \"timeZone\": \"$TZ\"},\n  \"end\":   {\"dateTime\": \"2026-05-12T15:30:00\", \"timeZone\": \"$TZ\"},\n  \"recurrence\": [\"RRULE:FREQ=WEEKLY;BYDAY=TU;COUNT=12\"]\n}\nJSON\ncurl -sS -X POST -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data @/tmp/_cal_recur.json \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events\" \\\n  | jq '{id, recurrence, summary}'\n```\n\nRRULE follows RFC 5545. Common patterns: `FREQ=DAILY`, `FREQ=WEEKLY;BYDAY=MO,WE,FR`,\n`FREQ=MONTHLY;BYMONTHDAY=15`. Add `UNTIL=20261231T235959Z` or `COUNT=12`\nfor a hard stop.\n\n### Update an existing event (PATCH — partial update)\n\n```sh\nEVENT_ID='abc123def4567890ghijklmnop'\ncurl -sS -X PATCH -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"location\":\"Conference Room 4\",\"description\":\"Now in-person.\"}' \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events/$EVENT_ID?sendUpdates=all\" \\\n  | jq '{id, summary, location, description}'\n```\n\n`PATCH` only changes the fields you send; `PUT` replaces the entire\nevent payload. Prefer `PATCH`.\n\n### Reschedule an event\n\n```sh\nEVENT_ID='abc123def4567890ghijklmnop'\nTZ=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/users/me/settings/timezone\" | jq -r .value)\ncat > /tmp/_cal_resched.json <<JSON\n{\n  \"start\": {\"dateTime\": \"2026-05-12T14:00:00\", \"timeZone\": \"$TZ\"},\n  \"end\":   {\"dateTime\": \"2026-05-12T14:30:00\", \"timeZone\": \"$TZ\"}\n}\nJSON\ncurl -sS -X PATCH -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data @/tmp/_cal_resched.json \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events/$EVENT_ID?sendUpdates=all\" \\\n  | jq '{id, summary, start, end}'\n```\n\n### Add or change attendees\n\nGoogle requires you to send the **complete** attendee list when\npatching attendees — fetch the current list, mutate, send back:\n\n```sh\nEVENT_ID='abc123def4567890ghijklmnop'\nCURRENT=$(curl -sS -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events/$EVENT_ID?fields=attendees\" \\\n  | jq '.attendees // []')\nNEW=$(echo \"$CURRENT\" | jq '. + [{\"email\":\"carol@example.com\"}]')\ncurl -sS -X PATCH -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  -H 'Content-Type: application/json' \\\n  --data \"{\\\"attendees\\\": $NEW}\" \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events/$EVENT_ID?sendUpdates=all\" \\\n  | jq '{id, attendees}'\n```\n\n### Cancel / delete an event\n\n```sh\nEVENT_ID='abc123def4567890ghijklmnop'\ncurl -sS -X DELETE -H \"Authorization: Bearer $GOOGLE_CALENDAR_TOKEN\" \\\n  \"https://www.googleapis.com/calendar/v3/calendars/primary/events/$EVENT_ID?sendUpdates=all\" \\\n  -o /dev/null -w 'HTTP %{http_code}\\n'\n```\n\n`204` = success. To cancel one occurrence of a recurring event, fetch\nthe instance with `events.instances` first, then `DELETE` the\nspecific instance id (it has a longer `EVENT_ID_YYYYMMDDTHHMMSSZ`\nshape).\n\n## Common error codes\n\n| HTTP | meaning | what to tell the user |\n|---|---|---|\n| `401 UNAUTHENTICATED` | token expired / revoked | \"Reconnect the Google Calendar connector on the Connections page.\" |\n| `403 insufficientPermissions` | write scope missing | \"This action needs the Calendar read+write scope, but only `calendar.readonly` was granted. Re-install the connector with the read+write box checked.\" |\n| `403 forbidden` | calendar id not visible to this account | check `calendarList` first; if it's a shared calendar, the owner needs to share it. |\n| `404 notFound` | wrong event / calendar id | double-check the id and try `calendarList` to confirm the calendar exists. |\n| `409 conflict` | recurring event id collision | append a UUID to your `requestId` and retry. |\n| `429 quotaExceeded` | quota / throttling | back off ~5s, then retry once. |\n\nNever log or echo `$GOOGLE_CALENDAR_TOKEN` — treat it as a secret.","tags":["google","calendar","skills","acedatacloud","acedata-cloud","agent-skills","agentskills","ai-image","ai-music","ai-tools","ai-video","claude-code"],"capabilities":["skill","source-acedatacloud","skill-google-calendar","topic-acedata-cloud","topic-agent-skills","topic-agentskills","topic-ai-image","topic-ai-music","topic-ai-tools","topic-ai-video","topic-claude-code","topic-cursor","topic-gemini-cli","topic-github-copilot","topic-mcp"],"categories":["Skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/AceDataCloud/Skills/google-calendar","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add AceDataCloud/Skills","source_repo":"https://github.com/AceDataCloud/Skills","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (14,890 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:14:02.214Z","embedding":null,"createdAt":"2026-05-18T13:21:32.559Z","updatedAt":"2026-05-18T19:14:02.214Z","lastSeenAt":"2026-05-18T19:14:02.214Z","tsv":"'+6':851,862 '+7':1050,1065 '-04':514,524 '-05':509,519,1339,1349,1466,1476,1631,1641 '-06':510,520 '-12':1340,1350,1467,1477,1632,1642 '/calendar/v3/calendars/$cal_encoded/events':1162 '/calendar/v3/calendars/primary/events':706,884,941,1201,1511 '/calendar/v3/calendars/primary/events/$event_id':997 '/calendar/v3/calendars/primary/events/$event_id?fields=attendees':1712 '/calendar/v3/calendars/primary/events/$event_id?sendupdates=all':1582,1668,1741,1765 '/calendar/v3/calendars/primary/events?conferencedataversion=1&sendupdates=all':1405 '/calendar/v3/freebusy':1108 '/calendar/v3/users/me/calendarlist':601 '/calendar/v3/users/me/settings/timezone':629,674,800,1028,1318,1452,1621 '/dev/null':833,857,1059,1767 '/events':652 '/googleworkspace/cli)':250 '/googleworkspace/cli/releases':401 '/tmp/_cal_event.json':1323,1402 '/tmp/_cal_recur.json':1457,1508 '/tmp/_cal_resched.json':1626,1665 '/tmp/freebusy.json':1074,1105 '00':512,513,515,523,525,688,891,1342,1343,1353,1469,1470,1480,1634,1635,1645 '00z':689,892 '1':827,1461,1462 '12':1490,1539 '15':1533 '2':832,856,1058 '20':956,1177 '2026':508,518,1338,1348,1465,1475,1630,1640 '20261231t235959z':1536 '204':1773 '24':314 '250':1216 '30':522,1352,1479,1644 '4':1574 '401':116,123,1813 '403':117,131,562,1261,1827,1856 '404':1880 '409':1899 '429':1913 '5545':1519 '59':693,899 '59z':694,900 '5s':1919 '7':1014 'abc123def4567890ghijklmnop':986,1554,1609,1700,1752 'accessrol':607 'account':165,308,466,584,1864 'acedatacloud':1335 'across':1010 'action':1833 'add':1534,1674 'agenda':10,31,245,303,456,472,480,486,657,764 'alice@example.com':528,1358 'almost':757 'also':97,221,397 'alway':156,580,758,1278 'america/new_york':483 'anyth':1295 'api':20,107,282 'append':1905 'application/json':1103,1400,1506,1569,1663,1735 'ask':142,212,564,1266,1423 'attende':205,218,230,346,495,526,555,742,743,919,921,969,980,1004,1285,1302,1356,1378,1413,1677,1685,1689,1714,1737,1744 'auth':404,577 'author':68,594,622,667,698,793,876,933,990,1021,1094,1154,1193,1311,1391,1445,1497,1560,1614,1654,1705,1726,1758 'auto':493 'auto-shap':492 'awar':295 'back':1287,1431,1696,1917 'bash':804 'bearer':56,69,409,595,623,668,699,794,877,934,991,1022,1095,1155,1194,1312,1392,1446,1498,1561,1615,1655,1706,1727,1759 'binari':396 'block':443,1417 'bob@example.com':1360 'box':154,1276,1854 'break':1241 'brew':388 'broader':100,558,1249 'build':268 'built':395 'busi':13,1009,1116 'byday':1487,1526 'bymonthday':1532 'c':1228 'cach':312 'cal':1132,1142,1146 'calendar':3,8,17,27,48,61,71,101,106,163,420,429,454,463,471,479,485,499,501,559,579,586,597,625,637,650,661,670,701,796,879,936,993,1012,1024,1097,1110,1112,1130,1157,1196,1250,1314,1394,1448,1500,1563,1617,1657,1708,1729,1761,1821,1836,1858,1873,1884,1897,1928 'calendar.readonly':78,141,1257,1842 'calendarlist':369,1866,1893 'call':64,445,653 'cancel':200,1294,1745,1776 'carol@example.com':1720 'carri':77,98 'case':302 'cat':1073,1322,1456,1625 'chang':1590,1676 'check':40,155,574,1277,1855,1865,1888 'cli':242,255,392,415,451 'client':780 'client-sid':779 'code':115,1771,1805 'collis':1904 'command':270,290 'common':1520,1803 'communiti':260 'community-maintain':259 'complet':1684 'confer':1572 'conferencedata':1007,1364,1416 'conferencesolutionkey':1370 'confirm':216,222,585,1895 'conflict':37,1900 'connect':1825 'connector':149,1822,1849 'content':1101,1398,1504,1567,1661,1733 'content-typ':1100,1397,1503,1566,1660,1732 'control':233 'count':1489,1538 'craft':288 'creat':197,246,341,457,489,1292,1296,1436 'create-ev':340 'createrequest':1365 'creator/organizer':972 'curl':50,371,591,619,664,695,790,873,930,987,1018,1089,1151,1190,1308,1386,1442,1492,1555,1611,1649,1702,1721,1753 'current':1692,1701,1717 'd':684,768,816,822,831,842,849,855,863,868,872,1049,1066 'daili':1523 'data':708,713,718,723,728,886,894,902,907,943,948,953,1104,1164,1169,1174,1203,1208,1213,1220,1401,1507,1570,1664,1736 'data-urlencod':707,712,717,722,727,885,893,901,906,942,947,952,1163,1168,1173,1202,1207,1212,1219 'date':681,805,815,819,825,836,848,860,1035,1047,1062,1368 'datetim':507,517,1337,1347,1464,1474,1629,1639 'day':828,852,1015,1051 'delet':367,1746,1756,1790 'descript':967,1003,1332,1575,1587 'destruct':195 'detail':210,978 'didn':1421 'discov':578 'discoveri':275 'display':612 'document':276 'done':1242 'doubl':1887 'double-check':1886 'draft':1333 'drive':46 'drop':1414 'dt':1039,1054,1069 'dynam':267 'echo':1225,1232,1279,1716,1926 'els':363 'email':84,228,527,642,744,970,1357,1359,1376,1719 'email-shap':641 'empti':1237 'encod':1137,1143 'end':516,690,716,738,1001,1118,1346,1412,1473,1638,1673 'end.date':740 'end.datetime':739 'entir':1598 'environ':417 'equival':375 'error':114,121,283,542,1804 'event':9,28,202,209,320,342,491,923,975,984,1124,1281,1299,1435,1439,1547,1552,1599,1605,1607,1698,1748,1750,1782,1799,1883,1902 'events.instances':1787 'events.list':364 'everi':63,441 'everyth':362 'exact':208 'exist':1546,1898 'exit':277,534 'expand':777 'expir':127,1816 'explicit':476 'export':434,448 'externalon':1379 'f':865 'failur':111 'fall':1430 'fallback':844 'fetch':330,1690,1783 'field':1592 'find':36 'first':582,1788,1867 'flatten':751 'follow':1517 'forbidden':1857 'form':359 'format':335,617 'fr':1529 'free':12,41,1008,1122 'free-busi':11 'freebusi':368 'freq':1485,1522,1524,1530 'full':977 'g':385 'gap':1119 'get':703,769,881,938,973,1159,1198,1260 'github.com':249,400 'github.com/googleworkspace/cli)':248 'github.com/googleworkspace/cli/releases':399 'googl':2,7,26,47,60,70,226,240,252,273,413,428,449,453,546,596,624,669,700,795,878,935,992,1023,1096,1156,1195,1303,1313,1393,1447,1499,1562,1616,1656,1678,1707,1728,1760,1820,1927 'google-calendar':1 'googleworkspac':264,391 'googleworkspace-c':390 'googleworkspace/cli':386 'grant':140,1256,1844 'gws':243,247,298,402,405,446,470,478,484,498 'h':315,593,621,666,697,792,875,932,989,1020,1040,1055,1070,1093,1099,1153,1192,1310,1390,1396,1444,1496,1502,1559,1565,1613,1653,1659,1704,1725,1731,1757 'hand':287 'hand-craft':286 'hangout':745 'hangoutlink':746,1006,1409 'hangoutsmeet':1372 'hard':1542 'helper':289,533 'htmllink':748,962,1408 'http':1769,1770,1806 'id':604,634,644,651,985,1084,1086,1133,1147,1407,1513,1553,1584,1608,1670,1699,1743,1751,1794,1800,1859,1885,1890,1903 'ident':81 'in-person':1577 'incl':979 'individu':755 'insert':337,500,553 'instal':94,130,147,381,384,389,570,1271,1847 'instanc':756,1785,1793 'instead':190 'insufficientpermiss':132,563,1262,1828 'invit':14,39 'invoc':354 'involv':220 'item':603,733,913,958,1083,1179,1229 'j':864 'jq':51,602,630,675,732,801,911,957,998,1029,1109,1148,1178,1227,1234,1319,1406,1453,1512,1583,1622,1669,1713,1718,1742 'json':110,343,497,503,541,1075,1088,1324,1373,1458,1491,1627,1648 'learn':161 'length':920 'like':645 'line':353 'link':982,1305,1427 'list':38,1123,1286,1686,1693 'll':1259,1429 'local':188 'locat':741,968,981,1002,1330,1571,1586 'log':1924 'longer':1798 'm':683,821,830,841,854,867,871,1038,1041,1053,1056,1068,1071 'maco':843 'maintain':261 'manag':6 'match':964 'math':806 'maxresult':955,1176,1215 'mean':124,136,1807 'meet':35,753,785,1304,1367,1426 'mention':25 'messag':118 'minimum':74 'miss':1831 'mo':1527 'mon':786,812,850,869,889 'monday':808 'monday-of-this-week':807 'mondayw':839 'month':1531 'move':198,366 'multipl':1011 'mutat':1694 'n':1772 'need':65,1247,1834,1876 'never':1923 'new':1715,1738 'next':1013,1043,1079 'nextpagetoken':1236 'non':279,536,1128,1382 'non-org':1381 'non-primari':1127 'non-zero':278,535 'none':1384 'notfound':1881 'npm':383 'o':1766 'oauth':55,408 'occurr':1778 'offici':254,257 'okr':1328 'one':176,352,974,1777 'one-lin':351 'onlin':1331 'openid':83 'opt':89 'option':239,1301 'orderbi':725,909,1171,1210 'org':265,1383 'organ':1005 'overrid':477 'owner':1875 'page':1185,1217,1223,1230,1239,1826 'pagetoken':1222 'pagin':1183 'param':529 'paramet':238 'partial':1549 'patch':365,1548,1558,1588,1602,1652,1688,1724 'path':1141 'pattern':1521 'payload':1600 'person':1579 'plain':1434 'plus':79,172 'post':1092,1389,1495 'pre':394 'pre-built':393 'prefer':611,1601 'prefix':291 'primari':171,462,502,606,638,660,1085,1129 'printf':1144 'produc':355 'profil':85 'put':1595 'q':927,945,946,963 'q2':1327 'quarter':928 'queri':237,925 'quota':1915 'quotaexceed':1914 'r':631,676,802,912,1030,1235,1320,1454,1623 'rang':487 're':129,146,433,569,1270,1846 're-export':432 're-instal':128,145,568,1269,1845 'read':4,103,152,304,406,572,590,1274,1837,1852 'recip':372,575,1244 'reconnect':1818 'recur':752,1438,1781,1901 'recurr':771,1483,1514 'reject':547 'remind':348,1361 'render':182,317 'replac':1596 'request':360,549 'requestid':1366,1910 'requir':556,1679 'reschedul':1603 'reschedulin':45 'resp':1189,1226,1233 'respons':1114 'rest':19 'retri':1912,1921 'return':108 'review':929,1329 'revok':1817 'rfc':1518 'room':1573 'rrule':1484,1516 'rule':772 'run':581 'schedul':44 'scope':82,102,560,1251,1830,1839 'search':922 'secret':1934 'see':167 'send':1594,1682,1695 'sendupd':236,347,496,530,1374 'settings.timezone':311 'sh':382,447,458,583,662,788,926,983,1016,1131,1184,1306,1440,1551,1606,1697,1749 'shape':338,494,643,1802 'share':175,1872,1878 'shell':442 'ship':285 'shorter':377 'show':119,206 'side':781 'silent':1385 'singl':1298 'singleev':720,749,904,950,1166,1205 'skill':425 'skill-google-calendar' 'source-acedatacloud' 'specif':301,1792 'srr':1149 'ss':592,620,665,696,791,874,931,988,1019,1090,1152,1191,1309,1387,1443,1493,1556,1612,1650,1703,1722,1754 'standard':109 'standup':505 'start':157,506,685,711,735,959,1000,1117,1180,1336,1411,1463,1628,1672 'start.date':737,915 'start.datetime':736,914,960,1181 'starttim':726,910,1172,1211 'status':747 'stay':378 'stderr':544 'stop':1543 'structur':540 'subscrib':174 'subsequ':649 'success':1774 'summari':504,605,734,917,961,966,999,1182,1282,1325,1410,1459,1515,1585,1671 'sun':787,845,897 'support':258 'surfac':112,271,550,1263 'sync':1326 'sz':1042,1057,1072 't00':687,890 't10':511,521,1341,1351 't14':1633,1643 't15':1468,1478 't23':692,898 'take':654 'team-monday@group.calendar.google.com':646,1087,1134 'tell':1810 'throttl':1916 'time':42,95,183,294,336,618,1283 'time-awar':293 'timemax':715,896,1078 'timemin':710,888,1076 'timezon':309,332,469,608,730,1081,1344,1354,1471,1481,1636,1646 'today':29,318,459,473,481,655,678,686,691 'token':57,62,72,76,126,410,416,421,430,452,455,598,626,671,702,797,880,937,994,1025,1098,1158,1186,1197,1218,1224,1231,1240,1315,1395,1449,1501,1564,1618,1658,1709,1730,1762,1815,1929 'top':439 'topic-acedata-cloud' 'topic-agent-skills' 'topic-agentskills' 'topic-ai-image' 'topic-ai-music' 'topic-ai-tools' 'topic-ai-video' 'topic-claude-code' 'topic-cursor' 'topic-gemini-cli' 'topic-github-copilot' 'topic-mcp' 'treat':1930 'tri':1892 'true':721,750,905,951,1167,1206,1363 'tu':1488 'two':300 'type':1102,1371,1399,1505,1568,1662,1734 'tz':482,663,679,680,731,789,813,814,817,818,823,824,834,835,846,847,858,859,1017,1033,1034,1045,1046,1060,1061,1082,1307,1345,1355,1441,1472,1482,1610,1637,1647 'u':826,1036,1048,1063 'unauthent':1814 'updat':1544,1550 'uri':1150 'url':1136 'url-encod':1135 'urlencod':709,714,719,724,729,887,895,903,908,944,949,954,1165,1170,1175,1204,1209,1214,1221 'use':21,297,422,614 'usedefault':1362 'user':24,53,88,138,169,186,214,306,566,588,609,1254,1290,1420,1812 'users/me/calendarlist':159 'users/me/settings/timezone':179 'utc':192 'uuid':1907 'v':838,861,1064 'v-mondayw':837 'v3':18 'valu':632,677,803,1031,1321,1455,1624 'variabl':418 'verbatim':122,552 'verifi':576 'version':403 'via':15,49 'visibl':1861 'w':1768 'want':225,761 'week':33,474,488,783,811,1044,1080,1460,1486,1525 'well':358 'well-form':357 'whether':223 'without':765 'workflow':296 'workspac':241,414,450 'write':92,104,135,153,196,573,1243,1275,1829,1838,1853 'wrong':1882 'www.googleapis.com':600,628,673,705,799,883,940,996,1027,1107,1161,1200,1317,1404,1451,1510,1581,1620,1667,1711,1740,1764 'www.googleapis.com/calendar/v3/calendars/$cal_encoded/events':1160 'www.googleapis.com/calendar/v3/calendars/primary/events':704,882,939,1199,1509 'www.googleapis.com/calendar/v3/calendars/primary/events/$event_id':995 'www.googleapis.com/calendar/v3/calendars/primary/events/$event_id?fields=attendees':1710 'www.googleapis.com/calendar/v3/calendars/primary/events/$event_id?sendupdates=all':1580,1666,1739,1763 'www.googleapis.com/calendar/v3/calendars/primary/events?conferencedataversion=1&sendupdates=all':1403 'www.googleapis.com/calendar/v3/freebusy':1106 'www.googleapis.com/calendar/v3/users/me/calendarlist':599 'www.googleapis.com/calendar/v3/users/me/settings/timezone':627,672,798,1026,1316,1450,1619 'x':1091,1388,1494,1557,1651,1723,1755 'y':682,820,829,840,853,866,870,1037,1052,1067 'yyyymmddthhmmssz':1801 'z':1238 'zero':280,537 'zone':189,323,613","prices":[{"id":"ae945543-d9b4-4df1-a96c-bd792e5e1c76","listingId":"7be38262-d089-4d53-b77c-033d6a3466cb","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"AceDataCloud","category":"Skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:32.559Z"}],"sources":[{"listingId":"7be38262-d089-4d53-b77c-033d6a3466cb","source":"github","sourceId":"AceDataCloud/Skills/google-calendar","sourceUrl":"https://github.com/AceDataCloud/Skills/tree/main/skills/google-calendar","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:32.559Z","lastSeenAt":"2026-05-18T19:14:02.214Z"}],"details":{"listingId":"7be38262-d089-4d53-b77c-033d6a3466cb","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"AceDataCloud","slug":"google-calendar","github":{"repo":"AceDataCloud/Skills","stars":7,"topics":["acedata-cloud","agent-skills","agentskills","ai-image","ai-music","ai-tools","ai-video","claude-code","cursor","gemini-cli","github-copilot","mcp","npm","openai-codex","roo-code"],"license":"other","html_url":"https://github.com/AceDataCloud/Skills","pushed_at":"2026-05-18T07:35:03Z","description":"Agent Skills for AceDataCloud AI services — music, image, video generation, web search, and more. Compatible with Claude Code, GitHub Copilot, Gemini CLI, and all agentskills.io-compatible agents.","skill_md_sha":"69ca69f1c8e4682f13b70408d2f24ac6ea3a408c","skill_md_path":"skills/google-calendar/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/AceDataCloud/Skills/tree/main/skills/google-calendar"},"layout":"multi","source":"github","category":"Skills","frontmatter":{"name":"google-calendar","license":"Apache-2.0","description":"Read and manage Google Calendar events / agenda / free-busy / invitations via the Calendar v3 REST API. Use when the user mentions Google Calendar events, today's agenda, this week's meetings, finding conflicts, listing invitations, checking free time, or scheduling / rescheduling / cancelling a meeting."},"skills_sh_url":"https://skills.sh/AceDataCloud/Skills/google-calendar"},"updatedAt":"2026-05-18T19:14:02.214Z"}}