gws-meeting-scheduler

Schedule meetings between people using the `gws` CLI (Google Calendar). Use when the user wants to find a meeting time, schedule a meeting, check availability, or book time with someone. Triggers on requests like "schedule a meeting with X", "find time with Y", "book a 1:1", "when can I meet with Z", "set up a sync".

12 stars

Best use case

gws-meeting-scheduler is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Schedule meetings between people using the `gws` CLI (Google Calendar). Use when the user wants to find a meeting time, schedule a meeting, check availability, or book time with someone. Triggers on requests like "schedule a meeting with X", "find time with Y", "book a 1:1", "when can I meet with Z", "set up a sync".

Teams using gws-meeting-scheduler should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/gws-meeting-scheduler/SKILL.md --create-dirs "https://raw.githubusercontent.com/jackchuka/skills/main/gws-meeting-scheduler/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/gws-meeting-scheduler/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How gws-meeting-scheduler Compares

Feature / Agentgws-meeting-schedulerStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Schedule meetings between people using the `gws` CLI (Google Calendar). Use when the user wants to find a meeting time, schedule a meeting, check availability, or book time with someone. Triggers on requests like "schedule a meeting with X", "find time with Y", "book a 1:1", "when can I meet with Z", "set up a sync".

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Meeting Scheduler

Find mutual availability and create Google Calendar events using the `gws` CLI.

## Prerequisites

- `gws` CLI installed and authenticated

## Workflow

### 1. Resolve attendee email

If the user provides a name but no email, search past calendar events:

```bash
gws calendar events list --params '{"calendarId":"primary","q":"<name>","maxResults":10}'
```

Look at the `attendees` array in results to find the matching email. If multiple matches, ask the user to confirm.

### 2. Detect timezones

Detect each person's timezone by querying **their own calendar** directly. When you query a person's calendar via their email as `calendarId`, the API returns `start.dateTime` with that person's local UTC offset — this is the most reliable signal.

```bash
gws calendar events list --params '{"calendarId":"<user-email>","maxResults":10}'
gws calendar events list --params '{"calendarId":"<attendee-email>","maxResults":10}'
```

For each person:
- Look at `start.dateTime` on non-all-day events (skip events with only `start.date`)
- Extract the UTC offset (e.g., `-08:00`, `+09:00`) — this reflects their calendar's timezone
- Tally the most frequent offset to determine their timezone
- Cross-reference with the `start.timeZone` field on events matching that offset to get the IANA name (e.g., `-08:00` → `America/Los_Angeles`)

**Important:** Do NOT rely on `start.timeZone` alone — it often reflects the *organizer's* or *attendee's* timezone rather than the calendar owner's. The `dateTime` offset from the person's own calendar is the source of truth.

If no timezone can be determined for either person, ask the user.

### 3. Determine date range

Ask the user for a preferred date range, or default to the next 5 business days.

### 4. Check free/busy

Query both calendars together. The query range must cover work hours in **both** timezones:

```bash
gws calendar freebusy query --json '{
  "timeMin": "<start-RFC3339>",
  "timeMax": "<end-RFC3339>",
  "items": [{"id": "<user-email>"}, {"id": "<attendee-email>"}]
}'
```


### 5. Compute overlapping free slots

- Convert all busy times from UTC to **each person's timezone**
- Define work hours per person: 9:00-18:00 in their respective timezone
- Find the **overlap** of both people's work-hour windows, then subtract combined busy blocks
- Filter to slots >= requested meeting duration
- **Double-check every slot against BOTH calendars before presenting** — do not skip the user's own busy times
- Present slots as a table showing times in **both** timezones:

```
Day       | User (JST)    | Attendee (PST) | Duration
Thu Feb 26 | 15:00 - 16:00 | 22:00 - 23:00  | 1h
```

If work-hour overlap is very limited (e.g., < 1 hour), note this and suggest the user consider extending hours.

### 6. Confirm and create the event

Once the user picks a slot, duration, and title:

```bash
gws calendar +insert \
  --summary "<title>" \
  --start "<start-RFC3339>" --end "<end-RFC3339>" \
  --attendee "<user-email>" --attendee "<attendee-email>"
```

For Google Meet links or other advanced options, use the raw API instead:

```bash
gws calendar events insert --params '{"calendarId":"primary","conferenceDataVersion":1,"sendUpdates":"all"}' \
  --json '{
    "summary": "<title>",
    "start": {"dateTime": "<start-RFC3339>"},
    "end": {"dateTime": "<end-RFC3339>"},
    "attendees": [{"email": "<user-email>"}, {"email": "<attendee-email>"}],
    "conferenceData": {"createRequest": {"requestId": "<unique-id>", "conferenceSolutionKey": {"type": "hangoutsMeet"}}}
  }'
```

