Secure Calendar (Google + Outlook) Skill
OpenClaw agents schedule, reschedule, and triage attendee responses on Google Calendar and Outlook through a single normalized command surface.
google-calendar · outlook-calendar · calendar · events · scheduling
Example
What's on my calendar today, and move my 3pm with Dana to tomorrow at the same time.
Today: 4 events (attendee names + locations redacted) - 09:30 Standup - 11:00 [redacted] review - 15:00 Sync w/ Dana -> proposed Wed 15:00, invite updated - 16:30 1:1 sendUpdates: attendees notified of the move.
Add to your agent
Steps 1–2 are identical for every agent — install the porteden binary and authenticate once. Step 3 registers the skill with your runtime.
Install the PortEden CLI
OpenClaw skills delegate every API call to the porteden binary. Install once with Homebrew or Go.
brew install porteden/tap/porteden # orgo install github.com/porteden/cli/cmd/porteden@latest Authenticate
Browser-based login is recommended — credentials are written to your OS keyring. Token-based login is available for headless environments.
porteden auth login # headless / CIporteden auth login --token <PE_API_KEY> porteden auth status Install the porteden-calendar skill
OpenClaw fetches the signed skill bundle and registers its commands with the agent.
openclaw skills install porteden-calendar The SKILL.md
The canonical, copy-paste-able skill definition your agent loads.
porteden
Use porteden for calendar management across multiple accounts. Use -jc flags for AI-optimized output.
If porteden is not installed: brew install porteden/tap/porteden (or go install github.com/porteden/cli/cmd/porteden@latest).
Setup (once)
- Browser login (recommended):
porteden auth login— opens browser, credentials stored in system keyring - Direct token:
porteden auth login --token <key>— stored in system keyring - Verify:
porteden auth status - If
PE_API_KEYis set in the environment, the CLI uses it automatically (no login needed).
Common commands
- List calendars:
porteden calendar calendars -jc - Events today (or --tomorrow, --week):
porteden calendar events --today -jc - Events custom range:
porteden calendar events --from 2026-02-01 --to 2026-02-07 -jc - All events (auto-pagination):
porteden calendar events --week --all -jc - Search events:
porteden calendar events -q "meeting" --today -jc - Events by contact:
porteden calendar by-contact "user@example.com" -jc(or --name "John Smith") - Get single event:
porteden calendar event <eventId> -jc - Create event:
porteden calendar create --calendar <id> --summary "Meeting" --from "..." --to "..." --location "Room A" --attendees "a@b.com,c@d.com" - Update event:
porteden calendar update <eventId> --summary "New Title"(also: --from, --to, --location) - Update attendees:
porteden calendar update <eventId> --add-attendees "new@example.com"(or --remove-attendees; add --notify to send notifications) - Delete event:
porteden calendar delete <eventId>(add --no-notify to skip attendee notifications) - Respond to invite:
porteden calendar respond <eventId> accepted(or: declined, tentative)
Event Status Values
confirmed- Accepted/scheduledtentative- Maybe attendingneedsAction- Requires response from usercancelled- Event was cancelled
Time Formats
- All times use RFC3339 UTC format:
2026-02-01T10:00:00Z - For all-day events, use midnight-to-midnight with
--all-dayflag - JSON output includes
startUtc,endUtc,durationMinutesfields
Notes
- Credentials persist in the system keyring after login. No repeated auth needed.
- Set
PE_PROFILE=workto avoid repeating--profile. -jcis shorthand for--json --compact: filters noise, truncates descriptions, limits attendees, reduces tokens.- Use
--allto auto-fetch all pages; checkmeta.hasMoreandmeta.totalCountin JSON output. - Manual pagination:
--limit 100 --offset 0, then--offset 100, etc. by-contactsupports partial matching:"@acme.com"for email domain,--name "Smith"for name.- Confirm before creating, updating, or deleting events.
- "invalid calendar ID": Get IDs with
porteden calendar calendars -jc. - Environment variables:
PE_API_KEY,PE_PROFILE,PE_TIMEZONE,PE_FORMAT,PE_COLOR,PE_VERBOSE.
How it works
Cross-backend normalization
Google Calendar resourceIds and Microsoft Graph eventIds are wrapped in PortEden's google: / microsoft: prefix scheme. Commands work on either with no agent-side branching.
Date-aware filters
--today, --this-week, --next-week, --since, and --until are time-zone aware (PE_TIMEZONE). RFC3339 UTC strings always work as the explicit fallback.
porteden calendar events --today -jc porteden calendar events --since 2025-12-01T00:00:00Z --until 2025-12-31T23:59:59Z -jc Attendee-based search
events search --contact <email> returns every event involving that attendee across all calendars in the profile — useful for triaging recurring meetings or rescheduling around a vacation.
The same firewall behind every PortEden skill
- Provision to teams with role-based access policies
- Identity-aware execution — every call ties back to a user
- Signed, version-pinned skills
- Full audit trail on every tool call
- Field-level redaction at egress
Frequently asked questions
Which calendars does it support?
What gets redacted on a calendar event?
Can it RSVP and propose new times?
Which agents can install it?
Related Skills
Install Secure OpenClaw Calendar (Google + Outlook) Skill Without Inheriting the Audit Tail
Browser auth, keyring-bound credentials, server-side audit log. The same data firewall behind every PortEden integration.
Regulated org or 200+ seats? Talk to sales →