{
  "schema_version": "cmdhub.website.command_catalog.v1",
  "tool": "gcal",
  "title": "GCal CLI",
  "description": "Calendars, events, freebusy, and slots from the terminal.",
  "auth_mode": "OAuth2",
  "auth_scopes": {
    "label": "Google OAuth",
    "scopes": [
      "openid",
      "email",
      "profile",
      "https://www.googleapis.com/auth/calendar"
    ],
    "note": "Used for calendars, events, and availability."
  },
  "markdown_url": "/cli/gcal/index.md",
  "commands": [
    {
      "id": "cmd-gcal-auth",
      "path": "gcal auth",
      "name": "auth",
      "short": "Manage Google Calendar authentication",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-gcal-auth-login",
      "path": "gcal auth login",
      "name": "login",
      "short": "Authenticate with Google Calendar",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal auth login\ngcal auth login --help\ngcal auth status",
      "flags": []
    },
    {
      "id": "cmd-gcal-auth-logout",
      "path": "gcal auth logout",
      "name": "logout",
      "short": "Remove stored credentials",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal auth login\ngcal auth logout\ngcal auth logout --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-auth-refresh",
      "path": "gcal auth refresh",
      "name": "refresh",
      "short": "Refresh stored token",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal auth refresh\ngcal auth refresh --help\ngcal auth status",
      "flags": []
    },
    {
      "id": "cmd-gcal-auth-status",
      "path": "gcal auth status",
      "name": "status",
      "short": "Show auth status",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal auth status\ngcal auth status --help\ngcal auth status --view full",
      "flags": []
    },
    {
      "id": "cmd-gcal-auth-whoami",
      "path": "gcal auth whoami",
      "name": "whoami",
      "short": "Show current calendar identity",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal auth whoami\ngcal auth whoami --help\ngcal auth whoami --json",
      "flags": []
    },
    {
      "id": "cmd-gcal-calendar",
      "path": "gcal calendar",
      "name": "calendar",
      "short": "Manage calendars",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-gcal-calendar-get",
      "path": "gcal calendar get",
      "name": "get",
      "short": "Get a calendar",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal calendar get\ngcal calendar get c1\ngcal calendar get c1 c2\ngcal calendar get primary --view full\ngcal calendar list --jsonl | gcal calendar get",
      "flags": []
    },
    {
      "id": "cmd-gcal-calendar-list",
      "path": "gcal calendar list",
      "name": "list",
      "short": "List calendars",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal calendar list\ngcal calendar list --jsonl | gcal calendar get\ngcal calendar list --view full",
      "flags": []
    },
    {
      "id": "cmd-gcal-calendar-search",
      "path": "gcal calendar search",
      "name": "search",
      "short": "Search calendars by summary",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal calendar search\ngcal calendar search --query holidays\ngcal calendar search --query work --view full",
      "flags": [
        {
          "name": "query",
          "type": "string",
          "usage": "Search text"
        }
      ]
    },
    {
      "id": "cmd-gcal-capabilities",
      "path": "gcal capabilities",
      "name": "capabilities",
      "short": "Describe capabilities",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal capabilities --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-config",
      "path": "gcal config",
      "name": "config",
      "short": "Inspect local configuration",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-gcal-config-explain",
      "path": "gcal config explain",
      "name": "explain",
      "short": "Explain resolved configuration",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal config explain --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-doctor",
      "path": "gcal doctor",
      "name": "doctor",
      "short": "Run gcal diagnostics",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal doctor\ngcal doctor --help\ngcal doctor --view full",
      "flags": []
    },
    {
      "id": "cmd-gcal-event",
      "path": "gcal event",
      "name": "event",
      "short": "Manage calendar events",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-gcal-event-create",
      "path": "gcal event create",
      "name": "create",
      "short": "Create an event",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal event create --calendar c1 --title \"Planning\" --start +1h --end +2h --location \"Room 4\"\ngcal event create --help\ngcal event create --title \"Company holiday\" --start 2026-05-01 --all-day\ngcal event create --title \"Project review\" --start \"tomorrow 14:00\" --duration 45m\ngcal event create --title \"Review\" --start \"tomorrow 14:00\" --duration 45m --attendee alex@example.com --send-updates none",
      "flags": [
        {
          "name": "all-day",
          "type": "bool",
          "usage": "All-day event"
        },
        {
          "name": "attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Attendee email; repeatable"
        },
        {
          "name": "calendar",
          "type": "string",
          "default": "primary",
          "usage": "Calendar selector"
        },
        {
          "name": "description",
          "type": "string",
          "usage": "Description"
        },
        {
          "name": "duration",
          "type": "string",
          "usage": "Duration"
        },
        {
          "name": "end",
          "type": "string",
          "usage": "Event end"
        },
        {
          "name": "location",
          "type": "string",
          "usage": "Location"
        },
        {
          "name": "optional-attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Optional attendee email; repeatable"
        },
        {
          "name": "resource",
          "type": "stringArray",
          "default": "[]",
          "usage": "Room/resource attendee email; repeatable"
        },
        {
          "name": "send-updates",
          "type": "string",
          "usage": "Guest notification policy: all, externalOnly, or none"
        },
        {
          "name": "start",
          "type": "string",
          "usage": "Event start"
        },
        {
          "name": "title",
          "type": "string",
          "usage": "Event title"
        },
        {
          "name": "yes",
          "shorthand": "y",
          "type": "bool",
          "usage": "Accepted for compatibility; this command is already non-interactive"
        }
      ]
    },
    {
      "id": "cmd-gcal-event-delete",
      "path": "gcal event delete",
      "name": "delete",
      "short": "Delete an event",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal event delete --all --yes e1 e2\ngcal event delete --help\ngcal event delete e1 --yes\ngcal event search --query cmdhub-human-audit --jsonl | gcal event delete --all --yes",
      "flags": [
        {
          "name": "all",
          "type": "bool",
          "usage": "Confirm batch event delete"
        },
        {
          "name": "calendar",
          "type": "string",
          "usage": "Optional calendar selector"
        },
        {
          "name": "yes",
          "shorthand": "y",
          "type": "bool",
          "usage": "Confirm destructive event delete"
        }
      ]
    },
    {
      "id": "cmd-gcal-event-get",
      "path": "gcal event get",
      "name": "get",
      "short": "Get an event",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal event get\ngcal event get e1\ngcal event get e1 --view full\ngcal event get e1 e2\ngcal event list --today --jsonl | gcal event get",
      "flags": [
        {
          "name": "calendar",
          "type": "string",
          "usage": "Optional calendar selector"
        }
      ]
    },
    {
      "id": "cmd-gcal-event-list",
      "path": "gcal event list",
      "name": "list",
      "short": "List events",
      "long": "List events in a time window. Relative --from and --to values such as +8h and +9h are both relative to now.",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal event list\ngcal event list --calendar c1 --from now --to +72h\ngcal event list --from +8h --to +9h\ngcal event list --today\ngcal event list --week --view full",
      "flags": [
        {
          "name": "calendar",
          "type": "string",
          "default": "primary",
          "usage": "Calendar selector"
        },
        {
          "name": "from",
          "type": "string",
          "usage": "Start time"
        },
        {
          "name": "to",
          "type": "string",
          "usage": "End time"
        },
        {
          "name": "today",
          "type": "bool",
          "usage": "Today window"
        },
        {
          "name": "tomorrow",
          "type": "bool",
          "usage": "Tomorrow window"
        },
        {
          "name": "week",
          "type": "bool",
          "usage": "Week window"
        }
      ]
    },
    {
      "id": "cmd-gcal-event-quick-add",
      "path": "gcal event quick-add",
      "name": "quick-add",
      "short": "Create an event from natural text",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal event quick-add --calendar c1 --text \"Planning review today 3pm\"\ngcal event quick-add --help\ngcal event quick-add --text \"Lunch with Sam tomorrow 12pm\"",
      "flags": [
        {
          "name": "calendar",
          "type": "string",
          "default": "primary",
          "usage": "Calendar selector"
        },
        {
          "name": "send-updates",
          "type": "string",
          "usage": "Guest notification policy: all, externalOnly, or none"
        },
        {
          "name": "text",
          "type": "string",
          "usage": "Quick-add text"
        },
        {
          "name": "yes",
          "shorthand": "y",
          "type": "bool",
          "usage": "Accepted for compatibility; this command is already non-interactive"
        }
      ]
    },
    {
      "id": "cmd-gcal-event-search",
      "path": "gcal event search",
      "name": "search",
      "short": "Search events",
      "long": "Search events in a time window. Relative --from and --to values such as +8h and +9h are both relative to now.",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal event search\ngcal event search --query \"project review\" --from today --to tomorrow\ngcal event search --query audit --jsonl | gcal event get\ngcal event search --query dentist\ngcal event search --query review --from +8h --to +9h",
      "flags": [
        {
          "name": "calendar",
          "type": "string",
          "default": "primary",
          "usage": "Calendar selector"
        },
        {
          "name": "from",
          "type": "string",
          "usage": "Start time"
        },
        {
          "name": "query",
          "type": "string",
          "usage": "Search query"
        },
        {
          "name": "to",
          "type": "string",
          "usage": "End time"
        }
      ]
    },
    {
      "id": "cmd-gcal-event-update",
      "path": "gcal event update",
      "name": "update",
      "short": "Update an event",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal event search --query review --jsonl | gcal event update --location \"Room 4\"\ngcal event update --help\ngcal event update e1 --add-attendee alex@example.com --send-updates none\ngcal event update e1 --start \"tomorrow 15:00\" --duration 30m\ngcal event update e1 --title \"Updated title\"",
      "flags": [
        {
          "name": "add-attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Add attendee email; repeatable"
        },
        {
          "name": "all-day",
          "type": "bool",
          "usage": "All-day event"
        },
        {
          "name": "attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Compatibility alias for --add-attendee; repeatable"
        },
        {
          "name": "calendar",
          "type": "string",
          "usage": "Optional calendar selector"
        },
        {
          "name": "description",
          "type": "string",
          "usage": "Description"
        },
        {
          "name": "duration",
          "type": "string",
          "usage": "Duration"
        },
        {
          "name": "end",
          "type": "string",
          "usage": "Event end"
        },
        {
          "name": "location",
          "type": "string",
          "usage": "Location"
        },
        {
          "name": "remove-attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Remove attendee email; repeatable"
        },
        {
          "name": "send-updates",
          "type": "string",
          "usage": "Guest notification policy: all, externalOnly, or none"
        },
        {
          "name": "set-optional-attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Replace attendees with optional attendee email; repeatable"
        },
        {
          "name": "set-required-attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Replace attendees with required attendee email; repeatable"
        },
        {
          "name": "start",
          "type": "string",
          "usage": "Event start"
        },
        {
          "name": "title",
          "type": "string",
          "usage": "Event title"
        },
        {
          "name": "yes",
          "shorthand": "y",
          "type": "bool",
          "usage": "Accepted for compatibility; this command is already non-interactive"
        }
      ]
    },
    {
      "id": "cmd-gcal-freebusy",
      "path": "gcal freebusy",
      "name": "freebusy",
      "short": "Inspect busy windows",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-gcal-freebusy-get",
      "path": "gcal freebusy get",
      "name": "get",
      "short": "Get busy windows for calendars",
      "long": "Get busy windows for calendars. Relative --from and --to values such as +8h and +9h are both relative to now.",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal freebusy get\ngcal freebusy get --calendar c1 --from today --to tomorrow\ngcal freebusy get --from \"tomorrow 09:00\" --to \"tomorrow 17:00\" --view full\ngcal freebusy get --from +8h --to +9h\ngcal freebusy get --from now --to +4h",
      "flags": [
        {
          "name": "calendar",
          "type": "stringSlice",
          "default": "[primary]",
          "usage": "Calendar selectors"
        },
        {
          "name": "from",
          "type": "string",
          "usage": "Start time"
        },
        {
          "name": "to",
          "type": "string",
          "usage": "End time"
        }
      ]
    },
    {
      "id": "cmd-gcal-login",
      "path": "gcal login",
      "name": "login",
      "short": "Authenticate with Google Calendar",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal auth status\ngcal login",
      "flags": []
    },
    {
      "id": "cmd-gcal-logout",
      "path": "gcal logout",
      "name": "logout",
      "short": "Remove stored credentials",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal auth login\ngcal logout",
      "flags": []
    },
    {
      "id": "cmd-gcal-profile",
      "path": "gcal profile",
      "name": "profile",
      "short": "Manage provider profiles",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-gcal-profile-create",
      "path": "gcal profile create",
      "name": "create",
      "short": "Create an unauthenticated provider profile",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal profile create --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-profile-delete",
      "path": "gcal profile delete",
      "name": "delete",
      "short": "Delete a local provider profile",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal profile delete --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-profile-list",
      "path": "gcal profile list",
      "name": "list",
      "short": "List provider profiles",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal profile list --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-profile-rename",
      "path": "gcal profile rename",
      "name": "rename",
      "short": "Rename a local provider profile",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal profile rename --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-profile-use",
      "path": "gcal profile use",
      "name": "use",
      "short": "Set the default provider profile",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "gcal profile use --help",
      "flags": []
    },
    {
      "id": "cmd-gcal-resolve",
      "path": "gcal resolve",
      "name": "resolve",
      "short": "Resolve a marker or short id",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal resolve --help\ngcal resolve c1\ngcal resolve e1\ngcal resolve u1",
      "flags": []
    },
    {
      "id": "cmd-gcal-schema",
      "path": "gcal schema",
      "name": "schema",
      "short": "Emit gcal schema hints",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal schema\ngcal schema --help\ngcal schema event.create\ngcal schema event.create --input",
      "flags": [
        {
          "name": "in",
          "type": "bool",
          "usage": "Show input schema"
        },
        {
          "name": "input",
          "type": "bool",
          "usage": "Show input schema"
        },
        {
          "name": "out",
          "type": "bool",
          "usage": "Show output schema"
        }
      ]
    },
    {
      "id": "cmd-gcal-slot",
      "path": "gcal slot",
      "name": "slot",
      "short": "Find open slots",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-gcal-slot-find",
      "path": "gcal slot find",
      "name": "find",
      "short": "Find open slots across calendars",
      "long": "Find open slots across calendars. Relative --from and --to values such as +8h and +9h are both relative to now.",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal slot find\ngcal slot find --calendar c1 --from today --to tomorrow --duration 1h\ngcal slot find --from \"tomorrow 09:00\" --to \"tomorrow 17:00\" --view full\ngcal slot find --from +8h --to +9h --duration 30m\ngcal slot find --from now --to +4h --duration 30m",
      "flags": [
        {
          "name": "calendar",
          "type": "stringSlice",
          "default": "[primary]",
          "usage": "Calendar selectors"
        },
        {
          "name": "duration",
          "type": "string",
          "default": "30m",
          "usage": "Minimum slot duration"
        },
        {
          "name": "from",
          "type": "string",
          "usage": "Start time"
        },
        {
          "name": "to",
          "type": "string",
          "usage": "End time"
        }
      ]
    },
    {
      "id": "cmd-gcal-version",
      "path": "gcal version",
      "name": "version",
      "short": "Show gcal version information",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "gcal version --help",
      "flags": []
    }
  ]
}
