gw-calendar
Create, update, and list Google Calendar events via CLI.
Skill by Elnora-AI
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/elnora-ai-gw-calendar
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: backend, productivity
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/gw-calendar
What's inside
- Skill name
gw-calendar- Description
- Create, update, and list Google Calendar events via CLI. Handles Google Meet links, attendees, timezones, reminders, and locations. Also reads and edits booking pages (appointment schedules) by driving Chrome, since Google ships no API for them. TRIGGERS: "calendar", "meeting", "schedule", "event", "google meet", "book a call", "availability", "schedule meeting", "create event", "update event", "reschedule", "change event", "modify event", "reminder", "booking page", "booking pages", "appointment schedule", "bookable hours", "booking link"
- License
- Apache-2.0
- Instructions
- 180 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Calendar
## Account
Events are created on the default account unless you pass `--account <name>`. The default account is configurable — run `gw auth list` to see the accounts you have set up, and pass `--account <name>` to target a specific one.
## Required Fields — always populate
Every `create` and `update` MUST include ALL of these fields. Never create a partial event.
| Field | Flag | Default |
|-------|------|---------|
| Title | `--title` | — (required) |
| Start time | `--start` | — (required) |
| Duration | `--duration` | 30 min |
| Description | `--description` | — |
| Location | `--location` | — |
| Attendees | `--attendees` | — |
| Reminders | `--reminders` | 60,30,10 (auto) |
| Meet link | `--meet` | only when virtual |
**If the request is missing any of these details:**
1. **Search email first.** Use the gmail skill to find the relevant thread:
```bash
$CLI gmail list --query "subject:KEYWORD" --limit 5 --compact
$CLI gmail get MESSAGE_ID --compact
```
Extract: location/address, attendees, agenda/description, time details.
2. **If email doesn't have it, ask the user.** Do not guess or leave fields blank.
Examples of what to look for:
- "Let's meet at the office" → search email for the address, use as `--location`.
- "Call with Alex" → search email for Alex's email, full name for title, any agenda for description.
- "Coffee with investor" → search email for venue name + address, attendee email.
- In-person → `--location` with full address. Virtual → `--meet` flag. Hybrid → both.
- Workspace may auto-attach a Meet link on any event write (account "Automatically add Google Meet" setting), so an in-person event can sprout one after an unrelated `update`. That's not a bug. Pass `--meet false` to strip it (the CLI sends `conferenceDataVersion=1`, required for removal to take effect).
## Defaults (auto-applied)
- **Reminders**: 60, 30, 10 min popup — set automatically on `create`. Do NOT change unless the user explicitly requests different reminders. Override: `--reminders "120,15"`.
- **Duration**: 30 minutes.
## Invocation
```bash
CLI="python3 ${CLAUDE_PLUGIN_ROOT}/cli/gw.py"
```
## Commands
```bash
$CLI calendar create --title "Demo call" --start "2026-03-01T14:00" [--duration 30] [--meet] [--attendees "a@co.com,b@co.com"] [--description "..."] [--location "123 Main St, City"] [--timezone "America/Denver"] [--reminders "60,30,10"] [--all-day --end "2026-03-03"] [--busy|--free]
$CLI calendar update --event-id "EVENT_ID" [--title "New title"] [--start "2026-03-01T15:00"] [--duration 60] [--meet true|false] [--attendees "a@co.com"] [--description "..."] [--location "..."] [--timezone "America/Denver"] [--reminders "60,30,10"] [--busy|--free]
$CLI calendar list [--days 7] [--calendar all|CAL_ID] --compact
$CLI calendar calendars --compact
$CLI calendar get --event-id "EVENT_ID" [--calendar CAL_ID] --compact
```
`list`/`get` default to the `primary` calendar. Pass `--calendar all` to `list` to merge every accessible calendar (sorted by start), or `--calendar CAL_ID` to target a secondary calendar. Get a calendar's ID from `calendar calendars`. An event from a secondary calendar must be read with the same `--calendar CAL_ID` it was listed under.
## Response Shapes (validated)
`list`: `{"events":[{"id","calendar","title","start","end","location","attendees","meetLink","link"}],"count":7,"days":3,"calendars":["primary"]}`
`calendars`: `{"calendars":[{"id","summary","description","primary","accessRole","selected","timeZone"}],"count":3}` — primary sorts first.
`get`: `{"id","calendar","title","description","start","end","location","busy","status","organizer","attendees":[{"email","displayName","responseStatus","optional","organizer","self"}],"attendeeCount","meetLink","link"}` — use this to read attendee RSVP status (`accepted`/`declined`/`tentative`/`needsAction`), which `list` flattens to bare emails. `busy` is `true` when the event blocks your free/busy time (opaque), `false` when it shows as free (transparent).
`create`: `{"created":true,"id","title","start","end","location","busy","meetLink","link"}`
`update`: `{"updated":true,"id","title","start","end","location","busy","meetLink","link"}`
## Examples
```bash
# 30-min meeting with Meet link
$CLI calendar create --title "Intro call with Acme" --start "2026-04-07T10:00" --duration 30 --meet --attendees "alex@acme.com"
# Change duration to 60 minutes
$CLI calendar update --event-id "abc123" --duration 60
# Reschedule and rename
$CLI calendar update --event-id "abc123" --title "Extended demo" --start "2026-04-07T11:00" --duration 60
# Multi-day all-day trip that blocks you as busy (--end is the last full day, inclusive)
$CLI calendar create --title "Tentative: offsite" --start "2026-07-02" --end "2026-07-03" --all-day --busy --location "Berlin, Germany"
# Flip an existing event to show as free (does not block free/busy)
$CLI calendar update --event-id "abc123" --free
# List next 3 days
$CLI calendar list --days 3 --compact
```
## Booking Pages (Appointment Schedules)
Google exposes no API for these — Calendar API v3 has no appointment-schedule
resource, and booking pages are neither events nor calendars, so OAuth cannot
see them at all. These commands drive the Calendar UI in the user's own running
Chrome instead, so no Google session credentials are ever stored.
**Requires** Chrome running with the `chrome://inspect/#remote-debugging` toggle
enabled (a one-time setting, the same connection the chrome-devtools MCP uses).
The commands reuse an open Calendar tab, navigating it as they work.
```bash
$CLI calendar booking list [--user-index 0]
$CLI calendar booking get --name "Intro call"
$CLI calendar booking update --name "Intro call" [--duration 30] [--hours "mon=9:00am-5:00pm,fri=unavailable"] [--timezone "Salt Lake City"] [--rename "New name"] [--dry-run]
$CLI calendar booking delete --name "Old page" --confirm
```
Only one client may hold Chrome's browser endpoint, so these commands cannot run
while another tool (the chrome-devtools MCP, say) is driving the same browser.
Connections are retried with backoff, which also covers Chrome briefly refusing
a reconnect right after a previous command finished.
`--name` must match the sidebar entry exactly; run `booking list` to get it.From Elnora-AI/elnora-google-workspace, Apache-2.0.
More from Elnora-AI/elnora-google-workspace
- 0.598score
gw-forms
Elnora-AI
Read and write Google Forms via CLI.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-setup
Elnora-AI
First-run setup for the Google Workspace (gw) plugin.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-analytics
Elnora-AI
Read Google Analytics 4 via CLI — traffic, acquisition, pages, conversions, realtime.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-api
Elnora-AI
Call ANY Google API method via the generic Discovery invoker — services with no curated command group (Drive, Slides, People, Chat, Keep, Meet, Classroom…
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-docs
Elnora-AI
Get, create, import, append, and replace text in Google Docs via CLI.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
google-workspace
Elnora-AI
Google Workspace CLI — routes to service-specific skills for Gmail, Sheets, Calendar, Tasks, Docs, Forms, Drive, Analytics and Search Console.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-postmaster
Elnora-AI
Read Gmail Postmaster Tools via CLI — the domains you registered, and per day the spam rate, DKIM / SPF / DMARC pass rates, delivery errors and Google's…
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-searchconsole
Elnora-AI
Read Google Search Console via CLI — search queries, pages, CTR, position, indexing, sitemaps.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
gw-drive
Elnora-AI
List, get, upload, download, export, organize, and share Google Drive files via CLI.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
gw-gmail
Elnora-AI
Send, draft, list, read, reply, scan, and manage Gmail via CLI.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
gw-inbox
Elnora-AI
Quick inbox scan — recent emails with sender, subject, snippet.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
gw-tasks
Elnora-AI
Create, list, and complete Google Tasks via CLI.
SkillAFreshness: A★ 2Claude Code +9
Signals
- Stars
- 2
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Aug 10, 2026 (2 months ago)
- Last release
- Oct 23, 2026 (6 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- Apache-2.0
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from Elnora-AI
- 0.638score
Elnora MCP Server
Elnora-AI
AI-powered bioprotocol optimization — generate, search, and manage lab protocols.
ConnectorAFreshness: ARemoteLocal★ 3↓ 210/wkClaude Code +5 - 0.598score
gw-analytics
Elnora-AI
Read Google Analytics 4 via CLI — traffic, acquisition, pages, conversions, realtime.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
google-workspace
Elnora-AI
Google Workspace CLI — routes to service-specific skills for Gmail, Sheets, Calendar, Tasks, Docs, Forms, Drive, Analytics and Search Console.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-postmaster
Elnora-AI
Read Gmail Postmaster Tools via CLI — the domains you registered, and per day the spam rate, DKIM / SPF / DMARC pass rates, delivery errors and Google's…
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-searchconsole
Elnora-AI
Read Google Search Console via CLI — search queries, pages, CTR, position, indexing, sitemaps.
SkillAFreshness: A★ 2Claude Code +9 - 0.598score
gw-setup
Elnora-AI
First-run setup for the Google Workspace (gw) plugin.
SkillAFreshness: A★ 2Claude Code +9
Cite this page
gw-calendar skill. Agent Mart. https://agentmart.dev/skills/elnora-ai-gw-calendar (last updated 2026-10-24)