Skip to main content
Glama

Update Automation

update_automation
Destructive

Update an automation. Only provide fields that need to change.

Schedule field accepts the same 5 formats as create:

  • {type: "at", at: "<ISO 8601>"} - one-time execution

  • {type: "every", unit: "minutes"|"hours", n: } - recurring interval (min 30 min)

  • {type: "cron", expr: ""} - cron schedule (min 30 min between runs)

  • {type: "rrule", rrule: ""} - iCalendar rule (min 30 min between occurrences)

  • {type: "event", events: ["", ...]} - event-driven (triggers immediately on ANY of the listed events, up to 20). {type: "event", event: ""} is a legacy single-event alias, still accepted but not canonical. Optionally add {delaySeconds: <int 1..604800>} to defer the run until N seconds after the event fires (max 604800 = 7 days); omit for immediate. GitHub PR triggers may include {targetBranches: ["main", "release/*", ...]} with case-sensitive names or * wildcards. Optionally add {condition: "<natural language, up to 2000 chars>"} to run only for events that satisfy it; omit it to run on every event. conditionMode and conditionSchemaVersion are set by Modem.

Available events: github.pr.created, github.pr.merged, github.pr.dismissed, github.issue.closed, gitlab.mr.created, gitlab.mr.merged, gitlab.mr.closed, topic.created, topic.priority.high, stripe.customer.created, stripe.subscription.created, stripe.subscription.canceled, stripe.subscription.trial_ending, stripe.invoice.payment_failed, sentry.feedback.created, feedback.created, topic.group.added, topic.group.updated, conversation.activity

