Skip to main content
Glama

agents_trigger_update

Update an existing AI agent trigger.

All parameters are optional — only provided fields will be updated.

Input Schema

NameRequiredDescriptionDefault
enabledNoEnable or disable this trigger. OMIT to leave the enabled flag unchanged.
agent_idYesID of the agent that owns this trigger
priorityNoTrigger priority — lower numbers run first
send_modeNoNew send mode override. OMIT to leave the send-mode unchanged.
conditionsNoNew trigger conditions (replaces existing). Same fields as trigger_create: keywords, keyword_match, channel_types, context_types, group_mode, channel_account_ids (only accounts THIS workspace answers), folder_ids, ai_tag_ids, ai_filter_ids, ai_filter_mode, ai_filters: [{id: 1}, {name: "...", description: "..."}] — shorthand: reference existing by id or create inline (calls Voyage embedding API). If a filter with the same name already exists, it is reused by id. contact_states, cooldown_seconds, max_runs_per_thread_per_hour, once_per_thread (true: completes once per conversation, then the next matching trigger answers there). template: the rule_based reply — a string, or a card object {text, attachments, buttons} whose buttons each carry exactly one of value|url|web_app; a card with buttons needs send_mode auto. handoff: {agent_id, task} — rule_based owner only. After the rule's message has gone out, that agent runs on the same thread as its own trigger would, with task as the handoff brief; task may use {channel_type} and {thread_id} only. The target must be an active agentic or claude_channels agent in this workspace. incoming_call (voice pickup): answer_delay_s, plus auto_join and chat_ids for GROUP calls — auto_join true|false decides whether the bot enters on its own or the call becomes a pending invite, and OMITTING the key defers to the channel setting (trigger-when-present, then channel, then approval; absent and false are different answers). chat_ids scopes to specific Telegram groups (any id spelling) and must not be combined with channels whose calls have no chat, which never satisfy it. Conditions are REPLACED, so dropping a key clears it. calendar_event: window_minutes_before (1-1440, required), channel_account_ids, keywords, prepare_meet_join. incoming_message: action "reply_text"|"join_voice" (join requires send_mode=auto), message_source "real"|"transcript"|"both". calendar_event: run_mode "text"|"voice" (voice requires send_mode=auto). Both: voice: {speak_first, vision_mode}
thread_idsNoRestrict this trigger to specific threads (chats) by their numeric thread IDs. When set, merged into conditions.thread_filter.thread_ids. If conditions is also provided, thread_ids is merged into it. Only for incoming_message and job_completed triggers.
trigger_idYesID of the trigger to update
in_workspaceNoRun this one call in this workspace id instead of the session's. Nothing is stored; other sessions are not affected.
trigger_typeNoNew trigger type. OMIT to keep the existing type unchanged.
target_sessionNoWhich Claude Code desktop session this trigger's runs go to (name / client id / session id from workspace.desktops). Only meaningful on a claude_channels agent. Pass "" to clear it and go back to deliver-only-when-one-desktop-is-connected. Stored as conditions.target_session.
blocked_sender_idsNoNever react to these senders/callers, by their channel-side id — a phone number, a WhatsApp JID, a Telegram user id, an email address. Explicit deny: it beats every allow-list, and it applies to ALL trigger types, including incoming_call, so it is how you stop an agent answering one nuisance caller without silencing it for everybody. Phone-shaped ids are matched by their digits, so '+998901234567', '998901234567' and '998901234567@s.whatsapp.net' are the same person. Empty list [] = unblock everyone (the allow-list, if any, is left alone). Maps to conditions.sender_filter.excluded_external_ids.
excluded_thread_idsNoExclude specific threads (chats) by their numeric thread IDs — the opposite of thread_ids. When set, the trigger NEVER fires for messages in these threads (explicit deny wins). Merged into conditions.thread_filter.excluded_thread_ids. Only for incoming_message and job_completed triggers.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / trigger_type / enum
      Previous value: -[
      -  "incoming_message",
      -  "incoming_call",
      -  "schedule",
      -  "webhook",
      -  "event",
      -  "blockchain_event",
      -  "job_completed",
      -  "calendar_event",
      -  "lead_captured",
      -  "task_assigned"
      -]New value: +[
      +  "incoming_message",
      +  "incoming_call",
      +  "schedule",
      +  "webhook",
      +  "event",
      +  "blockchain_event",
      +  "job_completed",
      +  "calendar_event",
      +  "lead_captured",
      +  "task_assigned",
      +  "job_continuation"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / trigger_type / enum
      Previous value: -[
      -  "incoming_message",
      -  "incoming_call",
      -  "schedule",
      -  "webhook",
      -  "event",
      -  "blockchain_event",
      -  "job_completed",
      -  "calendar_event",
      -  "lead_captured"
      -]New value: +[
      +  "incoming_message",
      +  "incoming_call",
      +  "schedule",
      +  "webhook",
      +  "event",
      +  "blockchain_event",
      +  "job_completed",
      +  "calendar_event",
      +  "lead_captured",
      +  "task_assigned"
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / conditions / description
      Previous value: -"New trigger conditions (replaces existing). Same fields as trigger_create:\nkeywords, keyword_match, channel_types, context_types, group_mode,\nchannel_account_ids, folder_ids, ai_tag_ids,\nai_filter_ids, ai_filter_mode,\nai_filters: [{id: 1}, {name: \"...\", description: \"...\"}] — shorthand: reference existing by id or create inline (calls Voyage embedding API). If a filter with the same name already exists, it is reused by id.\ncontact_states, cooldown_seconds, max_runs_per_thread_per_hour, once_per_thread (true: completes once per conversation, then the next matching trigger answers there).\ntemplate: the rule_based reply — a string, or a card object {text, attachments, buttons} whose buttons each carry exactly one of value|url|web_app; a card with buttons needs send_mode auto.\nhandoff: {agent_id, task} — rule_based owner only. After the rule's message has gone out, that agent runs on the same thread as its own trigger would, with task as the handoff brief; task may use {channel_type} and {thread_id} only. The target must be an active agentic or claude_channels agent in this workspace.\nincoming_call (voice pickup): answer_delay_s, plus auto_join and chat_ids for GROUP calls — auto_join true|false decides whether the bot enters on its own or the call becomes a pending invite, and OMITTING the key defers to the channel setting (trigger-when-present, then channel, then approval; absent and false are different answers). chat_ids scopes to specific Telegram groups (any id spelling) and must not be combined with channels whose calls have no chat, which never satisfy it. Conditions are REPLACED, so dropping a key clears it.\ncalendar_event: window_minutes_before (1-1440, required), channel_account_ids, keywords, prepare_meet_join.\nincoming_message: action \"reply_text\"|\"join_voice\" (join requires send_mode=auto), message_source \"real\"|\"transcript\"|\"both\".\ncalendar_event: run_mode \"text\"|\"voice\" (voice requires send_mode=auto).\nBoth: voice: {speak_first, vision_mode}"New value: +"New trigger conditions (replaces existing). Same fields as trigger_create:\nkeywords, keyword_match, channel_types, context_types, group_mode,\nchannel_account_ids (only accounts THIS workspace answers), folder_ids, ai_tag_ids,\nai_filter_ids, ai_filter_mode,\nai_filters: [{id: 1}, {name: \"...\", description: \"...\"}] — shorthand: reference existing by id or create inline (calls Voyage embedding API). If a filter with the same name already exists, it is reused by id.\ncontact_states, cooldown_seconds, max_runs_per_thread_per_hour, once_per_thread (true: completes once per conversation, then the next matching trigger answers there).\ntemplate: the rule_based reply — a string, or a card object {text, attachments, buttons} whose buttons each carry exactly one of value|url|web_app; a card with buttons needs send_mode auto.\nhandoff: {agent_id, task} — rule_based owner only. After the rule's message has gone out, that agent runs on the same thread as its own trigger would, with task as the handoff brief; task may use {channel_type} and {thread_id} only. The target must be an active agentic or claude_channels agent in this workspace.\nincoming_call (voice pickup): answer_delay_s, plus auto_join and chat_ids for GROUP calls — auto_join true|false decides whether the bot enters on its own or the call becomes a pending invite, and OMITTING the key defers to the channel setting (trigger-when-present, then channel, then approval; absent and false are different answers). chat_ids scopes to specific Telegram groups (any id spelling) and must not be combined with channels whose calls have no chat, which never satisfy it. Conditions are REPLACED, so dropping a key clears it.\ncalendar_event: window_minutes_before (1-1440, required), channel_account_ids, keywords, prepare_meet_join.\nincoming_message: action \"reply_text\"|\"join_voice\" (join requires send_mode=auto), message_source \"real\"|\"transcript\"|\"both\".\ncalendar_event: run_mode \"text\"|\"voice\" (voice requires send_mode=auto).\nBoth: voice: {speak_first, vision_mode}"
  4. Changed1 schema field changed
    • addedInput schema / properties / in_workspace
      Added value: +{
      +  "description": "Run this one call in this workspace id instead of the session's. Nothing is stored; other sessions are not affected.",
      +  "type": "integer"
      +}
  5. Added
  6. Removed
  7. Changed1 schema field changed
    • changedInput schema / properties / trigger_type / enum
      Previous value: -[
      -  "incoming_message",
      -  "incoming_call",
      -  "schedule",
      -  "webhook",
      -  "event",
      -  "blockchain_event",
      -  "job_completed",
      -  "calendar_event"
      -]New value: +[
      +  "incoming_message",
      +  "incoming_call",
      +  "schedule",
      +  "webhook",
      +  "event",
      +  "blockchain_event",
      +  "job_completed",
      +  "calendar_event",
      +  "lead_captured"
      +]
  8. Changed2 schema fields changed
    • addedInput schema / properties / excluded_thread_ids
      Added value: +{
      +  "description": "Exclude specific threads (chats) by their numeric thread IDs — the opposite of thread_ids. When set, the trigger NEVER fires for messages in these threads (explicit deny wins). Merged into conditions.thread_filter.excluded_thread_ids. Only for incoming_message and job_completed triggers.",
      +  "items": {
      +    "type": "integer"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / thread_ids / description
      Previous value: -"Restrict this trigger to specific threads (chats) by their numeric thread IDs. When set, merged into conditions.thread_filter.thread_ids. If conditions is also provided, thread_ids is merged into it."New value: +"Restrict this trigger to specific threads (chats) by their numeric thread IDs. When set, merged into conditions.thread_filter.thread_ids. If conditions is also provided, thread_ids is merged into it. Only for incoming_message and job_completed triggers."
  9. Changed1 schema field changed
    • changedInput schema / properties / trigger_type / enum
      Previous value: -[
      -  "incoming_message",
      -  "incoming_call",
      -  "voice_transcript",
      -  "schedule",
      -  "webhook",
      -  "event",
      -  "blockchain_event",
      -  "job_completed",
      -  "calendar_event"
      -]New value: +[
      +  "incoming_message",
      +  "incoming_call",
      +  "schedule",
      +  "webhook",
      +  "event",
      +  "blockchain_event",
      +  "job_completed",
      +  "calendar_event"
      +]
  10. Changed2 schema fields changed
    • changedInput schema / properties / conditions / description
      Previous value: -"New trigger conditions (replaces existing). Same fields as trigger_create:\nkeywords, keyword_match, channel_types, context_types, group_mode,\nchannel_account_ids, folder_ids, ai_tag_ids,\nai_filter_ids, ai_filter_mode,\nai_filters: [{id: 1}, {name: \"...\", description: \"...\"}] — shorthand: reference existing by id or create inline (calls Voyage embedding API). If a filter with the same name already exists, it is reused by id.\ncontact_states, cooldown_seconds, max_runs_per_thread_per_hour"New value: +"New trigger conditions (replaces existing). Same fields as trigger_create:\nkeywords, keyword_match, channel_types, context_types, group_mode,\nchannel_account_ids, folder_ids, ai_tag_ids,\nai_filter_ids, ai_filter_mode,\nai_filters: [{id: 1}, {name: \"...\", description: \"...\"}] — shorthand: reference existing by id or create inline (calls Voyage embedding API). If a filter with the same name already exists, it is reused by id.\ncontact_states, cooldown_seconds, max_runs_per_thread_per_hour.\ncalendar_event: window_minutes_before (1-1440, required), channel_account_ids, keywords, prepare_meet_join.\nGeneric (incoming_message + calendar_event): run_mode \"text\"|\"voice\" (voice requires send_mode=auto), voice: {speak_first, vision_mode}"
    • changedInput schema / properties / trigger_type / enum
      Previous value: -[
      -  "incoming_message",
      -  "incoming_call",
      -  "voice_transcript",
      -  "schedule",
      -  "webhook",
      -  "event",
      -  "blockchain_event",
      -  "job_completed"
      -]New value: +[
      +  "incoming_message",
      +  "incoming_call",
      +  "voice_transcript",
      +  "schedule",
      +  "webhook",
      +  "event",
      +  "blockchain_event",
      +  "job_completed",
      +  "calendar_event"
      +]
  11. First observed

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, but the description's central claim — 'All parameters are optional' — is factually wrong: trigger_id and agent_id are required, so an agent trusting it may omit the identifiers and fail. It also omits that `conditions` is replaced wholesale rather than merged, a significant behavioral trait the author knew about (it is in the schema) but did not surface here.

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?

Two short sentences, front-loaded with the purpose and followed by the update semantic. Tight and easy to scan, though the second sentence is actively wrong rather than wasteful.

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

Completeness2/5

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

For a 12-parameter mutation tool with a large nested `conditions` object, per-trigger-type sub-configs, and no output schema, the description says almost nothing — no mention of state replacement semantics, per-trigger-type constraints, or validation behavior. What it does say about optionality is incorrect, which is worse than silence.

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

Parameters2/5

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

Schema coverage is 100%, so the baseline would be 3, but the one parameter-related statement the description makes is misleading about optionality. It adds no meaning about nested `conditions` replacement, `thread_ids` merging, or `in_workspace` ephemerality beyond what the schema already spells out.

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?

States a specific verb and resource ('Update an existing AI agent trigger'), which cleanly distinguishes it from siblings agents_trigger_create and agents_trigger_delete implied by the name. It doesn't explicitly name those siblings, so the agent has to infer the boundary from the name alone.

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?

The second sentence implies the partial-update workflow ('only provided fields will be updated'), which is genuinely useful context for an updater. But there is no guidance on when to use this versus agents_update, agents_trigger_create, or agents_trigger_delete, and no prerequisites or warnings about the destructive-replace behavior of conditions.

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.