OpenClaw Google Calendar Integration
Connect OpenClaw to Google Calendar using Expanso pipelines. Check your schedule, create events, set reminders, and build daily briefings - all while keeping your Google credentials on your own machine.
Prerequisites
You need OpenClaw installed (install guide), a free Expanso Cloud account (sign up), and a Google account with Calendar access.
Two ways to connect Google Calendar
Choose the method that fits your needs:
OAuth Integration
Full read/write access to calendars and events. Create, modify, and delete events. Uses Google's official OAuth 2.0 flow. Best for production use.
ICS Feed (read-only)
Subscribe to a calendar's ICS URL. Read-only access, no event creation. Simplest setup with no OAuth required. Good for schedule queries only.
Set Up Google Cloud OAuth Credentials
Create OAuth credentials in Google Cloud Console so Expanso can access Calendar on your behalf.
1.1 Create a Google Cloud project
Go to Google Cloud Console. Create a new project (or use an existing one). Enable the Google Calendar API under APIs & Services.
1.2 Create OAuth credentials
Under APIs & Services > Credentials, click Create Credentials > OAuth client ID. Choose "Desktop app" as the application type. Download the credentials.json file.
1.3 Authenticate with gog CLI
The gog CLI handles Google OAuth token management locally:
# Install gog (Google OAuth Gateway)
npm install -g gog-cli
# Authenticate - opens browser for Google OAuth consent
gog auth
# Test - list upcoming events
gog calendar listTokens are stored locally on your machine. You can revoke them at any time from Google Account Permissions.
1.4 Store the token path
# The gog CLI stores tokens locally. Set the path for Expanso:
export GOOGLE_CREDENTIALS_PATH="$HOME/.config/gog/credentials.json"
export GOOGLE_TOKEN_PATH="$HOME/.config/gog/token.json"Deploy the Calendar Pipeline
Create Expanso pipelines for reading and creating calendar events.
2.1 Set up Expanso (if you haven't already)
Follow the Expanso setup guide to create your account and install the CLI.
2.2 Create the calendar reader pipeline
Open cloud.expanso.io, click New Pipeline, and paste:
# calendar-read.yaml
# Reads upcoming calendar events
input:
http_server:
path: /calendar-read
allowed_verbs: [ "POST" ]
pipeline:
processors:
- http:
url: "https://www.googleapis.com/calendar/v3/calendars/primary/events"
verb: GET
headers:
Authorization: "Bearer ${GOOGLE_ACCESS_TOKEN}"
rate_limit: ""
- mapping: |
root.events = this.items.map_each(event -> {
"title": event.summary,
"start": event.start.dateTime.or(event.start.date),
"end": event.end.dateTime.or(event.end.date),
"location": event.location.or(""),
"attendees": event.attendees.or([]).map_each(a -> a.email),
"status": event.status
})
root.count = this.items.length()
output:
sync_response: {}2.3 Create the event creator pipeline
For scheduling new events:
# calendar-create.yaml
# Creates new calendar events
input:
http_server:
path: /calendar-create
allowed_verbs: [ "POST" ]
pipeline:
processors:
- mapping: |
root.summary = this.title
root.description = this.description.or("")
root.start.dateTime = this.start_time
root.start.timeZone = this.timezone.or("America/Los_Angeles")
root.end.dateTime = this.end_time
root.end.timeZone = this.timezone.or("America/Los_Angeles")
root.attendees = this.attendees.or([]).map_each(email -> {
"email": email
})
root.reminders.useDefault = false
root.reminders.overrides = [
{"method": "popup", "minutes": 10}
]
- http:
url: "https://www.googleapis.com/calendar/v3/calendars/primary/events"
verb: POST
headers:
Authorization: "Bearer ${GOOGLE_ACCESS_TOKEN}"
Content-Type: "application/json"
output:
sync_response: {}2.4 Deploy both pipelines
Click Deploy for each pipeline. They run on your edge node with OAuth tokens resolved locally.
Simple read-only access via ICS
If you only need to query your schedule (no event creation), an ICS subscription is the simplest option.
1 Get your ICS URL
In Google Calendar, go to Settings > [Your Calendar] > Integrate calendar and copy the "Secret address in iCal format" URL.
2 Store it securely
export GOOGLE_CALENDAR_ICS_URL="https://calendar.google.com/calendar/ical/your-id/private-key/basic.ics"3 Create an ICS reader pipeline
# calendar-ics.yaml
# Reads events from ICS feed
input:
http_server:
path: /calendar-ics
allowed_verbs: [ "POST" ]
pipeline:
processors:
- http:
url: "${GOOGLE_CALENDAR_ICS_URL}"
verb: GET
- mapping: |
# Parse ICS format and extract events
root.events = this.split("BEGIN:VEVENT").slice(1).map_each(block -> {
"title": block.re_find("SUMMARY:(.+)").index(1).or(""),
"start": block.re_find("DTSTART[^:]*:(.+)").index(1).or(""),
"end": block.re_find("DTEND[^:]*:(.+)").index(1).or("")
})
output:
sync_response: {}Limitations: ICS feeds are read-only and update periodically (not real-time). For creating events or instant access, use the OAuth method above.
Connect to OpenClaw
Register the Expanso MCP server so OpenClaw can invoke your Calendar pipelines.
3.1 Register the MCP server
# Register Expanso pipelines with OpenClaw
expanso-cli mcp add npx @expanso/mcp-pipelines3.2 Test the integration
Open OpenClaw and try these commands:
# Check your schedule
"What do I have on my calendar today?"
# Find free time
"Am I free Thursday afternoon between 2-5pm?"
# Create an event
"Schedule a 30-minute call with Sarah tomorrow at 3pm"
# Morning briefing
"Give me my schedule for this week with travel time estimates"
# Cross-platform
"Check my calendar for today and post my schedule to #daily on Slack"Common calendar workflows
☀️ Daily schedule briefing
Every morning, OpenClaw reads your calendar through Expanso and sends a formatted schedule summary to Slack or your preferred chat channel. Includes meeting details, gaps between meetings, and preparation notes.
📅 Smart scheduling
Ask "Schedule a call with Sarah sometime this week" and OpenClaw checks your availability, finds open slots, and creates the event with the right duration, timezone, and attendees.
🔔 Meeting reminders
Configure OpenClaw to send you meeting reminders via WhatsApp, Telegram, or Slack at custom intervals. "Remind me 15 minutes before every meeting today" works with natural language.
📊 Time analysis
Ask "How much time did I spend in meetings this week?" and OpenClaw analyzes your calendar events, categorizes them (1:1s, standups, external calls), and gives you a breakdown.
🔗 Calendar + email + Jira
Morning briefing that combines your calendar, unread emails, and Jira sprint status into a single digest. All three data sources flow through separate Expanso pipelines with separate credentials.
🌐 Multi-calendar support
Connect both work and personal calendars with selective access. Check "Am I free?" across all calendars, but only show work event details to team members.
Frequently asked questions
Are my Google OAuth tokens safe?
Can OpenClaw see all my calendar events?
Can OpenClaw create events without my approval?
Does this work with Google Workspace calendars?
What about other calendar providers (Outlook, Apple)?
Can I combine calendar with other integrations?
Start connecting Google Calendar
Get your OpenClaw wired up to Google Calendar in under 10 minutes.