Send automationId and only the fields that change. The automation's dashboard page is https://app.modem.dev/<org-slug>/automations/<id>. Before your first call, read the skill: modem_skills({ name: "automations" }).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNo
promptNoNatural language instructions for what the task should do.
enabledNo
scheduleNoDefines when an automation should run.
timezoneNo
modelLevelNoPersisted model level for automation execution.
automationIdYes
capabilityModeNoCapability mode: "all" (all visible capabilities) or "custom" (only listed capabilities).
outputChannelsNoAllowed output channels and optional destination restrictions.
allowedCapabilitiesNoCapability keys to enable when capabilityMode is "custom". Providing this field implies custom mode when capabilityMode is omitted. An empty array means core-only.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / schedule / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "expr": {
      -        "description": "Standard cron expression string.",
      -        "minLength": 1,
      -        "title": "Cron Expression",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "cron",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "expr"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "rrule": {
      -        "description": "iCalendar recurrence rule (RFC 5545) string.",
      -        "minLength": 1,
      -        "title": "RRule",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "rrule",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "rrule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "at": {
      -        "description": "ISO 8601 timestamp for one-time execution.",
      -        "minLength": 1,
      -        "title": "At Time",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "at",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "n": {
      -        "description": "Number of time units between executions.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Interval",
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "every",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Time unit for interval scheduling.",
      -        "enum": [
      -          "minutes",
      -          "hours"
      -        ],
      -        "title": "Time Unit",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "unit",
      -      "n"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "channelIds": {
      -        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      -        "items": {
      -          "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"
      -        },
      -        "minItems": 1,
      -        "title": "Channel IDs",
      -        "type": "array"
      -      },
      -      "condition": {
      -        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event.",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "title": "Trigger Condition",
      -        "type": "string"
      -      },
      -      "conditionMode": {
      -        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      -        "enum": [
      -          "judge",
      -          "agent"
      -        ],
      -        "title": "Condition Mode",
      -        "type": "string"
      -      },
      -      "conditionSchemaVersion": {
      -        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Condition Schema Version",
      -        "type": "integer"
      -      },
      -      "delaySeconds": {
      -        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      -        "maximum": 604800,
      -        "minimum": 1,
      -        "title": "Delay (seconds)",
      -        "type": "integer"
      -      },
      -      "event": {
      -        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      -        "minLength": 1,
      -        "title": "Event Name (legacy single-event form)",
      -        "type": "string"
      -      },
      -      "events": {
      -        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "title": "Event Names",
      -        "type": "array"
      -      },
      -      "productIds": {
      -        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      -        "items": {
      -          "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"
      -        },
      -        "minItems": 1,
      -        "title": "Product IDs",
      -        "type": "array"
      -      },
      -      "targetBranches": {
      -        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      -        "items": {
      -          "minLength": 1,
      -          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Target Branches",
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "expr": {
      +        "description": "Standard cron expression string.",
      +        "minLength": 1,
      +        "title": "Cron Expression",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "cron",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "expr"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "rrule": {
      +        "description": "iCalendar recurrence rule (RFC 5545) string.",
      +        "minLength": 1,
      +        "title": "RRule",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "rrule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "rrule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "at": {
      +        "description": "ISO 8601 timestamp for one-time execution.",
      +        "minLength": 1,
      +        "title": "At Time",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "at",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "n": {
      +        "description": "Number of time units between executions.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Interval",
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "every",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Time unit for interval scheduling.",
      +        "enum": [
      +          "minutes",
      +          "hours"
      +        ],
      +        "title": "Time Unit",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "unit",
      +      "n"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "channelIds": {
      +        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      +        "items": {
      +          "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"
      +        },
      +        "minItems": 1,
      +        "title": "Channel IDs",
      +        "type": "array"
      +      },
      +      "condition": {
      +        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event. A condition also satisfies an event that requires a channel or product scope.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Condition",
      +        "type": "string"
      +      },
      +      "conditionMode": {
      +        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      +        "enum": [
      +          "judge",
      +          "agent"
      +        ],
      +        "title": "Condition Mode",
      +        "type": "string"
      +      },
      +      "conditionSchemaVersion": {
      +        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Condition Schema Version",
      +        "type": "integer"
      +      },
      +      "delaySeconds": {
      +        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      +        "maximum": 604800,
      +        "minimum": 1,
      +        "title": "Delay (seconds)",
      +        "type": "integer"
      +      },
      +      "event": {
      +        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      +        "minLength": 1,
      +        "title": "Event Name (legacy single-event form)",
      +        "type": "string"
      +      },
      +      "events": {
      +        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "title": "Event Names",
      +        "type": "array"
      +      },
      +      "productIds": {
      +        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      +        "items": {
      +          "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"
      +        },
      +        "minItems": 1,
      +        "title": "Product IDs",
      +        "type": "array"
      +      },
      +      "targetBranches": {
      +        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      +        "items": {
      +          "minLength": 1,
      +          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Target Branches",
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / schedule / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "expr": {
      -        "description": "Standard cron expression string.",
      -        "minLength": 1,
      -        "title": "Cron Expression",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "cron",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "expr"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "rrule": {
      -        "description": "iCalendar recurrence rule (RFC 5545) string.",
      -        "minLength": 1,
      -        "title": "RRule",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "rrule",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "rrule"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "at": {
      -        "description": "ISO 8601 timestamp for one-time execution.",
      -        "minLength": 1,
      -        "title": "At Time",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "at",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "n": {
      -        "description": "Number of time units between executions.",
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "title": "Interval",
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "every",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Time unit for interval scheduling.",
      -        "enum": [
      -          "minutes",
      -          "hours"
      -        ],
      -        "title": "Time Unit",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "unit",
      -      "n"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "channelIds": {
      -        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      -        "items": {
      -          "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"
      -        },
      -        "minItems": 1,
      -        "title": "Channel IDs",
      -        "type": "array"
      -      },
      -      "delaySeconds": {
      -        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      -        "maximum": 604800,
      -        "minimum": 1,
      -        "title": "Delay (seconds)",
      -        "type": "integer"
      -      },
      -      "event": {
      -        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      -        "minLength": 1,
      -        "title": "Event Name (legacy single-event form)",
      -        "type": "string"
      -      },
      -      "events": {
      -        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "title": "Event Names",
      -        "type": "array"
      -      },
      -      "productIds": {
      -        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      -        "items": {
      -          "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"
      -        },
      -        "minItems": 1,
      -        "title": "Product IDs",
      -        "type": "array"
      -      },
      -      "targetBranches": {
      -        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      -        "items": {
      -          "minLength": 1,
      -          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "title": "Target Branches",
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "expr": {
      +        "description": "Standard cron expression string.",
      +        "minLength": 1,
      +        "title": "Cron Expression",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "cron",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "expr"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "rrule": {
      +        "description": "iCalendar recurrence rule (RFC 5545) string.",
      +        "minLength": 1,
      +        "title": "RRule",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "rrule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "rrule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "at": {
      +        "description": "ISO 8601 timestamp for one-time execution.",
      +        "minLength": 1,
      +        "title": "At Time",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "at",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "n": {
      +        "description": "Number of time units between executions.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Interval",
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "every",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Time unit for interval scheduling.",
      +        "enum": [
      +          "minutes",
      +          "hours"
      +        ],
      +        "title": "Time Unit",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "unit",
      +      "n"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "channelIds": {
      +        "description": "Optional channel scope: message channel UUIDs this automation is limited to. Omit for all channels (global). Only valid when every selected event supports channel scoping (see EVENT_CHANNEL_SCOPING).",
      +        "items": {
      +          "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"
      +        },
      +        "minItems": 1,
      +        "title": "Channel IDs",
      +        "type": "array"
      +      },
      +      "condition": {
      +        "description": "Optional free-form natural-language condition (\"only run when …\"), up to 2000 characters, evaluated against each trigger event's payload; the automation runs only for events that satisfy it. Omit to run on every matching event.",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "title": "Trigger Condition",
      +        "type": "string"
      +      },
      +      "conditionMode": {
      +        "description": "Server-derived; ignored on input. judge = the condition is decided from the event payload before the run starts; agent = the agent decides it at the start of every run.",
      +        "enum": [
      +          "judge",
      +          "agent"
      +        ],
      +        "title": "Condition Mode",
      +        "type": "string"
      +      },
      +      "conditionSchemaVersion": {
      +        "description": "Server-derived; ignored on input. The version of the event field guide the condition was judged against; absent when it was not judged.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "title": "Condition Schema Version",
      +        "type": "integer"
      +      },
      +      "delaySeconds": {
      +        "description": "Optional delay, in seconds, before running the automation after its trigger event fires (e.g. 1800 = 30 minutes after the event). Omit for immediate execution. Maximum 604800 (7 days).",
      +        "maximum": 604800,
      +        "minimum": 1,
      +        "title": "Delay (seconds)",
      +        "type": "integer"
      +      },
      +      "event": {
      +        "description": "Legacy single-event trigger (e.g., github.pr.created). Still accepted on read/write for backwards compatibility; prefer `events` for new writes. When both are present, `events` is canonical.",
      +        "minLength": 1,
      +        "title": "Event Name (legacy single-event form)",
      +        "type": "string"
      +      },
      +      "events": {
      +        "description": "Trigger events for this automation (e.g., [\"github.pr.created\", \"github.pr.dismissed\"]). The automation fires once per matching event occurrence. Canonical form — prefer this over the legacy `event` field.",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "title": "Event Names",
      +        "type": "array"
      +      },
      +      "productIds": {
      +        "description": "Optional product scope: the products this automation is limited to. Omit for all products (global); an empty array is rejected so 'global' has one representation. Acts as a channel preset — at dispatch time the scoped products' currently linked message channels (product_channels) are resolved and the automation fires when the triggering event's channels intersect ANY of them. It additionally instructs the agent to scope the run's output to those products. May be combined with channelIds — both scopes must pass (AND semantics).",
      +        "items": {
      +          "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"
      +        },
      +        "minItems": 1,
      +        "title": "Product IDs",
      +        "type": "array"
      +      },
      +      "targetBranches": {
      +        "description": "Optional case-sensitive allowlist of GitHub PR base_ref branches. Names match exactly; * matches zero or more characters, including slashes. Only valid for GitHub PR triggers. Omit for all target branches; channel and product scopes must also pass. Nonmatching events are skipped before launching a workflow or agent.",
      +        "items": {
      +          "minLength": 1,
      +          "pattern": "^[^\\s\\p{Cc}~^:?[\\]\\\\]+$",
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "title": "Target Branches",
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Added

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false, so the safety profile is covered. The description adds genuinely useful context that this is a patch-style update (omitted fields presumably preserved) and that two fields are server-derived and ignored. However, it never explains what 'destructive' means here, whether omitted fields are cleared, or any auth/rate-limit constraints, so it adds only moderate value beyond annotations.

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?

Front-loaded with the core rule before the schedule details, and the bulleted format is scannable. It is long, but much of the length is justified by a genuinely complex oneOf schedule schema; some content (delaySeconds, targetBranches, legacy event alias) duplicates schema descriptions and could be trimmed.

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

Completeness4/5

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

For a 10-parameter mutation tool with no output schema, the description covers the complex schedule/event surface thoroughly and redirects the agent to the automations skill for the rest, which closes most gaps. It omits any description of the non-schedule fields' behavior and the mutation's effects, leaving some reliance on the skill.

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 coverage is 60%, and the description compensates substantially for the hardest parameter: it enumerates all five schedule formats, the 30-minute minimums, the max-20 events cap, the delaySeconds range, targetBranches wildcard semantics, and — critically — the full list of available event names, which the schema does not provide at all. The remaining simpler parameters (name, prompt, timezone, modelLevel, outputChannels) get no description-level treatment, but the schema documents most of them.

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

Purpose4/5

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

The first sentence states a specific verb and resource (update an automation) and adds the partial-update rule ('only provide fields that need to change'). Sibling tools create_automation/list_automations make the distinction self-evident, so no explicit differentiation is required. It is clear but not exceptional.

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

Usage Guidelines4/5

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

Provides concrete usage prerequisites: send automationId plus only changed fields, and read the automations skill before the first call. It also warns that conditionMode/conditionSchemaVersion are server-set and ignored on input. It stops short of stating when to prefer this over create_automation or what happens on a nonexistent id.

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