Calendar Sync Skill

Manage your Google Calendar — list events, create meetings, share calendars, manage attendee access. Use when asked about schedule, meetings, calendar sharing, or calendar permissions.

Calendar Management

Manage Google Calendar using bridge google. The bridge automatically resolves credentials from the claw owner's Google connection.

Scope error handling

Call the bridge command for the user's actual request directly — do not pre-flight a verifier call first. JIT will surface the right signal if a permission is missing; adding a verifier just triggers an unrelated extra consent prompt the user shouldn't have to grant.

MUST: when any bridge google command returns a JSON object with a "reason" field (no_connection, scope_required, team_claw_unsupported, expired) instead of API data, paste the entire JSON line verbatim in your reply on its own line. Paraphrasing, summarising, or omitting any field means the inline Connect button does not render and the user is stuck with no way to grant the permission. After the JSON line add one short sentence telling the user what's missing. Never offer browser walkthroughs, settings-page navigation, "open it in your browser" links, or other manual workarounds — the inline button is the only supported path.

Common Actions

List upcoming events

bridge google --skill calendar-sync calendar events list --params '{"calendarId":"primary","timeMin":"{{now_iso}}","maxResults":10,"singleEvents":true,"orderBy":"startTime"}'

Create an event

bridge google --skill calendar-sync calendar events insert --params '{"calendarId":"primary"}' --json '{
  "summary": "Meeting Title",
  "start": {"dateTime": "2026-03-25T10:00:00-04:00"},
  "end": {"dateTime": "2026-03-25T11:00:00-04:00"},
  "attendees": [{"email": "person@example.com"}]
}'

Pass conferenceDataVersion=1 and a conferenceData.createRequest so Google generates a Meet link automatically:

bridge google --skill calendar-sync calendar events insert --params '{"calendarId":"primary","conferenceDataVersion":1}' --json '{
  "summary": "Meeting Title",
  "start": {"dateTime": "2026-03-25T10:00:00-04:00"},
  "end": {"dateTime": "2026-03-25T11:00:00-04:00"},
  "attendees": [{"email": "person@example.com"}],
  "conferenceData": {
    "createRequest": {
      "requestId": "unique-request-id-here",
      "conferenceSolutionKey": {"type": "hangoutsMeet"}
    }
  }
}'

The Meet URL comes back in response.hangoutLink and response.conferenceData.entryPoints[].uri.

Create a standalone Meet space (no calendar event)

For ad-hoc meetings (e.g. "give me a Meet link to share right now", "create a Meet link without scheduling anything", "I just want a meeting URL"):

bridge google --skill calendar-sync meet spaces create --params '{}' --json '{
  "config": {"accessType": "TRUSTED"}
}'

accessType values: OPEN (anyone with link), TRUSTED (signed-in users in same org), RESTRICTED (only invited).

MUST: do not fall back to creating a calendar event with conferenceData.createRequest as a workaround. When the user explicitly asks for "just a Meet link", "no calendar event", or "without scheduling", the only correct path is meet spaces create. If that returns a scope_required JSON because the connection is missing meetings.space.created, paste the JSON verbatim per the scope-error rule above so the user can grant it inline. Never route the request through calendar events insert to dodge the missing scope — that grants the wrong permission, leaves a calendar artifact the user explicitly didn't want, and over-grants calendar.events for a Meet-only request.

Update an event

bridge google --skill calendar-sync calendar events patch --params '{"calendarId":"primary","eventId":"EVENT_ID"}' --json '{
  "summary": "Updated Title"
}'

Delete an event

bridge google --skill calendar-sync calendar events delete --params '{"calendarId":"primary","eventId":"EVENT_ID"}'

Calendar Sharing (ACLs)

Calendars have an Access Control List (ACL) that controls who can see or edit them. Use these commands when the user asks to share, restrict, or audit calendar access.

Who has access to a calendar?

bridge google --skill calendar-sync calendar acl list --params '{"calendarId":"primary"}'

Returns each rule with a scope (user/group/domain/default) and a role (reader, writer, owner, freeBusyReader).

Share a calendar with someone

bridge google --skill calendar-sync calendar acl insert --params '{"calendarId":"primary"}' --json '{
  "scope": {"type": "user", "value": "alex@example.com"},
  "role": "reader"
}'

Roles:

  • freeBusyReader — only sees busy/free, no event details
  • reader — sees event details (default for sharing)
  • writer — can create and edit events
  • owner — full control including ACL management

Update someone's role

bridge google --skill calendar-sync calendar acl patch --params '{"calendarId":"primary","ruleId":"user:alex@example.com"}' --json '{
  "role": "writer"
}'

Revoke access

bridge google --skill calendar-sync calendar acl delete --params '{"calendarId":"primary","ruleId":"user:alex@example.com"}'

Safety

  • Confirm before creating, updating, or deleting events
  • Always show event details before modifications
  • Include timezone in all date/time values
  • For Meet spaces, default to TRUSTED access unless the user explicitly wants an open or restricted link
  • For ACL changes, always confirm the email and role before granting/revoking access
  • When granting writer or owner roles, surface the full implication (can edit/delete events, can re-share)
  • Default to reader role unless the user explicitly asks for write or free/busy-only

Related documentation