Skip to main content
Glama

Manage Inbox

manage_backlog
Destructive

Write to the Inbox — the tray of time-blocks captured without a time yet: intentions like "wash the car" or "call the dentist". To READ Inbox blocks, use get_schedule (backlogCount, then includeBacklog: true for the items, with backlogQuery to find one by name); THIS tool is the write surface. Pass ops, an array where each item has an op plus its fields — one or many in a single call, atomic by default (if any op fails nothing is written; pass partial: true for best-effort). Ops: capture creates an Inbox block (name, optional notes, durationMinutes, kind, checklist, areaId/activityTypeId, and an optional plannedDate or plannedDate+plannedUntil window — the still-untimed days it is meant for; pass enrich: true for RAW captured text, e.g. a web-page selection, to have AI propose a readable name and a duration first — never for a name the user chose); update edits one by id (plannedDate: null moves it back to Someday; areaId/activityTypeId: null clears the link; a task-app-linked block's date is provider-owned and refused); remove deletes one by id; schedule PLACES an Inbox block on the dial at start (local "YYYY-MM-DDTHH:MM"; its duration sizes it; pass an RRULE recurrence to make it repeat) and removes it from the Inbox; park MOVES a dial event (by id) back into the Inbox. park only works on a native or owned-calendar one-off that hasn't been reviewed — a recurring, sleep, reviewed, or not-owned event is refused with a reason. Moving a calendar-linked event to the Inbox removes its calendar copy but remembers the calendar, so re-scheduling it republishes there. Results are created / updated objects and deletedIds. Every call that writes returns one undoToken + expiresAt; pass it to undo to reverse the whole call. The Inbox needs Reassign Pro; the 7-day free trial includes it. schedule and park are inverses, and both keep the block's kind.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
opsYes
partialNoBest-effort mode instead of the default all-or-nothing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / ops / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id (case/accent-insensitive).",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "enrich": {
      -        "description": "Let AI clean this capture up before it is saved: propose a better name, estimate durationHours, and copy out any microtasks the captured text spells out. For RAW captures only — text grabbed off a web page, where the name is a paragraph rather than an intention. Do NOT set it for something the user typed or dictated: it may RENAME the block, and a name they chose must stand. Fields you send yourself always win; only the name can be replaced.",
      -        "type": "boolean"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "capture",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "plannedUntil": {
      -        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "sourceUrl": {
      -        "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      -        "maxLength": 2048,
      -        "type": "string"
      -      },
      -      "steps": {
      -        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). An Inbox block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id.",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "id": {
      -        "description": "The Inbox block id (from get_schedule's `backlog`).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "update",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      -      },
      -      "plannedUntil": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      -      },
      -      "sourceUrl": {
      -        "anyOf": [
      -          {
      -            "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      -            "maxLength": 2048,
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Replace where this block was captured from (http(s)); null clears the source chip."
      -      },
      -      "steps": {
      -        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). An Inbox block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "id": {
      -        "description": "The Inbox block id to delete from the Inbox.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "remove",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "The Inbox block id to place on the dial.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "schedule",
      -        "type": "string"
      -      },
      -      "recurrence": {
      -        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      -        "type": "string"
      -      },
      -      "start": {
      -        "description": "Start time HH:MM; duration comes from the block.",
      -        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id",
      -      "date",
      -      "start"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "eventId": {
      -        "description": "The dial event id to move to the Inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "park",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "eventId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "activityTypeId": {
      +        "description": "The activity type id. null or omitted leaves it unset.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "areaId": {
      +        "description": "The area id. null or omitted leaves it unset.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "checklist": {
      +        "additionalProperties": false,
      +        "description": "The block's microtasks, in order — REPLACES the whole list (send every item you want kept; an empty `items` clears them). An Inbox block has no occurrence, so nothing is ticked off until it is scheduled.",
      +        "properties": {
      +          "items": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "id": {
      +                  "description": "Keep an item id from a read; omit for a new item.",
      +                  "type": "string"
      +                },
      +                "text": {
      +                  "maxLength": 200,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 50,
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "items"
      +        ],
      +        "type": "object"
      +      },
      +      "durationMinutes": {
      +        "description": "Estimated length in whole minutes, 5 to 1440. Sizes the block when placed.",
      +        "maximum": 1440,
      +        "minimum": 5,
      +        "type": "integer"
      +      },
      +      "enrich": {
      +        "description": "Let AI clean this capture up before it is saved: propose a better name, estimate durationMinutes, and copy out any microtasks the captured text spells out. For RAW captures only — text grabbed off a web page, where the name is a paragraph rather than an intention. Do NOT set it for something the user typed or dictated: it may RENAME the block, and a name they chose must stand. Fields you send yourself always win; only the name can be replaced.",
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "description": "The kind the event takes when scheduled: \"blocking\" occupies time, \"non_blocking\" is an overlay that may overlap others, \"reference\" is something to see but not do. Omit for \"blocking\".",
      +        "enum": [
      +          "blocking",
      +          "non_blocking",
      +          "reference"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "capture",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "plannedUntil": {
      +        "description": "Inclusive end of a planned window; it must fall after plannedDate.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "sourceUrl": {
      +        "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      +        "maxLength": 2048,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "activityTypeId": {
      +        "description": "The activity type id. null clears the link; omit to keep it.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "areaId": {
      +        "description": "The area id. null clears the link; omit to keep it.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "checklist": {
      +        "additionalProperties": false,
      +        "description": "The block's microtasks, in order — REPLACES the whole list (send every item you want kept; an empty `items` clears them). An Inbox block has no occurrence, so nothing is ticked off until it is scheduled.",
      +        "properties": {
      +          "items": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "id": {
      +                  "description": "Keep an item id from a read; omit for a new item.",
      +                  "type": "string"
      +                },
      +                "text": {
      +                  "maxLength": 200,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 50,
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "items"
      +        ],
      +        "type": "object"
      +      },
      +      "durationMinutes": {
      +        "description": "Estimated length in whole minutes, 5 to 1440. Sizes the block when placed.",
      +        "maximum": 1440,
      +        "minimum": 5,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "The Inbox block id (from the schedule read's `backlog`).",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "description": "The kind the event takes when scheduled: \"blocking\" occupies time, \"non_blocking\" is an overlay that may overlap others, \"reference\" is something to see but not do. Omit to keep it.",
      +        "enum": [
      +          "blocking",
      +          "non_blocking",
      +          "reference"
      +        ],
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "update",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Google Tasks, Microsoft To Do and Linear sync this date both ways. Todoist dates must be changed in Todoist."
      +      },
      +      "plannedUntil": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Inclusive end of a planned window; it must fall after plannedDate. null collapses the window to one day."
      +      },
      +      "sourceUrl": {
      +        "anyOf": [
      +          {
      +            "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      +            "maxLength": 2048,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Replace where this block was captured from (http(s)); null clears the source chip."
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "description": "The Inbox block id to delete from the Inbox.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "remove",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "description": "The Inbox block id to place on the dial.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "schedule",
      +        "type": "string"
      +      },
      +      "recurrence": {
      +        "description": "Optionally make the placed block repeat, as an RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      +        "type": "string"
      +      },
      +      "start": {
      +        "description": "Local start \"YYYY-MM-DDTHH:MM\"; the block's duration sizes it.",
      +        "pattern": "^(\\d{4}-\\d{2}-\\d{2})T([01]\\d|2[0-3]):([0-5]\\d)$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id",
      +      "start"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "description": "The dial event id to move to the Inbox (from a schedule or search read). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "park",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  3. Changed1 schema field changed
    • changedInput schema / properties / ops / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id (case/accent-insensitive).",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "enrich": {
      -        "description": "Let AI clean this capture up before it is saved: propose a better name, estimate durationHours, and copy out any microtasks the captured text spells out. For RAW captures only — text grabbed off a web page, where the name is a paragraph rather than an intention. Do NOT set it for something the user typed or dictated: it may RENAME the block, and a name they chose must stand. Fields you send yourself always win; only the name can be replaced.",
      -        "type": "boolean"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "capture",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "plannedUntil": {
      -        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "sourceUrl": {
      -        "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      -        "maxLength": 2048,
      -        "type": "string"
      -      },
      -      "steps": {
      -        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id.",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "id": {
      -        "description": "The parked block id (from get_schedule's `backlog`).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "update",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      -      },
      -      "plannedUntil": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      -      },
      -      "sourceUrl": {
      -        "anyOf": [
      -          {
      -            "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      -            "maxLength": 2048,
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Replace where this block was captured from (http(s)); null clears the source chip."
      -      },
      -      "steps": {
      -        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "id": {
      -        "description": "The parked block id to delete from the inbox.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "remove",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "The parked block id to place on the dial.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "schedule",
      -        "type": "string"
      -      },
      -      "recurrence": {
      -        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      -        "type": "string"
      -      },
      -      "start": {
      -        "description": "Start time HH:MM; duration comes from the block.",
      -        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id",
      -      "date",
      -      "start"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "eventId": {
      -        "description": "The dial event id to move to the inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "park",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "eventId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id (case/accent-insensitive).",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "enrich": {
      +        "description": "Let AI clean this capture up before it is saved: propose a better name, estimate durationHours, and copy out any microtasks the captured text spells out. For RAW captures only — text grabbed off a web page, where the name is a paragraph rather than an intention. Do NOT set it for something the user typed or dictated: it may RENAME the block, and a name they chose must stand. Fields you send yourself always win; only the name can be replaced.",
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "capture",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "plannedUntil": {
      +        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "sourceUrl": {
      +        "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      +        "maxLength": 2048,
      +        "type": "string"
      +      },
      +      "steps": {
      +        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). An Inbox block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id.",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "id": {
      +        "description": "The Inbox block id (from get_schedule's `backlog`).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "update",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      +      },
      +      "plannedUntil": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      +      },
      +      "sourceUrl": {
      +        "anyOf": [
      +          {
      +            "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      +            "maxLength": 2048,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Replace where this block was captured from (http(s)); null clears the source chip."
      +      },
      +      "steps": {
      +        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). An Inbox block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "id": {
      +        "description": "The Inbox block id to delete from the Inbox.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "remove",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "date": {
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "The Inbox block id to place on the dial.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "schedule",
      +        "type": "string"
      +      },
      +      "recurrence": {
      +        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      +        "type": "string"
      +      },
      +      "start": {
      +        "description": "Start time HH:MM; duration comes from the block.",
      +        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id",
      +      "date",
      +      "start"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "eventId": {
      +        "description": "The dial event id to move to the Inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "park",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "eventId"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed1 schema field changed
    • changedInput schema / properties / ops / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id (case/accent-insensitive).",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "capture",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "plannedUntil": {
      -        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "steps": {
      -        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id.",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "id": {
      -        "description": "The parked block id (from get_schedule's `backlog`).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "update",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      -      },
      -      "plannedUntil": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      -      },
      -      "steps": {
      -        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      -        "items": {
      -          "maxLength": 200,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "id": {
      -        "description": "The parked block id to delete from the inbox.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "remove",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "The parked block id to place on the dial.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "schedule",
      -        "type": "string"
      -      },
      -      "recurrence": {
      -        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      -        "type": "string"
      -      },
      -      "start": {
      -        "description": "Start time HH:MM; duration comes from the block.",
      -        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id",
      -      "date",
      -      "start"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "eventId": {
      -        "description": "The dial event id to move to the inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "park",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "eventId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id (case/accent-insensitive).",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "enrich": {
      +        "description": "Let AI clean this capture up before it is saved: propose a better name, estimate durationHours, and copy out any microtasks the captured text spells out. For RAW captures only — text grabbed off a web page, where the name is a paragraph rather than an intention. Do NOT set it for something the user typed or dictated: it may RENAME the block, and a name they chose must stand. Fields you send yourself always win; only the name can be replaced.",
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "capture",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "plannedUntil": {
      +        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "sourceUrl": {
      +        "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      +        "maxLength": 2048,
      +        "type": "string"
      +      },
      +      "steps": {
      +        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id.",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "id": {
      +        "description": "The parked block id (from get_schedule's `backlog`).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "update",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      +      },
      +      "plannedUntil": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      +      },
      +      "sourceUrl": {
      +        "anyOf": [
      +          {
      +            "description": "Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.",
      +            "maxLength": 2048,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Replace where this block was captured from (http(s)); null clears the source chip."
      +      },
      +      "steps": {
      +        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "id": {
      +        "description": "The parked block id to delete from the inbox.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "remove",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "date": {
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "The parked block id to place on the dial.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "schedule",
      +        "type": "string"
      +      },
      +      "recurrence": {
      +        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      +        "type": "string"
      +      },
      +      "start": {
      +        "description": "Start time HH:MM; duration comes from the block.",
      +        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id",
      +      "date",
      +      "start"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "eventId": {
      +        "description": "The dial event id to move to the inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "park",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "eventId"
      +    ],
      +    "type": "object"
      +  }
      +]
  5. Changed1 schema field changed
    • changedInput schema / properties / ops / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id (case/accent-insensitive).",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "capture",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "plannedUntil": {
      -        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id.",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "id": {
      -        "description": "The parked block id (from get_schedule's `backlog`).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "update",
      -        "type": "string"
      -      },
      -      "plannedDate": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      -      },
      -      "plannedUntil": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "id": {
      -        "description": "The parked block id to delete from the inbox.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "remove",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "The parked block id to place on the dial.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "schedule",
      -        "type": "string"
      -      },
      -      "recurrence": {
      -        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      -        "type": "string"
      -      },
      -      "start": {
      -        "description": "Start time HH:MM; duration comes from the block.",
      -        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id",
      -      "date",
      -      "start"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "eventId": {
      -        "description": "The dial event id to move to the inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "park",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "eventId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id (case/accent-insensitive).",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "capture",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "plannedUntil": {
      +        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "steps": {
      +        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id.",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "id": {
      +        "description": "The parked block id (from get_schedule's `backlog`).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "update",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      +      },
      +      "plannedUntil": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      +      },
      +      "steps": {
      +        "description": "The block's microtask steps, in order — REPLACES the whole list (send every step you want kept, not just new ones; an empty array clears them). A parked block has no occurrence, so steps here are template-only — there is nothing to tick off until it is scheduled onto the dial.",
      +        "items": {
      +          "maxLength": 200,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "id": {
      +        "description": "The parked block id to delete from the inbox.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "remove",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "date": {
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "The parked block id to place on the dial.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "schedule",
      +        "type": "string"
      +      },
      +      "recurrence": {
      +        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      +        "type": "string"
      +      },
      +      "start": {
      +        "description": "Start time HH:MM; duration comes from the block.",
      +        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id",
      +      "date",
      +      "start"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "eventId": {
      +        "description": "The dial event id to move to the inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "park",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "eventId"
      +    ],
      +    "type": "object"
      +  }
      +]
  6. Changed1 schema field changed
    • changedInput schema / properties / ops / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id (case/accent-insensitive).",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "capture",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "activityTypeId": {
      -        "type": "string"
      -      },
      -      "activityTypeName": {
      -        "description": "Activity type by name instead of id.",
      -        "type": "string"
      -      },
      -      "areaId": {
      -        "type": "string"
      -      },
      -      "areaName": {
      -        "description": "Area by name instead of id.",
      -        "type": "string"
      -      },
      -      "durationHours": {
      -        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 24,
      -        "type": "number"
      -      },
      -      "id": {
      -        "description": "The parked block id (from get_schedule's `backlog`).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "notes": {
      -        "maxLength": 2000,
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "update",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "id": {
      -        "description": "The parked block id to delete from the inbox.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "remove",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "date": {
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "The parked block id to place on the dial.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "schedule",
      -        "type": "string"
      -      },
      -      "recurrence": {
      -        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      -        "type": "string"
      -      },
      -      "start": {
      -        "description": "Start time HH:MM; duration comes from the block.",
      -        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "id",
      -      "date",
      -      "start"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "eventId": {
      -        "description": "The dial event id to move to the inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "park",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "eventId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id (case/accent-insensitive).",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "capture",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "description": "The day this intention is planned for (still untimed — placing it on the dial is a separate `schedule`). Groups it under that day in the tray.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "plannedUntil": {
      +        "description": "Optional inclusive window end after plannedDate — a flexible \"sometime in this range\" window.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "activityTypeId": {
      +        "type": "string"
      +      },
      +      "activityTypeName": {
      +        "description": "Activity type by name instead of id.",
      +        "type": "string"
      +      },
      +      "areaId": {
      +        "type": "string"
      +      },
      +      "areaName": {
      +        "description": "Area by name instead of id.",
      +        "type": "string"
      +      },
      +      "durationHours": {
      +        "description": "Estimated length in hours (e.g. 1.5). Sizes the block when placed.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 24,
      +        "type": "number"
      +      },
      +      "id": {
      +        "description": "The parked block id (from get_schedule's `backlog`).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "notes": {
      +        "maxLength": 2000,
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "update",
      +        "type": "string"
      +      },
      +      "plannedDate": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set/move the block's planned day; null clears it back to Someday (also clears any window end). Refused on a task-app-linked block — its date is owned by the provider (change it there)."
      +      },
      +      "plannedUntil": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Set the inclusive window end (must fall after the planned day); null collapses the window to the single day."
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "id": {
      +        "description": "The parked block id to delete from the inbox.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "remove",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "date": {
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "The parked block id to place on the dial.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "schedule",
      +        "type": "string"
      +      },
      +      "recurrence": {
      +        "description": "Optionally make the placed block repeat: a preset (daily, weekdays, weekly, biweekly, monthly, yearly) or a raw RRULE (e.g. \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"). Omit for a one-off.",
      +        "type": "string"
      +      },
      +      "start": {
      +        "description": "Start time HH:MM; duration comes from the block.",
      +        "pattern": "^([01]?\\d|2[0-3]):[0-5]\\d$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "id",
      +      "date",
      +      "start"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "eventId": {
      +        "description": "The dial event id to move to the inbox (from get_schedule/find_event). Must be a native or owned-calendar one-off that hasn't been reviewed.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "park",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "eventId"
      +    ],
      +    "type": "object"
      +  }
      +]
  7. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations (readOnlyHint=false, destructiveHint=true). It discloses atomicity ('atomic by default... pass partial: true for best-effort'), undo behavior ('Every call that writes returns one undoToken + expiresAt'), refusal conditions for park, calendar-linked behavior ('removes its calendar copy but remembers the calendar'), and the Reassign Pro requirement. This is rich behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: it front-loads the core purpose, then explains ops in order, then covers edge cases and requirements. Every sentence carries information, though the length is substantial. It earns a 4 rather than 5 because the density could be slightly overwhelming, but it is structured logically and avoids fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex multi-op write tool with no output schema, the description covers the essential context: what each op does, when it fails, what results look like ('created/updated objects and deletedIds'), undo support, and licensing. An agent has enough to call this tool correctly across all five ops.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, and the description compensates by explaining the ops array structure, the meaning of each op, and key fields like plannedDate, plannedUntil, enrich, and recurrence. It doesn't restate every schema field, but it adds semantic context (e.g., 'plannedDate: null moves it back to Someday', 'schedule and park are inverses') that helps an agent use the parameters correctly. A small deduction because some field-level details are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource ('Write to the Inbox') and immediately distinguishes this tool from the read path (get_schedule). It enumerates the five ops (capture, update, remove, schedule, park) with precise semantics, so an agent can tell exactly what this tool does and how it differs from siblings like schedule, write_events, and delete_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool vs alternatives: 'To READ Inbox blocks, use get_schedule... THIS tool is the write surface.' It also gives per-op conditions (e.g., 'park only works on a native or owned-calendar one-off that hasn't been reviewed', 'enrich: true ... never for a name the user chose'). This is strong routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.