Skip to content
Education
Skill

/schedule-query

Check availability across configured calendars and draft scheduling replies with specific time proposals.

From plugin
claudeblattman
48229 skills7 agents2 commands

Claude Code

$ npx -y skills add chrisblattman/claudeblattman --skill schedule-query --agent claude-code

SKILL.md

schedule-query.SKILL.md
name: schedule-query
description: "Check availability across configured calendars and draft scheduling replies with specific time proposals."

Schedule Query

*v1.1 — Check calendar availability and draft scheduling replies with specific time proposals*

Check calendar availability across your configured Google calendars and draft a scheduling reply with specific time proposals. Can be used standalone or invoked from a morning workflow when a scheduling email is detected.

Prerequisites

  • **Google Calendar MCP** — `google_workspace_mcp` with calendar and Gmail tools enabled
  • **Calendar policy config** — `~/.claude-assistant/config/calendar-policy.md` (calendar IDs, scheduling preferences, deep work protection). Download the template from the [GitHub repo](https://github.com/chrisblattman/claudeblattman/tree/main/templates) (see First-Time Setup).
  • **Email voice config** (optional) — `~/.claude-assistant/config/email-voice.md` for tone/voice templates
  • **Goals file** (optional) — `~/.claude-assistant/config/goals.yaml` for deep work block protection

First-Time Setup

1. **Create config directory:**

   mkdir -p ~/.claude-assistant/config

2. **Create `calendar-policy.md`** from the template. At minimum, fill in:

  • **Calendar IDs** — list every Google Calendar you want checked for conflicts. Find these in Google Calendar Settings > [Calendar name] > "Integrate calendar" > Calendar ID.
  • **Scheduling preferences** — working hours, buffer times, deep work blocks
  • **Your timezone** — e.g., `America/New_York`, `America/Chicago`, `Europe/London`

3. **Test:**

   /schedule-query range:3

This queries the next 3 days to verify calendar access works.

Arguments

`$ARGUMENTS` can include:

  • `with:[name]` — who to meet with (searches Gmail for their email)
  • `duration:[minutes]` — meeting length (default: 30)
  • `range:[days]` — how far ahead to look (default: 14)
  • `email:[id]` — reply to a specific email thread with availability
  • *(freeform text)* — "schedule a meeting with [Name] next week about the paper"

Instructions

Step 1: Read Config

Read these files:

  • `~/.claude-assistant/config/calendar-policy.md` — calendar IDs, scheduling preferences, deep work protection
  • `~/.claude-assistant/config/goals.yaml` — for deep work block protection (if exists)
  • `~/.claude-assistant/config/email-voice.md` — email voice rules (if exists)

Extract:

  • All Google Calendar IDs to query
  • Scheduling preferences (buffer times, deep work blocks, meeting-free periods)
  • Your timezone (for formatting proposed times)
  • Push level for deep work protection (if defined)

Step 2: Parse Request

From `$ARGUMENTS` or freeform text, extract:

  • **Who:** Name and/or email of person to meet
  • **Duration:** Meeting length (default 30 min)
  • **Timeframe:** When to look (default: next 2 weeks)
  • **Context:** What the meeting is about (if mentioned)
  • **Constraints:** Any specific preferences ("mornings only", "not Friday", etc.)

If `email:[id]` provided, fetch the email to extract the scheduling request details:

mcp__google_workspace__get_gmail_message_content
  user_google_email: your-email@gmail.com
  message_id: [id]

If only a name is provided (no email), search Gmail:

mcp__google_workspace__search_gmail_messages
  user_google_email: your-email@gmail.com
  query: "from:[name] OR to:[name]"

Extract their email address from the results.

Step 3: Check Availability

Query ALL configured Google calendars for the specified timeframe:

mcp__google_workspace__get_events
  user_google_email: your-email@gmail.com
  calendar_id: [each calendar ID from config]
  time_min: [today]T00:00:00[YOUR_TIMEZONE]
  time_max: [today + range days]T23:59:59[YOUR_TIMEZONE]

If a calendar returns a 404 or error, skip it silently and continue with the others.

Step 4: Find Available Slots

Merge events from all calendars into one timeline. Then find available slots:

**Rules:** 1. Working hours: Use hours from `calendar-policy.md` (e.g., 9:00 AM - 5:30 PM [TZ], Monday-Friday) 2. Minimum buffer: 15 minutes between meetings (or as configured) 3. Protect deep work blocks: Avoid proposing times during configured deep work periods unless specifically requested 4. Prefer meeting-free periods: Avoid proposing slots during configured meeting-free blocks unless necessary 5. No back-to-back: Do not propose a slot that creates 3+ consecutive meetings 6. If `push_level = moderate` or `assertive`: Protect the largest free block each day for deep work

**Scoring slots** (prefer in this order): 1. Mid-morning (10am-12pm) or mid-afternoon (2pm-4pm) 2. Not adjacent to existing long meetings 3. Days with fewer existing meetings 4. Closer dates (sooner is better for responsiveness)

Select 3-5 best slots.

Step 5: Draft Response

Determine email tier for the recipient (check VIP lists in your email policy if configured).

Draft a reply proposing the available times:

**Standard (most common):**

Hi [Name],

I'm free at these times:
- [Day], [Month] [Date] at [time] [TZ]
- [Day], [Month] [Date] at [time] [TZ]
- [Day], [Month] [Date] at [time] [TZ]

Let me know what works and I'll send a calendar invite.

[Your name]

**Formal:**

Hi [Name],

I'd be happy to meet. I have availability at the following times:
- [Day], [Month] [Date] at [time] [TZ]
- [Day], [Month] [Date] at [time] [TZ]
- [Day], [Month] [Date] at [time] [TZ]

Please let me know which works best for you.

Best,
[Your name]

If voice examples exist in your email voice config, match those patterns instead.

Step 6: Present for Approval

Show the draft:

--------------------
SCHEDULING REPLY
--------------------

To: [name] ([email])
Re: [subject or context]

[Draft text]

Available slots verified against all configured calendars.

-> Send / Edit / Skip

**Email delivery options:**

  • If you have a send script configured (e.g., `~/.claude-assistant/scripts/send-email.py`),
Read more
@chrisblattman
Ships withclaudeblattman

Claude Code for professionals who don't code — Skills, agents, and setup guides

48229 skills7 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
482
Star history of chrisblattman/claudeblattman on GitHub, a chart by star-history.com

Other skills on claudeblattman.

ask-agents

ask-agents

Ask the specific Claude, Codex, Gemini, or Grok agent the user names and automatically retrieve its response. Use for targeted…

council

council

Develop independent approaches to a task, decision, plan, or draft, then use a fresh worker to synthesize them. Use for an…

done

done

Close out current work by saving decisions, unresolved tasks, useful artifacts, a session log and a current-state handoff for the…

kit-setup

kit-setup

Discover and test optional Claude, Codex, Gemini through Antigravity, and Grok subscription connections. Help with missing CLI or…

More skills from other plugins.

lesson-quiz

lesson-quiz

Test a learner on a single Claude Code tutorial lesson (01-10) with 10 questions, scoring answers and flagging weak spots. Use…

@luongnv89@luongnv89Install Skill
build-personal-skill

build-personal-skill

Evidence-based creation of a reusable personal course-making Skill from the user's own classroom and chat history. Use when the…

@thu-maic@thu-maicInstall Skill

Questions about schedule-query.

Which coding agents can use schedule-query?
schedule-query installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.