{
  "schema_version": "cmdhub.website.command_catalog.v1",
  "tool": "mscal",
  "title": "Microsoft Calendar CLI",
  "description": "Outlook calendars, events, free/busy windows, and open slots through Microsoft Graph.",
  "auth_mode": "OAuth2",
  "auth_scopes": {
    "label": "Microsoft OAuth",
    "scopes": [
      "offline_access",
      "User.Read",
      "Calendars.ReadWrite"
    ],
    "note": "Used for Outlook calendars, events, and availability."
  },
  "markdown_url": "/cli/mscal/index.md",
  "commands": [
    {
      "id": "cmd-mscal-auth",
      "path": "mscal auth",
      "name": "auth",
      "short": "Manage Microsoft Outlook Calendar authentication",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-auth-login",
      "path": "mscal auth login",
      "name": "login",
      "short": "Authenticate with Microsoft Outlook Calendar",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal auth login\nmscal auth login --help\nmscal auth status",
      "flags": []
    },
    {
      "id": "cmd-mscal-auth-logout",
      "path": "mscal auth logout",
      "name": "logout",
      "short": "Remove stored credentials",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal auth login\nmscal auth logout\nmscal auth logout --help",
      "flags": []
    },
    {
      "id": "cmd-mscal-auth-refresh",
      "path": "mscal auth refresh",
      "name": "refresh",
      "short": "Refresh stored token",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal auth refresh\nmscal auth refresh --help\nmscal auth status",
      "flags": []
    },
    {
      "id": "cmd-mscal-auth-status",
      "path": "mscal auth status",
      "name": "status",
      "short": "Show auth status",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal auth status\nmscal auth status --help\nmscal auth status --view full",
      "flags": []
    },
    {
      "id": "cmd-mscal-auth-whoami",
      "path": "mscal auth whoami",
      "name": "whoami",
      "short": "Show current calendar identity",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal auth whoami\nmscal auth whoami --help\nmscal auth whoami --json",
      "flags": []
    },
    {
      "id": "cmd-mscal-calendar",
      "path": "mscal calendar",
      "name": "calendar",
      "short": "Manage calendars",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-calendar-get",
      "path": "mscal calendar get",
      "name": "get",
      "short": "Get a calendar",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal calendar get\nmscal calendar get c1\nmscal calendar get c1 c2\nmscal calendar get primary --view full\nmscal calendar list --jsonl | mscal calendar get",
      "flags": []
    },
    {
      "id": "cmd-mscal-calendar-list",
      "path": "mscal calendar list",
      "name": "list",
      "short": "List calendars",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal calendar list\nmscal calendar list --jsonl | mscal calendar get\nmscal calendar list --view full",
      "flags": []
    },
    {
      "id": "cmd-mscal-calendar-search",
      "path": "mscal calendar search",
      "name": "search",
      "short": "Search calendars by summary",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal calendar search\nmscal calendar search --query holidays\nmscal calendar search --query work --view full",
      "flags": [
        {
          "name": "query",
          "type": "string",
          "usage": "Search text"
        }
      ]
    },
    {
      "id": "cmd-mscal-capabilities",
      "path": "mscal capabilities",
      "name": "capabilities",
      "short": "Describe mscal capabilities, scopes, output modes, and schemas",
      "long": "Describe mscal capabilities, scopes, schemas, and the command contract.\n\nThe default machine output includes the full command contract so help, schemas,\nguidance, and conformance use the same inventory. Use --section for focused\nhuman or JSON views of scopes, schemas, or command paths.",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal capabilities\nmscal capabilities --help\nmscal capabilities --json\nmscal capabilities --section scopes",
      "flags": [
        {
          "name": "section",
          "type": "string",
          "usage": "Focused section: scopes, schemas, or commands"
        }
      ]
    },
    {
      "id": "cmd-mscal-config",
      "path": "mscal config",
      "name": "config",
      "short": "Inspect local configuration",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-config-explain",
      "path": "mscal config explain",
      "name": "explain",
      "short": "Explain resolved configuration",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal config explain --help",
      "flags": []
    },
    {
      "id": "cmd-mscal-doctor",
      "path": "mscal doctor",
      "name": "doctor",
      "short": "Run mscal diagnostics",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal doctor\nmscal doctor --help\nmscal doctor --view full",
      "flags": []
    },
    {
      "id": "cmd-mscal-event",
      "path": "mscal event",
      "name": "event",
      "short": "Manage calendar events",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-event-create",
      "path": "mscal event create",
      "name": "create",
      "short": "Create an event",
      "long": "Create a timed or all-day event.\n\nTime fields accept natural values such as \"tomorrow 14:00\", relative values\nsuch as +1h, or RFC3339 timestamps such as 2026-05-30T14:00:00+02:00.\nUse --duration with --start for the common RFC3339 + duration + location shape.\nTimed events without --end or --duration default to 30 minutes.\n\nAdding --attendee, --optional-attendee, or --room creates a Microsoft meeting\nand sends provider invitations. Pass --send-invites to confirm that external\neffect.",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal event create --calendar c1 --title \"Planning\" --start 2026-05-30T14:00:00+02:00 --duration 45m --location \"Room 4\"\nmscal event create --help\nmscal event create --title \"Company holiday\" --start 2026-05-01 --all-day\nmscal event create --title \"Interview\" --start +2h --duration 45m --attendee alex@example.com --room conf-a@example.com --send-invites\nmscal event create --title \"Project review\" --start \"tomorrow 14:00\" --duration 45m",
      "flags": [
        {
          "name": "all-day",
          "type": "bool",
          "usage": "All-day event"
        },
        {
          "name": "attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Required attendee email; repeat for multiple attendees"
        },
        {
          "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; repeat for multiple attendees"
        },
        {
          "name": "room",
          "type": "stringArray",
          "default": "[]",
          "usage": "Room email or resource attendee; repeat for multiple rooms"
        },
        {
          "name": "send-invites",
          "type": "bool",
          "usage": "Confirm that attendee or room flags send Microsoft meeting invitations"
        },
        {
          "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-mscal-event-delete",
      "path": "mscal event delete",
      "name": "delete",
      "short": "Delete an event",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal event delete --all --yes e1 e2\nmscal event delete --help\nmscal event delete e1\nmscal event search --query cmdhub-human-audit --jsonl | mscal 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 batch event delete"
        }
      ]
    },
    {
      "id": "cmd-mscal-event-get",
      "path": "mscal event get",
      "name": "get",
      "short": "Get an event",
      "long": "Get event details by local ref, provider ID, or event JSONL from stdin.\n\nWhen stdin contains event JSONL items from event list/search, event get consumes\nthe item id/provider_id plus calendar_id fields, fetches current provider\ndetails, and renders the retrieved event. The get output is already the usable\ndetail view; a second \"mscal event get e1\" call is only needed if you\nintentionally want to re-open a new local ref.",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal event get\nmscal event get e1\nmscal event get e1 --view full\nmscal event get e1 e2\nmscal event list --today --jsonl | mscal event get\nmscal event search --query audit --limit 1 --jsonl | mscal event delete --all --yes\nmscal event search --query audit --limit 1 --jsonl | mscal event get\nmscal event search --query audit --limit 1 --jsonl | mscal event update --location \"Room 4\"",
      "flags": [
        {
          "name": "calendar",
          "type": "string",
          "usage": "Optional calendar selector"
        }
      ]
    },
    {
      "id": "cmd-mscal-event-list",
      "path": "mscal event list",
      "name": "list",
      "short": "List events",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal event list\nmscal event list --calendar c1 --from now --to +72h\nmscal event list --today\nmscal 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; relative values such as +4h are relative to --from"
        },
        {
          "name": "today",
          "type": "bool",
          "usage": "Today window"
        },
        {
          "name": "tomorrow",
          "type": "bool",
          "usage": "Tomorrow window"
        },
        {
          "name": "week",
          "type": "bool",
          "usage": "Week window"
        }
      ]
    },
    {
      "id": "cmd-mscal-event-quick-add",
      "path": "mscal event quick-add",
      "name": "quick-add",
      "short": "Create an event from natural text",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal event quick-add --calendar c1 --text \"Planning review today 3pm\"\nmscal event quick-add --help\nmscal event quick-add --text \"Lunch with Sam tomorrow 12pm\"",
      "flags": [
        {
          "name": "calendar",
          "type": "string",
          "default": "primary",
          "usage": "Calendar selector"
        },
        {
          "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-mscal-event-search",
      "path": "mscal event search",
      "name": "search",
      "short": "Search events",
      "long": "Search events using Microsoft Calendar full-text query semantics.\n\nUse plain text or tokens in --query, such as \"dentist\" or \"project review\".\nField-prefix filters such as title:review are not supported by this CLI surface.\n\nFor single-event detail, pipe JSONL search results into event get:\n  mscal event search --query \"project review\" --jsonl | mscal event get\n\nThe same JSONL search stream can feed update or delete when it contains the exact\nevent you intend to mutate:\n  mscal event search --query \"project review\" --limit 1 --jsonl | mscal event update --location \"Room 4\"\n  mscal event search --query \"project review\" --limit 1 --jsonl | mscal event delete --all --yes",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal event search\nmscal event search --query \"project review\" --from today --to tomorrow\nmscal event search --query audit --jsonl | mscal event get\nmscal event search --query audit --limit 1 --jsonl | mscal event delete --all --yes\nmscal event search --query audit --limit 1 --jsonl | mscal event update --location \"Room 4\"\nmscal event search --query dentist",
      "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; relative values such as +4h are relative to --from"
        }
      ]
    },
    {
      "id": "cmd-mscal-event-update",
      "path": "mscal event update",
      "name": "update",
      "short": "Update an event",
      "long": "Update event fields.\n\nAdding or changing attendees creates or updates a Microsoft meeting and can send\nprovider invitations or updates. Pass --send-updates all when using attendee or\nroom flags so the notification behavior is explicit.",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal event search --query review --jsonl | mscal event update --location \"Room 4\"\nmscal event update --help\nmscal event update e1 --attendee alex@example.com --send-updates all\nmscal event update e1 --start \"tomorrow 15:00\" --duration 30m\nmscal event update e1 --title \"Updated title\"",
      "flags": [
        {
          "name": "all-day",
          "type": "bool",
          "usage": "All-day event"
        },
        {
          "name": "attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Required attendee email; repeat for multiple attendees"
        },
        {
          "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": "optional-attendee",
          "type": "stringArray",
          "default": "[]",
          "usage": "Optional attendee email; repeat for multiple attendees"
        },
        {
          "name": "room",
          "type": "stringArray",
          "default": "[]",
          "usage": "Room email or resource attendee; repeat for multiple rooms"
        },
        {
          "name": "send-updates",
          "type": "string",
          "usage": "Confirm attendee or room update notifications: all"
        },
        {
          "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-mscal-freebusy",
      "path": "mscal freebusy",
      "name": "freebusy",
      "short": "Inspect busy windows",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-freebusy-get",
      "path": "mscal freebusy get",
      "name": "get",
      "short": "Get busy windows for calendars",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal freebusy get\nmscal freebusy get --calendar c1 --from today --to tomorrow\nmscal freebusy get --from \"tomorrow 09:00\" --to \"tomorrow 17:00\" --view full\nmscal freebusy get --from now --to +4h\nmscal freebusy get --user alex@example.com --from \"tomorrow 09:00\" --to \"tomorrow 17:00\"",
      "flags": [
        {
          "name": "calendar",
          "type": "stringSlice",
          "default": "[primary]",
          "usage": "Calendar selectors"
        },
        {
          "name": "from",
          "type": "string",
          "usage": "Start time"
        },
        {
          "name": "schedule",
          "type": "stringSlice",
          "default": "[]",
          "usage": "Alias for --user; Microsoft Graph schedule email to include"
        },
        {
          "name": "to",
          "type": "string",
          "usage": "End time; relative values such as +4h are relative to --from"
        },
        {
          "name": "user",
          "type": "stringSlice",
          "default": "[]",
          "usage": "User or schedule email to include; repeat or comma-separate"
        }
      ]
    },
    {
      "id": "cmd-mscal-meeting-time",
      "path": "mscal meeting-time",
      "name": "meeting-time",
      "short": "Find Microsoft Graph meeting-time suggestions",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-meeting-time-find",
      "path": "mscal meeting-time find",
      "name": "find",
      "short": "Find meeting-time suggestions",
      "long": "Find Microsoft Graph meeting-time suggestions for attendees and rooms.\n\nThis uses Microsoft Graph findMeetingTimes. Some personal Microsoft accounts or\ntenants do not support this scheduling surface; in that case mscal returns a\nprovider-limit recovery screen and suggests free/busy or event list fallbacks.",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal meeting-time find\nmscal meeting-time find --attendee alex@example.com --from \"tomorrow 09:00\" --to \"tomorrow 17:00\" --duration 30m\nmscal meeting-time find --attendee alex@example.com --room conf-a@example.com --from now --to +8h",
      "flags": [
        {
          "name": "attendee",
          "type": "stringSlice",
          "default": "[]",
          "usage": "Required attendee email; repeat or comma-separate"
        },
        {
          "name": "duration",
          "type": "string",
          "default": "30m",
          "usage": "Meeting duration"
        },
        {
          "name": "from",
          "type": "string",
          "usage": "Start time"
        },
        {
          "name": "room",
          "type": "stringSlice",
          "default": "[]",
          "usage": "Room email; repeat or comma-separate"
        },
        {
          "name": "to",
          "type": "string",
          "usage": "End time; relative values such as +4h are relative to --from"
        }
      ]
    },
    {
      "id": "cmd-mscal-profile",
      "path": "mscal profile",
      "name": "profile",
      "short": "Manage provider profiles",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-profile-create",
      "path": "mscal profile create",
      "name": "create",
      "short": "Create an unauthenticated provider profile",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal profile create --help",
      "flags": []
    },
    {
      "id": "cmd-mscal-profile-delete",
      "path": "mscal profile delete",
      "name": "delete",
      "short": "Delete a local provider profile",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal profile delete --help",
      "flags": []
    },
    {
      "id": "cmd-mscal-profile-list",
      "path": "mscal profile list",
      "name": "list",
      "short": "List provider profiles",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal profile list --help",
      "flags": []
    },
    {
      "id": "cmd-mscal-profile-rename",
      "path": "mscal profile rename",
      "name": "rename",
      "short": "Rename a local provider profile",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal profile rename --help",
      "flags": []
    },
    {
      "id": "cmd-mscal-profile-use",
      "path": "mscal profile use",
      "name": "use",
      "short": "Set the default provider profile",
      "long": "",
      "mutates": true,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "mscal profile use --help",
      "flags": []
    },
    {
      "id": "cmd-mscal-resolve",
      "path": "mscal resolve",
      "name": "resolve",
      "short": "Resolve a marker or short id",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal resolve --help\nmscal resolve c1\nmscal resolve e1\nmscal resolve u1",
      "flags": []
    },
    {
      "id": "cmd-mscal-room",
      "path": "mscal room",
      "name": "room",
      "short": "Discover Microsoft 365 rooms",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-room-get",
      "path": "mscal room get",
      "name": "get",
      "short": "Get a room",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal room get\nmscal room get r1\nmscal room search --query conference --jsonl | mscal room get",
      "flags": []
    },
    {
      "id": "cmd-mscal-room-list",
      "path": "mscal room list",
      "name": "list",
      "short": "List rooms",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal room list\nmscal room list --limit 20 --jsonl",
      "flags": []
    },
    {
      "id": "cmd-mscal-room-search",
      "path": "mscal room search",
      "name": "search",
      "short": "Search rooms",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal room search\nmscal room search --query \"floor 4\" --jsonl\nmscal room search --query conference",
      "flags": [
        {
          "name": "query",
          "type": "string",
          "usage": "Room search text"
        }
      ]
    },
    {
      "id": "cmd-mscal-schema",
      "path": "mscal schema",
      "name": "schema",
      "short": "Emit mscal schema hints",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal schema\nmscal schema --help\nmscal schema event.create --input\nmscal schema event.create --out",
      "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-mscal-slot",
      "path": "mscal slot",
      "name": "slot",
      "short": "Find open slots",
      "long": "",
      "mutates": false,
      "safe_discovery": false,
      "supports_dry_run": false,
      "example": "",
      "flags": []
    },
    {
      "id": "cmd-mscal-slot-find",
      "path": "mscal slot find",
      "name": "find",
      "short": "Find open slots across calendars",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal slot find\nmscal slot find --calendar c1 --from today --to tomorrow --duration 1h\nmscal slot find --from \"tomorrow 09:00\" --to \"tomorrow 17:00\" --view full\nmscal 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; relative values such as +4h are relative to --from"
        }
      ]
    },
    {
      "id": "cmd-mscal-version",
      "path": "mscal version",
      "name": "version",
      "short": "Show mscal version information",
      "long": "",
      "mutates": false,
      "safe_discovery": true,
      "supports_dry_run": false,
      "example": "mscal version\nmscal version --help\nmscal version --json",
      "flags": []
    }
  ]
}
