{"formatVersion":"1","kind":"dock_integration","slug":"google-calendar","title":"Google Calendar","summary":"Import a Harbor-safe Google Calendar starter set for calendars, settings, free/busy checks, and event authoring.","description":"A Dock-hosted Google Calendar starter integration for Harbor. Importing it creates a local http_api port shell and syncs a reviewable live action surface for primary calendar reads with typed query filters plus a few explicit approval-friendly write capabilities.","version":"0.2.0","publisher":{"slug":"google","name":"Google","websiteUrl":"https://developers.google.com/workspace/calendar/api/guides/overview"},"category":"Calendar","tags":["google","calendar","events","productivity","scheduling"],"compatibility":{"harborNode":">=0.1.0","notes":"Requires local operator-configured auth after import."},"requiredPlan":"business","portTemplates":[{"kind":"http_api","label":"Google Calendar API","description":"Google Calendar API connection managed locally through Harbor.","baseUrl":"https://www.googleapis.com/","authMode":"header_token","authHeaderName":"Authorization","authTokenPrefix":"Bearer"}],"actionTemplates":[{"slug":"list-calendar-list","label":"List Calendar List","description":"List calendars visible to the authenticated Google Calendar account with typed pagination and visibility filters.","method":"GET","path":"/calendar/v3/users/me/calendarList","inputs":{"parameters":[{"name":"maxResults","in":"query","schema":{"type":"integer","minimum":1,"maximum":250},"default":100,"description":"Maximum number of calendars to return."},{"name":"pageToken","in":"query","schema":{"type":"string"},"description":"Continuation token from a previous calendar list response."},{"name":"showDeleted","in":"query","schema":{"type":"boolean"},"description":"Whether to include deleted calendars."},{"name":"showHidden","in":"query","schema":{"type":"boolean"},"description":"Whether to include hidden calendars."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-settings","label":"List Calendar Settings","description":"List Google Calendar settings for the authenticated account with typed pagination inputs.","method":"GET","path":"/calendar/v3/users/me/settings","inputs":{"parameters":[{"name":"maxResults","in":"query","schema":{"type":"integer","minimum":1,"maximum":250},"default":100,"description":"Maximum number of settings entries to return."},{"name":"pageToken","in":"query","schema":{"type":"string"},"description":"Continuation token from a previous settings list response."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-colors","label":"Get Calendar Colors","description":"Fetch the Google Calendar color definitions available to the authenticated account.","method":"GET","path":"/calendar/v3/colors","approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-primary-calendar","label":"Get Primary Calendar","description":"Fetch metadata for the authenticated account's primary calendar.","method":"GET","path":"/calendar/v3/calendars/primary","approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-calendar","label":"Get Calendar","description":"Fetch metadata for a specific Google Calendar using an explicit calendar ID.","method":"GET","path":"/calendar/v3/calendars/{calendarId}","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-primary-events","label":"List Primary Calendar Events","description":"List events from the authenticated account's primary Google Calendar with typed time-window and pagination filters.","method":"GET","path":"/calendar/v3/calendars/primary/events","inputs":{"parameters":[{"name":"timeMin","in":"query","schema":{"type":"string"},"description":"Lower RFC3339 time bound for returned events."},{"name":"timeMax","in":"query","schema":{"type":"string"},"description":"Upper RFC3339 time bound for returned events."},{"name":"maxResults","in":"query","schema":{"type":"integer","minimum":1,"maximum":2500},"default":100,"description":"Maximum number of events to return."},{"name":"pageToken","in":"query","schema":{"type":"string"},"description":"Continuation token from a previous events list response."},{"name":"singleEvents","in":"query","schema":{"type":"boolean"},"description":"Whether recurring events should be expanded into single instances."},{"name":"orderBy","in":"query","schema":{"type":"string","enum":["startTime","updated"]},"description":"Event ordering to apply."},{"name":"q","in":"query","schema":{"type":"string","maxLength":500},"description":"Free-text event search query."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-calendar-events","label":"List Calendar Events","description":"List events from a specific Google Calendar using an explicit calendar ID with typed time-window and pagination filters.","method":"GET","path":"/calendar/v3/calendars/{calendarId}/events","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."},{"name":"timeMin","in":"query","schema":{"type":"string"},"description":"Lower RFC3339 time bound for returned events."},{"name":"timeMax","in":"query","schema":{"type":"string"},"description":"Upper RFC3339 time bound for returned events."},{"name":"maxResults","in":"query","schema":{"type":"integer","minimum":1,"maximum":2500},"default":100,"description":"Maximum number of events to return."},{"name":"pageToken","in":"query","schema":{"type":"string"},"description":"Continuation token from a previous events list response."},{"name":"singleEvents","in":"query","schema":{"type":"boolean"},"description":"Whether recurring events should be expanded into single instances."},{"name":"orderBy","in":"query","schema":{"type":"string","enum":["startTime","updated"]},"description":"Event ordering to apply."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-event","label":"Get Calendar Event","description":"Fetch a specific Google Calendar event using explicit calendar and event identifiers.","method":"GET","path":"/calendar/v3/calendars/{calendarId}/events/{eventId}","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."},{"name":"eventId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar event ID."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-primary-acl","label":"List Primary Calendar ACL","description":"List ACL rules for the authenticated account's primary calendar with typed pagination inputs.","method":"GET","path":"/calendar/v3/calendars/primary/acl","inputs":{"parameters":[{"name":"maxResults","in":"query","schema":{"type":"integer","minimum":1,"maximum":250},"default":100,"description":"Maximum number of ACL entries to return."},{"name":"pageToken","in":"query","schema":{"type":"string"},"description":"Continuation token from a previous ACL list response."},{"name":"showDeleted","in":"query","schema":{"type":"boolean"},"description":"Whether to include deleted ACL entries."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-acl-rule","label":"Create ACL Rule","description":"Create a Google Calendar ACL rule using an explicit calendar ID and a bounded JSON request body.","method":"POST","path":"/calendar/v3/calendars/{calendarId}/acl","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"update-acl-rule","label":"Update ACL Rule","description":"Update a Google Calendar ACL rule using explicit calendar and rule identifiers with a bounded JSON request body.","method":"PUT","path":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."},{"name":"ruleId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"ACL rule ID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-acl-rule","label":"Delete ACL Rule","description":"Delete a Google Calendar ACL rule using explicit calendar and rule identifiers.","method":"DELETE","path":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."},{"name":"ruleId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"ACL rule ID."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"query-freebusy","label":"Query FreeBusy","description":"Query free/busy availability through a bounded JSON request using Harbor-managed local auth.","method":"POST","path":"/calendar/v3/freeBusy","approvalMode":"automatic","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-primary-event","label":"Create Primary Calendar Event","description":"Create an event on the authenticated account's primary Google Calendar using a bounded JSON payload.","method":"POST","path":"/calendar/v3/calendars/primary/events","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"move-event","label":"Move Event","description":"Move a Google Calendar event to another calendar using explicit calendar and event identifiers with a destination calendar query parameter.","method":"POST","path":"/calendar/v3/calendars/{calendarId}/events/{eventId}/move","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Source Google Calendar ID."},{"name":"eventId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar event ID."},{"name":"destination","in":"query","required":true,"schema":{"type":"string","minLength":1},"description":"Destination calendar ID."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"import-event","label":"Import Event","description":"Import an event into a Google Calendar using an explicit calendar ID and a bounded JSON request body.","method":"POST","path":"/calendar/v3/calendars/{calendarId}/events/import","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"update-event","label":"Update Calendar Event","description":"Update a Google Calendar event using explicit calendar and event identifiers with a bounded JSON payload.","method":"PUT","path":"/calendar/v3/calendars/{calendarId}/events/{eventId}","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."},{"name":"eventId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar event ID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-event","label":"Delete Calendar Event","description":"Delete a Google Calendar event using explicit calendar and event identifiers.","method":"DELETE","path":"/calendar/v3/calendars/{calendarId}/events/{eventId}","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."},{"name":"eventId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar event ID."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"clear-calendar","label":"Clear Calendar","description":"Delete all events from a Google Calendar using an explicit calendar ID.","method":"POST","path":"/calendar/v3/calendars/{calendarId}/clear","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-calendar","label":"Create Calendar","description":"Create a new Google Calendar for the authenticated account using a bounded JSON payload.","method":"POST","path":"/calendar/v3/calendars","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-calendar","label":"Delete Calendar","description":"Delete a Google Calendar using an explicit calendar ID.","method":"DELETE","path":"/calendar/v3/calendars/{calendarId}","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"watch-events","label":"Watch Events","description":"Start change notifications for events on a specific Google Calendar using a bounded JSON request body.","method":"POST","path":"/calendar/v3/calendars/{calendarId}/events/watch","inputs":{"parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Google Calendar ID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"watch-calendar-list","label":"Watch Calendar List","description":"Start change notifications for the authenticated user's calendar list using a bounded JSON request body.","method":"POST","path":"/calendar/v3/users/me/calendarList/watch","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"}],"workflowTemplates":[{"slug":"daily-agenda-digest","title":"Daily Agenda Digest","summary":"Future workflow template for a daily calendar summary."}],"helpText":"Import to Harbor, configure local auth, then use the starter Google Calendar actions immediately. Use `input.query` for list filters and time windows, and keep create-event and create-calendar approval-friendly unless your local policy explicitly allows them.","installNotes":"Dock shares only safe metadata. Hidden auth must be configured locally inside Harbor after import. This starter set uses Harbor's Action Model with typed list filters under `input.query` and JSON write bodies under `input.body`."}