Skip to main content
Glama

Manage workflows

workflows_manage
Destructive

Automations. create (a trigger and steps; active by default and then acts by itself, so confirm), update (isActive false pauses), delete (confirm first).

Input Schema

NameRequiredDescriptionDefault
idNoRequired for: update, delete.
nameNoRequired for: create; optional for: update.
stepsNoRequired for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } ("cf." prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id; set_status { status } (name; "none" clears);delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is.
actionYes
isActiveNoUsed by: create, update. Default true.
conditionNoUsed by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. last_contacted_at older_than_days includes never-contacted contacts.
descriptionNoUsed by: create, update.
triggerTypeNoRequired for: create; optional for: update.
triggerEventNoUsed by: create, update. Event name, or inbound webhook id.
triggerConfigNoUsed by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500); without, once with no contact.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / condition / description
      Previous value: -"Used by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."New value: +"Used by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. last_contacted_at older_than_days includes never-contacted contacts."
  2. Changed1 schema field changed
    • changedInput schema / properties / steps / description
      Previous value: -"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id;delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is."New value: +"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id; set_status { status } (name; \"none\" clears);delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is."
  3. Changed3 schema fields changed
    • changedInput schema / properties / condition / description
      Previous value: -"Used by: create, update. Skip the run (status skipped) unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."New value: +"Used by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."
    • changedInput schema / properties / steps / description
      Previous value: -"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending campaigns only); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); delay { delay_seconds, stop_if?: { reply?, meeting?, optout? } } (stop_if ends the run if the contact did that during the wait; top-level waits over 60s); branch { condition, then: [steps], else: [steps] }. Record-targeting steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}}; give steps an explicit id to keep those references stable. On 400 INVALID_WORKFLOW, fix what the message lists rather than retrying."New value: +"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id;delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is."
    • changedInput schema / properties / triggerConfig / description
      Previous value: -"Used by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500, else the fire fails); without, once with no contact."New value: +"Used by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500); without, once with no contact."
  4. Changed9 schema fields changed
    • changedInput schema / properties / condition / description
      Previous value: -"Skip the run (status skipped) unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."New value: +"Used by: create, update. Skip the run (status skipped) unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."
    • addedInput schema / properties / description / description
      Added value: +"Used by: create, update."
    • addedInput schema / properties / id / description
      Added value: +"Required for: update, delete."
    • changedInput schema / properties / isActive / description
      Previous value: -"Default true."New value: +"Used by: create, update. Default true."
    • addedInput schema / properties / name / description
      Added value: +"Required for: create; optional for: update."
    • changedInput schema / properties / steps / description
      Previous value: -"Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending campaigns only); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); delay { delay_seconds, stop_if?: { reply?, meeting?, optout? } } (stop_if ends the run if the contact did that during the wait; top-level waits over 60s); branch { condition, then: [steps], else: [steps] }. Record-targeting steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}}; give steps an explicit id to keep those references stable. On 400 INVALID_WORKFLOW, fix what the message lists rather than retrying."New value: +"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending campaigns only); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); delay { delay_seconds, stop_if?: { reply?, meeting?, optout? } } (stop_if ends the run if the contact did that during the wait; top-level waits over 60s); branch { condition, then: [steps], else: [steps] }. Record-targeting steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}}; give steps an explicit id to keep those references stable. On 400 INVALID_WORKFLOW, fix what the message lists rather than retrying."
    • changedInput schema / properties / triggerConfig / description
      Previous value: -"Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500, else the fire fails); without, once with no contact."New value: +"Used by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500, else the fire fails); without, once with no contact."
    • changedInput schema / properties / triggerEvent / description
      Previous value: -"Event name, or inbound webhook id."New value: +"Used by: create, update. Event name, or inbound webhook id."
    • addedInput schema / properties / triggerType / description
      Added value: +"Required for: create; optional for: update."
  5. Added

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already flag destructive/openWorld/non-idempotent, and the description adds real behavioral context beyond them: a created workflow is active by default and 'acts by itself', so confirmation is warranted, and isActive=false pauses rather than deletes. It stops short of covering what update does to omitted fields or how deletion affects run history.

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?

Extremely compact and front-loaded with the action list; every clause carries information (default active state, pause semantics, confirmation prompts). The telegraphic, fragment-heavy style and the bare 'Automations.' opener cost a point on readability.

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

Completeness3/5

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

For a 10-parameter, nested-object mutation tool with no output schema, the description could have said what create returns (e.g. the new workflow id) and how update handles partial payloads. It is rescued by a very rich input schema, but the return/partial-update story is left to inference.

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 coverage is 90% and the steps/condition/triggerConfig properties are documented in exhaustive detail in the schema itself. The description only echoes 'a trigger and steps' and the isActive pause semantics, adding little parameter-level meaning beyond the schema. Baseline 3 applies.

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 description combines the resource ('Automations'/workflows) with the three specific operations (create, update, delete), so an agent can tell it apart from workflows_list and workflows_run_now. The opening noun 'Automations.' is jargon-ish rather than a verb+scope statement, and no sibling is named explicitly, which keeps it below a 5.

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

Usage Guidelines3/5

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

It gives conditional guidance within the lifecycle ('delete (confirm first)', 'isActive false pauses'), which is genuinely useful. However, it never states when to reach for this tool over workflows_list or workflows_run_now, so the use-vs-alternative dimension is only implied.

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