Key notes:

- `--attendee` — repeat for each attendee, **always include the user themselves**
- `conferenceDataVersion=1` param required when adding Meet links
- `sendUpdates=all` — notify attendees via email

### 7. Confirm to user

Show: title, date/time (in both timezones if cross-timezone), attendees, and Meet link.

## Important Notes

- Always include the user as an attendee, not just as the calendar owner
- `gws` uses `--params` for query/path parameters and `--json` for request bodies
- Use `--format json` (or omit, as JSON is default) for reliable parsing
- RFC3339 times must include timezone offset (e.g., `+09:00` for JST)
- The freebusy API returns busy times in UTC — convert carefully
- When computing free slots, verify against **both** calendars before presenting
- Use `gws calendar +insert` helper for simple events; use `gws calendar events insert` raw API for advanced features (Meet links, recurrence, etc.)

Related Skills

restaurant-search

12
from jackchuka/skills

Search for Japanese restaurants using the `hpp` CLI (HotPepper Gourmet API). Use when the user wants to find a restaurant, plan a dinner, search for izakayas, or book a group meal in Japan. Triggers on requests like "find a restaurant near Shibuya", "search for izakayas in 新宿", "restaurant for 10 people in 浜松町", "dinner spot near Tokyo station".

project-namer

12
from jackchuka/skills

Use when naming a project, repository, tool, or product and wanting a memorable, unique name

p-slack-triage

12
from jackchuka/skills

Scan Slack for messages needing your attention, walk through them one-by-one, and draft/send replies. Covers DMs, mentions, threads, and channel activity. Use when the user wants to triage Slack, check what needs attention, or draft replies. Triggers on "triage slack", "check slack", "what needs my attention on slack", "slack replies", "review slack messages", "/slack-triage".

p-news-briefing

12
from jackchuka/skills

Use when the user asks for news, wants a briefing, says "/news-briefing", or asks to aggregate recent information on any topic. Triggers on requests like "what's happening with AI", "get me news on crypto", "news briefing on climate".

p-md-to-slides

12
from jackchuka/skills

Convert a structured Markdown deck source into a styled Google Slides presentation. Use this skill when the user has a slide.md file (or wants to write one) and wants Google Slides output — talks, LT decks, lecture slides, conference presentations, internal explainers. Trigger phrases include "md からスライド作って", "slide.md を Google Slides にして", "発表資料を Google Slides で", "convert this markdown to slides", "build a Google Slides deck from this markdown", "make slides from md", "/md-to-slides", and similar. Also use when the user references a presentation/<date>/slide.md file structure with `## Slide N — title`, `**話すこと:**`, and `**スライド要素:**` sections.

p-ego-search

12
from jackchuka/skills

Search for mentions of you across Slack, Fireflies, and GitHub. Triggers on "egosearch", "/egosearch", "search for mentions of me", "who's talking about me".

p-daily-standup

12
from jackchuka/skills

Aggregate previous business day activity and post standup update to Slack. Use when the user says "standup", "daily standup", "post status", "status update", or "/daily-standup".

p-daily-report

12
from jackchuka/skills

Use when reviewing what you worked on, creating standups, writing status updates, tracking daily/weekly progress, or asking "what did I do today"

p-daily-reflection

12
from jackchuka/skills

Reflect on past work and iterate to improve. Analyzes Claude sessions, GitHub, Slack, and Fireflies to generate a journal entry with actionable improvements. Updates persistent memory with confirmed learnings. Use when the user says "reflect", "reflection", "what can I improve", "retrospective", "review my work", or "/daily-reflection".

p-blog-writer

12
from jackchuka/skills

Write blog posts in {user_name}'s voice with theoretical depth and persuasive arguments. Iterative workflow: intake → outline → section-by-section expansion → polish. Adapts to tool announcements, opinion pieces, deep-dives, and tutorials. Use when the user says "/blog-writer", "write a blog post", "draft an article about", "help me write about", or wants to create blog content.

p-blog-post-mining

12
from jackchuka/skills

Mine development activities for blog-worthy topics and create outlines. Analyzes Claude session history, GitHub commits/PRs, Slack discussions, and Fireflies meeting recordings to find interesting stories. Use when the user wants blog ideas, content inspiration, or asks "what can I write about", "find blog material", "blog ideas from my work", "/blog-post-mining".

p-activity-digest

12
from jackchuka/skills

Summarize recent communication activity from Slack and meeting recordings. Use when the user wants to know what happened on Slack, review meeting action items, find mentions, or get a communication summary. Triggers on "summarize Slack", "meeting action items", "what was discussed", "activity summary", "search my mentions", "highlight of the day", "/activity-digest".