Skip to main content
Glama

put_proposal

Replace the pending set of suggested changes. This is the ONLY write the scheduled run should make — nothing here reaches the list until the user reviews and accepts it. Replaces any previous proposal wholesale, so include everything still worth suggesting, up to 100 deltas.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
agentNoYour name as the user knows you — "Claude" — shown as the review headline ("Claude suggests some changes") and in the notification. Just the name: no model version, no "AI". Omit it and the screen says "Your AI agent".
deltasYesThe proposed changes — add, complete, remove or update, plus the rule kinds. At most 100: send the ones that matter most and let the rest wait for the next run, because a review too long to finish gets dismissed whole. An empty array clears the proposal. Prefer complete over remove for anything that actually got done.
summaryNoOne line on what this pass looked at.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / deltas / items / oneOf
      Previous value: -[
      -  {
      -    "description": "Suggest a new item the user does not have yet.",
      -    "properties": {
      -      "item": {
      -        "properties": {
      -          "channel": {
      -            "default": "self",
      -            "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      -            "enum": [
      -              "self",
      -              "teams",
      -              "email",
      -              "meeting",
      -              "other"
      -            ],
      -            "type": "string"
      -          },
      -          "due": {
      -            "description": "YYYY-MM-DD. Anything dated today or earlier surfaces in the Today section, so only set this when there is a real deadline — a speculative date drags it to the top.",
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          "initiated": {
      -            "description": "Only two values, and only for AI adds. \"human\" = the user asked for this item in conversation just now — any user, whoever is talking to the MCP server, not one specific person. \"auto\" = the AI added it on its own initiative, with no direct instruction. Absent on items the user typed into the app themselves.",
      -            "enum": [
      -              "human",
      -              "auto"
      -            ],
      -            "type": "string"
      -          },
      -          "links": {
      -            "default": [],
      -            "description": "Up to 3 named links — the thread, the document, the ticket. Prefer these over pasting a URL into the note: they render as buttons rather than as a wall of text.",
      -            "items": {
      -              "properties": {
      -                "label": {
      -                  "description": "What to call it — \"the Teams thread\", \"the signed contract\". Never the raw URL.",
      -                  "maxLength": 80,
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "url": {
      -                  "description": "The full URL, http or https only. Up to 1000 characters.",
      -                  "format": "uri",
      -                  "maxLength": 1000,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "label",
      -                "url"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 3,
      -            "type": "array"
      -          },
      -          "note": {
      -            "description": "Optional detail or context, markdown. Leave empty unless it genuinely adds something. Up to 2000 characters — a paragraph or two, not a transcript.",
      -            "maxLength": 2000,
      -            "type": "string"
      -          },
      -          "priority": {
      -            "default": "medium",
      -            "description": "How much this matters: low, medium or high. Defaults to medium — most things are medium, so use high only when someone is blocked or a real deadline is close, and low for things that genuinely can wait. Marking everything high makes the list useless.",
      -            "enum": [
      -              "low",
      -              "medium",
      -              "high"
      -            ],
      -            "type": "string"
      -          },
      -          "section": {
      -            "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      -            "enum": [
      -              "action",
      -              "waiting",
      -              "note"
      -            ],
      -            "type": "string"
      -          },
      -          "source": {
      -            "description": "Who it involves or where it came from — \"Dana\", \"You → Dana\", \"Tuesday's standup\". Free text: sometimes a person, sometimes an occasion.",
      -            "maxLength": 200,
      -            "type": "string"
      -          },
      -          "source_id": {
      -            "description": "The stable id of whatever this came from — a Teams message id, an Outlook internetMessageId, a calendar event id. Set it whenever you have one. It is how the app recognises the same thing again after you have reworded the title, which you are otherwise told to do.",
      -            "maxLength": 500,
      -            "type": "string"
      -          },
      -          "status": {
      -            "description": "open or done. Leave it out for anything the user still has to act on — which is almost always. Send \"done\" only when adding something that ALREADY happened and is worth keeping as a record.",
      -            "enum": [
      -              "open",
      -              "done"
      -            ],
      -            "type": "string"
      -          },
      -          "title": {
      -            "description": "The thing to do, phrased as an action the user can act on. Prefer \"Reply to Dana about the audit dates\" over \"Dana email\". Keep it to one line — 200 characters at most, and anything approaching that belongs in the note instead.",
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "title",
      -          "section"
      -        ],
      -        "type": "object"
      -      },
      -      "kind": {
      -        "const": "add",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "item"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Suggest an item is already DONE — the meeting happened, the reply was sent. This is almost always what you want when something looks finished. It keeps the record that he completed it; use remove only when the item should never have been there.",
      -    "properties": {
      -      "item_id": {
      -        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      -        "format": "uuid",
      -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "complete",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "item_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Suggest an item should be cleared without being done — a duplicate, or something that stopped being relevant. If it was actually finished, use complete instead.",
      -    "properties": {
      -      "item_id": {
      -        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      -        "format": "uuid",
      -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "remove",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "item_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Suggest changing fields on an existing item — a slipped due date, a better title. Include only the fields that change; anything omitted is left alone.",
      -    "properties": {
      -      "item_id": {
      -        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      -        "format": "uuid",
      -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "update",
      -        "type": "string"
      -      },
      -      "patch": {
      -        "properties": {
      -          "channel": {
      -            "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      -            "enum": [
      -              "self",
      -              "teams",
      -              "email",
      -              "meeting",
      -              "other"
      -            ],
      -            "type": "string"
      -          },
      -          "due": {
      -            "anyOf": [
      -              {
      -                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "YYYY-MM-DD. Anything dated today or earlier surfaces at the top, so only set this when there is a real deadline — a speculative date drags it up. Omit to leave the due date alone; null clears it."
      -          },
      -          "links": {
      -            "description": "Up to 3 named links — the thread, the document, the ticket. PUT URLS HERE, never pasted into the note: they render as buttons rather than a wall of text. Replaces the whole list, so include any existing links you want to keep. Omit to leave them alone.",
      -            "items": {
      -              "properties": {
      -                "label": {
      -                  "description": "What to call it — \"the Teams thread\", \"the signed contract\". Never the raw URL.",
      -                  "maxLength": 80,
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "url": {
      -                  "description": "The full URL, http or https only. Up to 1000 characters.",
      -                  "format": "uri",
      -                  "maxLength": 1000,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "label",
      -                "url"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 3,
      -            "type": "array"
      -          },
      -          "note": {
      -            "anyOf": [
      -              {
      -                "maxLength": 2000,
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "Optional detail or context, markdown. Prose only — a URL belongs in `links`, not here. Up to 2000 characters. Omit to leave the note alone; null clears it."
      -          },
      -          "priority": {
      -            "description": "How much this matters: low, medium or high. Use high only when someone is blocked or a real deadline is close, and low for things that genuinely can wait. Marking everything high makes the list useless. Omit to leave the current priority alone.",
      -            "enum": [
      -              "low",
      -              "medium",
      -              "high"
      -            ],
      -            "type": "string"
      -          },
      -          "section": {
      -            "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      -            "enum": [
      -              "action",
      -              "waiting",
      -              "note"
      -            ],
      -            "type": "string"
      -          },
      -          "source": {
      -            "anyOf": [
      -              {
      -                "maxLength": 200,
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "Who it involves or where it came from — \"Dana\", \"You → Dana\", \"Tuesday's standup\". Omit to leave it alone; null clears it."
      -          },
      -          "title": {
      -            "description": "The thing to do, phrased as an action the user can act on. Prefer \"Reply to Dana about the audit dates\" over \"Dana email\". Keep it to one line — 200 characters at most, and anything approaching that belongs in the note instead.",
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "item_id",
      -      "patch"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Suggest a standing rule, mined from a pattern in the rejections list. Only when 3 or more rejections share a trait and no active rule already covers it — one rejection is never a pattern. Never auto-applied: it does nothing until the user accepts it.",
      -    "properties": {
      -      "kind": {
      -        "const": "add_rule",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "rule": {
      -        "properties": {
      -          "action": {
      -            "enum": [
      -              "exclude",
      -              "recategorize",
      -              "always_keep",
      -              "boost"
      -            ],
      -            "type": "string"
      -          },
      -          "match": {
      -            "properties": {
      -              "conditions": {
      -                "items": {
      -                  "properties": {
      -                    "field": {
      -                      "enum": [
      -                        "section",
      -                        "channel",
      -                        "source",
      -                        "title",
      -                        "priority",
      -                        "due_relative"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "op": {
      -                      "enum": [
      -                        "equals",
      -                        "not_equals",
      -                        "contains"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "value": {
      -                      "items": {
      -                        "maxLength": 200,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 20,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    }
      -                  },
      -                  "required": [
      -                    "field",
      -                    "op",
      -                    "value"
      -                  ],
      -                  "type": "object"
      -                },
      -                "maxItems": 10,
      -                "minItems": 1,
      -                "type": "array"
      -              },
      -              "op": {
      -                "default": "all",
      -                "enum": [
      -                  "all",
      -                  "any"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "conditions"
      -            ],
      -            "type": "object"
      -          },
      -          "origin": {
      -            "properties": {
      -              "count": {
      -                "default": 0,
      -                "maximum": 9007199254740991,
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "from": {
      -                "enum": [
      -                  "rejections",
      -                  "manual"
      -                ],
      -                "type": "string"
      -              },
      -              "rejection_ids": {
      -                "default": [],
      -                "items": {
      -                  "type": "string"
      -                },
      -                "maxItems": 50,
      -                "type": "array"
      -              }
      -            },
      -            "required": [
      -              "from"
      -            ],
      -            "type": "object"
      -          },
      -          "params": {
      -            "default": {},
      -            "properties": {
      -              "channel": {
      -                "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      -                "enum": [
      -                  "self",
      -                  "teams",
      -                  "email",
      -                  "meeting",
      -                  "other"
      -                ],
      -                "type": "string"
      -              },
      -              "priority": {
      -                "enum": [
      -                  "low",
      -                  "medium",
      -                  "high"
      -                ],
      -                "type": "string"
      -              },
      -              "section": {
      -                "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      -                "enum": [
      -                  "action",
      -                  "waiting",
      -                  "note"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "reason": {
      -            "description": "Why this rule exists, in the user's terms. Shown next to it on the rules page.",
      -            "maxLength": 300,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "status": {
      -            "enum": [
      -              "active",
      -              "paused"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "action",
      -          "match",
      -          "reason",
      -          "origin"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Suggest changing an existing rule — usually to narrow one that is too broad.",
      -    "properties": {
      -      "kind": {
      -        "const": "update_rule",
      -        "type": "string"
      -      },
      -      "patch": {
      -        "properties": {
      -          "action": {
      -            "enum": [
      -              "exclude",
      -              "recategorize",
      -              "always_keep",
      -              "boost"
      -            ],
      -            "type": "string"
      -          },
      -          "match": {
      -            "properties": {
      -              "conditions": {
      -                "items": {
      -                  "properties": {
      -                    "field": {
      -                      "enum": [
      -                        "section",
      -                        "channel",
      -                        "source",
      -                        "title",
      -                        "priority",
      -                        "due_relative"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "op": {
      -                      "enum": [
      -                        "equals",
      -                        "not_equals",
      -                        "contains"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "value": {
      -                      "items": {
      -                        "maxLength": 200,
      -                        "type": "string"
      -                      },
      -                      "maxItems": 20,
      -                      "minItems": 1,
      -                      "type": "array"
      -                    }
      -                  },
      -                  "required": [
      -                    "field",
      -                    "op",
      -                    "value"
      -                  ],
      -                  "type": "object"
      -                },
      -                "maxItems": 10,
      -                "minItems": 1,
      -                "type": "array"
      -              },
      -              "op": {
      -                "default": "all",
      -                "enum": [
      -                  "all",
      -                  "any"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "conditions"
      -            ],
      -            "type": "object"
      -          },
      -          "params": {
      -            "properties": {
      -              "channel": {
      -                "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      -                "enum": [
      -                  "self",
      -                  "teams",
      -                  "email",
      -                  "meeting",
      -                  "other"
      -                ],
      -                "type": "string"
      -              },
      -              "priority": {
      -                "enum": [
      -                  "low",
      -                  "medium",
      -                  "high"
      -                ],
      -                "type": "string"
      -              },
      -              "section": {
      -                "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      -                "enum": [
      -                  "action",
      -                  "waiting",
      -                  "note"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "reason": {
      -            "description": "Why this rule exists, in the user's terms. Shown next to it on the rules page.",
      -            "maxLength": 300,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "status": {
      -            "enum": [
      -              "active",
      -              "paused"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "rule_id": {
      -        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      -        "format": "uuid",
      -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rule_id",
      -      "patch"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Suggest deleting a rule outright.",
      -    "properties": {
      -      "kind": {
      -        "const": "remove_rule",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "rule_id": {
      -        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      -        "format": "uuid",
      -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rule_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Suggest pausing a rule, leaving it in the list so it can be resumed.",
      -    "properties": {
      -      "kind": {
      -        "const": "pause_rule",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "rule_id": {
      -        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      -        "format": "uuid",
      -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "rule_id"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "Suggest a new item the user does not have yet.",
      +    "properties": {
      +      "item": {
      +        "properties": {
      +          "channel": {
      +            "default": "self",
      +            "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      +            "enum": [
      +              "self",
      +              "teams",
      +              "email",
      +              "meeting",
      +              "other"
      +            ],
      +            "type": "string"
      +          },
      +          "due": {
      +            "description": "YYYY-MM-DD. Anything dated today or earlier surfaces in the Today section, so only set this when there is a real deadline — a speculative date drags it to the top.",
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          "flagged": {
      +            "description": "True marks this task as urgent — needing the user’s attention now. The user toggles it in the app, and the daily briefing offers it on critical findings. It changes no ordering and no due date: a flag is attention, not a deadline. Set it only when something genuinely cannot wait; flag everything and it means nothing. Absent means not flagged.",
      +            "type": "boolean"
      +          },
      +          "initiated": {
      +            "description": "Only two values, and only for AI adds. \"human\" = the user asked for this item in conversation just now — any user, whoever is talking to the MCP server, not one specific person. \"auto\" = the AI added it on its own initiative, with no direct instruction. Absent on items the user typed into the app themselves.",
      +            "enum": [
      +              "human",
      +              "auto"
      +            ],
      +            "type": "string"
      +          },
      +          "links": {
      +            "default": [],
      +            "description": "Up to 3 named links — the thread, the document, the ticket. Prefer these over pasting a URL into the note: they render as buttons rather than as a wall of text.",
      +            "items": {
      +              "properties": {
      +                "label": {
      +                  "description": "What to call it — \"the Teams thread\", \"the signed contract\". Never the raw URL.",
      +                  "maxLength": 80,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "url": {
      +                  "description": "The full URL, http or https only. Up to 1000 characters.",
      +                  "format": "uri",
      +                  "maxLength": 1000,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "label",
      +                "url"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 3,
      +            "type": "array"
      +          },
      +          "note": {
      +            "description": "Optional detail or context, markdown. Leave empty unless it genuinely adds something. Up to 2000 characters — a paragraph or two, not a transcript.",
      +            "maxLength": 2000,
      +            "type": "string"
      +          },
      +          "priority": {
      +            "default": "medium",
      +            "description": "How much this matters: low, medium or high. Defaults to medium — most things are medium, so use high only when someone is blocked or a real deadline is close, and low for things that genuinely can wait. Marking everything high makes the list useless.",
      +            "enum": [
      +              "low",
      +              "medium",
      +              "high"
      +            ],
      +            "type": "string"
      +          },
      +          "section": {
      +            "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      +            "enum": [
      +              "action",
      +              "waiting",
      +              "note"
      +            ],
      +            "type": "string"
      +          },
      +          "source": {
      +            "description": "Who it involves or where it came from — \"Dana\", \"You → Dana\", \"Tuesday's standup\". Free text: sometimes a person, sometimes an occasion.",
      +            "maxLength": 200,
      +            "type": "string"
      +          },
      +          "source_id": {
      +            "description": "The stable id of whatever this came from — a Teams message id, an Outlook internetMessageId, a calendar event id. Set it whenever you have one. It is how the app recognises the same thing again after you have reworded the title, which you are otherwise told to do.",
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "status": {
      +            "description": "open or done. Leave it out for anything the user still has to act on — which is almost always. Send \"done\" only when adding something that ALREADY happened and is worth keeping as a record.",
      +            "enum": [
      +              "open",
      +              "done"
      +            ],
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "The thing to do, phrased as an action the user can act on. Prefer \"Reply to Dana about the audit dates\" over \"Dana email\". Keep it to one line — 200 characters at most, and anything approaching that belongs in the note instead.",
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "title",
      +          "section"
      +        ],
      +        "type": "object"
      +      },
      +      "kind": {
      +        "const": "add",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "item"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Suggest an item is already DONE — the meeting happened, the reply was sent. This is almost always what you want when something looks finished. It keeps the record that he completed it; use remove only when the item should never have been there.",
      +    "properties": {
      +      "item_id": {
      +        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      +        "format": "uuid",
      +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "complete",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "item_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Suggest an item should be cleared without being done — a duplicate, or something that stopped being relevant. If it was actually finished, use complete instead.",
      +    "properties": {
      +      "item_id": {
      +        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      +        "format": "uuid",
      +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "remove",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "item_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Suggest changing fields on an existing item — a slipped due date, a better title. Include only the fields that change; anything omitted is left alone.",
      +    "properties": {
      +      "item_id": {
      +        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      +        "format": "uuid",
      +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "update",
      +        "type": "string"
      +      },
      +      "patch": {
      +        "properties": {
      +          "channel": {
      +            "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      +            "enum": [
      +              "self",
      +              "teams",
      +              "email",
      +              "meeting",
      +              "other"
      +            ],
      +            "type": "string"
      +          },
      +          "due": {
      +            "anyOf": [
      +              {
      +                "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "YYYY-MM-DD. Anything dated today or earlier surfaces at the top, so only set this when there is a real deadline — a speculative date drags it up. Omit to leave the due date alone; null clears it."
      +          },
      +          "flagged": {
      +            "description": "True marks this task as urgent — needing the user’s attention now; false clears the flag. It changes no ordering and no due date: a flag is attention, not a deadline. Set true only when something genuinely cannot wait. Omit to leave the flag alone.",
      +            "type": "boolean"
      +          },
      +          "links": {
      +            "description": "Up to 3 named links — the thread, the document, the ticket. PUT URLS HERE, never pasted into the note: they render as buttons rather than a wall of text. Replaces the whole list, so include any existing links you want to keep. Omit to leave them alone.",
      +            "items": {
      +              "properties": {
      +                "label": {
      +                  "description": "What to call it — \"the Teams thread\", \"the signed contract\". Never the raw URL.",
      +                  "maxLength": 80,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "url": {
      +                  "description": "The full URL, http or https only. Up to 1000 characters.",
      +                  "format": "uri",
      +                  "maxLength": 1000,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "label",
      +                "url"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 3,
      +            "type": "array"
      +          },
      +          "note": {
      +            "anyOf": [
      +              {
      +                "maxLength": 2000,
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Optional detail or context, markdown. Prose only — a URL belongs in `links`, not here. Up to 2000 characters. Omit to leave the note alone; null clears it."
      +          },
      +          "priority": {
      +            "description": "How much this matters: low, medium or high. Use high only when someone is blocked or a real deadline is close, and low for things that genuinely can wait. Marking everything high makes the list useless. Omit to leave the current priority alone.",
      +            "enum": [
      +              "low",
      +              "medium",
      +              "high"
      +            ],
      +            "type": "string"
      +          },
      +          "section": {
      +            "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      +            "enum": [
      +              "action",
      +              "waiting",
      +              "note"
      +            ],
      +            "type": "string"
      +          },
      +          "source": {
      +            "anyOf": [
      +              {
      +                "maxLength": 200,
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Who it involves or where it came from — \"Dana\", \"You → Dana\", \"Tuesday's standup\". Omit to leave it alone; null clears it."
      +          },
      +          "title": {
      +            "description": "The thing to do, phrased as an action the user can act on. Prefer \"Reply to Dana about the audit dates\" over \"Dana email\". Keep it to one line — 200 characters at most, and anything approaching that belongs in the note instead.",
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "item_id",
      +      "patch"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Suggest a standing rule, mined from a pattern in the rejections list. Only when 3 or more rejections share a trait and no active rule already covers it — one rejection is never a pattern. Never auto-applied: it does nothing until the user accepts it.",
      +    "properties": {
      +      "kind": {
      +        "const": "add_rule",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "rule": {
      +        "properties": {
      +          "action": {
      +            "enum": [
      +              "exclude",
      +              "recategorize",
      +              "always_keep",
      +              "boost"
      +            ],
      +            "type": "string"
      +          },
      +          "match": {
      +            "properties": {
      +              "conditions": {
      +                "items": {
      +                  "properties": {
      +                    "field": {
      +                      "enum": [
      +                        "section",
      +                        "channel",
      +                        "source",
      +                        "title",
      +                        "priority",
      +                        "due_relative"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "op": {
      +                      "enum": [
      +                        "equals",
      +                        "not_equals",
      +                        "contains"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "value": {
      +                      "items": {
      +                        "maxLength": 200,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 20,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    }
      +                  },
      +                  "required": [
      +                    "field",
      +                    "op",
      +                    "value"
      +                  ],
      +                  "type": "object"
      +                },
      +                "maxItems": 10,
      +                "minItems": 1,
      +                "type": "array"
      +              },
      +              "op": {
      +                "default": "all",
      +                "enum": [
      +                  "all",
      +                  "any"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "conditions"
      +            ],
      +            "type": "object"
      +          },
      +          "origin": {
      +            "properties": {
      +              "count": {
      +                "default": 0,
      +                "maximum": 9007199254740991,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "from": {
      +                "enum": [
      +                  "rejections",
      +                  "manual"
      +                ],
      +                "type": "string"
      +              },
      +              "rejection_ids": {
      +                "default": [],
      +                "items": {
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "from"
      +            ],
      +            "type": "object"
      +          },
      +          "params": {
      +            "default": {},
      +            "properties": {
      +              "channel": {
      +                "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      +                "enum": [
      +                  "self",
      +                  "teams",
      +                  "email",
      +                  "meeting",
      +                  "other"
      +                ],
      +                "type": "string"
      +              },
      +              "priority": {
      +                "enum": [
      +                  "low",
      +                  "medium",
      +                  "high"
      +                ],
      +                "type": "string"
      +              },
      +              "section": {
      +                "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      +                "enum": [
      +                  "action",
      +                  "waiting",
      +                  "note"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "reason": {
      +            "description": "Why this rule exists, in the user's terms. Shown next to it on the rules page.",
      +            "maxLength": 300,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "status": {
      +            "enum": [
      +              "active",
      +              "paused"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "action",
      +          "match",
      +          "reason",
      +          "origin"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Suggest changing an existing rule — usually to narrow one that is too broad.",
      +    "properties": {
      +      "kind": {
      +        "const": "update_rule",
      +        "type": "string"
      +      },
      +      "patch": {
      +        "properties": {
      +          "action": {
      +            "enum": [
      +              "exclude",
      +              "recategorize",
      +              "always_keep",
      +              "boost"
      +            ],
      +            "type": "string"
      +          },
      +          "match": {
      +            "properties": {
      +              "conditions": {
      +                "items": {
      +                  "properties": {
      +                    "field": {
      +                      "enum": [
      +                        "section",
      +                        "channel",
      +                        "source",
      +                        "title",
      +                        "priority",
      +                        "due_relative"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "op": {
      +                      "enum": [
      +                        "equals",
      +                        "not_equals",
      +                        "contains"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "value": {
      +                      "items": {
      +                        "maxLength": 200,
      +                        "type": "string"
      +                      },
      +                      "maxItems": 20,
      +                      "minItems": 1,
      +                      "type": "array"
      +                    }
      +                  },
      +                  "required": [
      +                    "field",
      +                    "op",
      +                    "value"
      +                  ],
      +                  "type": "object"
      +                },
      +                "maxItems": 10,
      +                "minItems": 1,
      +                "type": "array"
      +              },
      +              "op": {
      +                "default": "all",
      +                "enum": [
      +                  "all",
      +                  "any"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "conditions"
      +            ],
      +            "type": "object"
      +          },
      +          "params": {
      +            "properties": {
      +              "channel": {
      +                "description": "Where it came from, which is what makes an item legible days later. self = the user thought of it themselves, no external trigger. teams = a Teams message or chat. email = an email thread. meeting = raised in or arising from a meeting. other = anywhere else. Describe the ORIGIN, not who added it — an item you add from an email is still email.",
      +                "enum": [
      +                  "self",
      +                  "teams",
      +                  "email",
      +                  "meeting",
      +                  "other"
      +                ],
      +                "type": "string"
      +              },
      +              "priority": {
      +                "enum": [
      +                  "low",
      +                  "medium",
      +                  "high"
      +                ],
      +                "type": "string"
      +              },
      +              "section": {
      +                "description": "Which list it belongs in. action = something the user owes someone or themselves. waiting = something owed TO them; they are blocked and the next move is not theirs. note = worth knowing, no action attached. Pick waiting over action whenever the ball is in someone else's court — the distinction is the whole point of the two lists.",
      +                "enum": [
      +                  "action",
      +                  "waiting",
      +                  "note"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "reason": {
      +            "description": "Why this rule exists, in the user's terms. Shown next to it on the rules page.",
      +            "maxLength": 300,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "status": {
      +            "enum": [
      +              "active",
      +              "paused"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "rule_id": {
      +        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      +        "format": "uuid",
      +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rule_id",
      +      "patch"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Suggest deleting a rule outright.",
      +    "properties": {
      +      "kind": {
      +        "const": "remove_rule",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "rule_id": {
      +        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      +        "format": "uuid",
      +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rule_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Suggest pausing a rule, leaving it in the list so it can be resumed.",
      +    "properties": {
      +      "kind": {
      +        "const": "pause_rule",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "Why you are suggesting this, in one line. Shown next to the row when he reviews it, so it is what he judges the suggestion on — \"She has asked twice and the second went unanswered\" beats \"found in email\".",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "rule_id": {
      +        "description": "The \"id\" of an existing item, exactly as returned by get_document.",
      +        "format": "uuid",
      +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "rule_id"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. First observed

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries full burden and satisfies it: it discloses that the tool 'Replaces any previous proposal wholesale,' that it is the only write for the scheduled run, and that changes are gated behind user review ('nothing here reaches the list until the user reviews and accepts it'). It also states the 100-delta limit, covering key behavioral constraints.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and every phrase adds value: the replacement behavior, the exclusive write context, the review gating, and the 100-delta limit. There is zero redundancy.

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?

Given the tool's complexity (multiple delta kinds, rules, parameters) and the absence of annotations or output schema, the description provides essential context: it orients the agent on when to use it, the wholesale replacement semantics, and the critical safety property that nothing reaches the list until user acceptance. The rich schema covers the remaining detail, so the description is complete enough for selection and invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema itself provides exhaustive descriptions for all parameters, including the delta kinds, field meanings, and constraints. The tool description adds only a brief contextual note about the 100-delta cap and wholesale replacement, which is already implied by the schema's description of deltas. Per the rubric, a baseline of 3 is appropriate when the schema does the heavy lifting.

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 uses a specific verb + resource: 'Replace the pending set of suggested changes.' It clearly distinguishes itself from sibling tools like add_item or complete_item by stating it is 'the ONLY write the scheduled run should make' and that it replaces the entire proposal wholesale, not just a single delta.

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 states when to use: 'This is the ONLY write the scheduled run should make.' It contrasts with alternatives by noting that 'nothing here reaches the list until the user reviews and accepts it,' implying this is for proposing changes rather than direct mutation. It also gives a practical limit: 'up to 100 deltas,' which guides how to prioritize.

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.

Resources