Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Lightweight Google Calendar integration with standalone OAuth authentication. No MCP server required.
.claude/skills/sickn33-google-calendar-automation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 43% | 0% |
Lightweight Google Calendar integration with standalone OAuth authentication. No MCP server required.
> ⚠️ Requires Google Workspace account. Personal Gmail accounts are not supported.
Authenticate with Google (opens browser):
bashpython scripts/auth.py login
Check authentication status:
bashpython scripts/auth.py status
Logout when needed:
bashpython scripts/auth.py logout
All operations via scripts/gcal.py. Auto-authenticates on first use if not logged in.
bashpython scripts/gcal.py list-calendars
bash# List events from primary calendar (default: next 30 days) python scripts/gcal.py list-events # List events with specific time range python scripts/gcal.py list-events --time-min 2024-01-15T00:00:00Z --time-max 2024-01-31T23:59:59Z # List events from a specific calendar python scripts/gcal.py list-events --calendar "work@example.com" # Limit results python scripts/gcal.py list-events --max-results 10
bashpython scripts/gcal.py get-event EVENT_ID python scripts/gcal.py get-event EVENT_ID --calendar "work@example.com"
bash# Basic event python scripts/gcal.py create-event "Team Meeting" "2024-01-15T10:00:00Z" "2024-01-15T11:00:00Z" # Event with description and location python scripts/gcal.py create-event "Team Meeting" "2024-01-15T10:00:00Z" "2024-01-15T11:00:00Z" \ --description "Weekly sync" --location "Conference Room A" # Event with attendees python scripts/gcal.py create-event "Team Meeting" "2024-01-15T10:00:00Z" "2024-01-15T11:00:00Z" \ --attendees user1@example.com user2@example.com # Event on specific calendar python scripts/gcal.py create-event "Meeting" "2024-01-15T10:00:00Z" "2024-01-15T11:00:00Z" \ --calendar "work@example.com"
bash# Update event title python scripts/gcal.py update-event EVENT_ID --summary "New Title" # Update event time python scripts/gcal.py update-event EVENT_ID --start "2024-01-15T14:00:00Z" --end "2024-01-15T15:00:00Z" # Update multiple fields python scripts/gcal.py update-event EVENT_ID \ --summary "Updated Meeting" --description "New agenda" --location "Room B" # Update attendees python scripts/gcal.py update-event EVENT_ID --attendees user1@example.com user3@example.com
bashpython scripts/gcal.py delete-event EVENT_ID python scripts/gcal.py delete-event EVENT_ID --calendar "work@example.com"
Find the first available slot for a meeting with specified attendees:
bash# Find 30-minute slot for yourself python scripts/gcal.py find-free-time \ --attendees me \ --time-min "2024-01-15T09:00:00Z" \ --time-max "2024-01-15T17:00:00Z" \ --duration 30 # Find 60-minute slot with multiple attendees python scripts/gcal.py find-free-time \ --attendees me user1@example.com user2@example.com \ --time-min "2024-01-15T09:00:00Z" \ --time-max "2024-01-19T17:00:00Z" \ --duration 60
bash# Accept an invitation python scripts/gcal.py respond-to-event EVENT_ID accepted # Decline an invitation python scripts/gcal.py respond-to-event EVENT_ID declined # Mark as tentative python scripts/gcal.py respond-to-event EVENT_ID tentative # Respond without notifying organizer python scripts/gcal.py respond-to-event EVENT_ID accepted --no-notify
All times use ISO 8601 format with timezone:
2024-01-15T10:30:00Z2024-01-15T10:30:00-05:00 (EST)primary or omit the --calendar flaglist-calendars (usually an email address)Tokens stored securely using the system keyring:
Service name: google-calendar-skill-oauth
Tokens are automatically refreshed when expired using Google's cloud function.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 3,281 | 65,992 | +1911% | 1 | 1 | 0% | 518 | 2,014 | +289% | 0 | 0 | — |
case-02 | fail→fail | 18,797 | 38,705 | +106% | 1 | 1 | 0% | 3,707 | 2,132 | -42% | 0 | 0 | — |
case-03 | fail→fail | 10,973 | 5,558 | -49% | 1 | 1 | 0% | 763 | 1,787 | +134% | 0 | 0 | — |
case-04 | fail→pass | 8,947 | 2,628 | -71% | 1 | 1 | 0% | 1,508 | 1,916 | +27% | 0 | 0 | — |
case-05 | fail→pass | 9,146 | 1,432 | -84% | 1 | 1 | 0% | 1,583 | 1,709 | +8% | 0 | 0 | — |
case-06 | fail→pass | 10,033 | 2,060 | -79% | 1 | 1 | 0% | 1,675 | 1,823 | +9% | 0 | 0 | — |
case-07 | fail→pass | 10,627 | 1,470 | -86% | 1 | 1 | 0% | 1,716 | 1,718 | +0% | 0 | 0 | — |
case-08 | fail→pass | 8,919 | 2,292 | -74% | 1 | 1 | 0% | 1,303 | 1,868 | +43% | 0 | 0 | — |
case-09 | fail→pass | 3,238 | 2,219 | -31% | 1 | 1 | 0% | 508 | 2,020 | +298% | 0 | 0 | — |
case-10 | pass→pass | 38,639 | 32,176 | -17% | 1 | 1 | 0% | 1,727 | 1,942 | +12% | 0 | 0 | — |
case-11 | fail→pass | 8,535 | 31,595 | +270% | 1 | 1 | 0% | 1,708 | 1,830 | +7% | 0 | 0 | — |
case-12 | fail→pass | 7,960 | 4,915 | -38% | 1 | 1 | 0% | 1,788 | 2,438 | +36% | 0 | 0 | — |
case-13 | fail→pass | 7,980 | 3,136 | -61% | 1 | 1 | 0% | 1,416 | 2,202 | +56% | 0 | 0 | — |
case-14 | fail→pass | 9,283 | 3,565 | -62% | 1 | 1 | 0% | 1,751 | 1,867 | +7% | 0 | 0 | — |
case-15 | fail→pass | 7,506 | 1,960 | -74% | 1 | 1 | 0% | 1,307 | 1,865 | +43% | 0 | 0 | — |
case-16 | fail→pass | 9,189 | 2,268 | -75% | 1 | 1 | 0% | 1,711 | 1,932 | +13% | 0 | 0 | — |
case-17 | fail→pass | 12,026 | 1,546 | -87% | 1 | 1 | 0% | 1,873 | 1,799 | -4% | 0 | 0 | — |
case-18 | pass→pass | 6,208 | 1,670 | -73% | 1 | 1 | 0% | 1,058 | 1,838 | +74% | 0 | 0 | — |
case-19 | pass→pass | 9,072 | 3,422 | -62% | 1 | 1 | 0% | 1,723 | 2,011 | +17% | 0 | 0 | — |
case-20 | fail→pass | 11,726 | 2,452 | -79% | 1 | 1 | 0% | 2,483 | 2,126 | -14% | 0 | 0 | — |
case-21 | fail→fail | 7,037 | 2,071 | -71% | 1 | 1 | 0% | 1,297 | 1,911 | +47% | 0 | 0 | — |
case-22 | fail→pass | 8,169 | 2,140 | -74% | 1 | 1 | 0% | 1,189 | 1,911 | +61% | 0 | 0 | — |
case-23 | fail→pass | 11,802 | 3,951 | -67% | 1 | 1 | 0% | 1,829 | 2,062 | +13% | 0 | 0 | — |
case-24 | fail→pass | 10,965 | 3,624 | -67% | 1 | 1 | 0% | 1,548 | 2,052 | +33% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 21 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +71 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.