Workflows MCP tools
Use this reference to find a tool and its inputs. Connect an MCP client before calling tools. Tool visibility depends on discovery and permissions.
For actions that send messages, spend credits, delete data, or start execution, review the intended records and confirm the action before proceeding. Obtain IDs from a prior result; do not invent them. A registered tool does not guarantee that its supporting service is available in every organization.
g8_workflow_add_node
Add one node to an existing workflow’s graph. Fetches the current graph, appends the node (and optionally one edge), and PUTs the result. Errors if
node_idalready exists - useg8_workflow_update_nodefor that. Writes the node in canonical snake_case. Whenconnect_fromis set, appends the edge AND appendsnode_idto the source node’sconnectionslist (the executor traversesconnections, notedges, so an edge-only node never runs). Preferadd_node(..., connect_from=upstream)over a separateconnect_nodescall - same result, one fewer PUT. Args: action_id: Workflow id. node_id: New node’s id, unique within the graph. Convention:{node_type}-{8-hex}(e.g.send_email-2e3bb0d7). node_type: A value fromg8_workflow_list_node_types. config: Per-node config dict; shape varies by node_type (seeg8_workflow_describe_node_type). label: Optional display label. Defaults tonode_type. position: Optional{"x": float, "y": float}. Defaults to{"x": 0, "y": 0}. connect_from: Optional source node id. Adds edgeconnect_from -> node_idand appendsnode_idto that node’sconnections. Skip to wire up later viag8_workflow_connect_nodes.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
node_id | Yes | string | See the schema below for constraints and defaults. |
node_type | Yes | string | See the schema below for constraints and defaults. |
config | No | object / null | See the schema below for constraints and defaults. |
label | No | string / null | See the schema below for constraints and defaults. |
position | No | object / null | See the schema below for constraints and defaults. |
connect_from | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" }, "node_id": { "title": "Node Id", "type": "string" }, "node_type": { "title": "Node Type", "type": "string" }, "config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Config" }, "label": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Label" }, "position": { "anyOf": [ { "additionalProperties": { "type": "number" }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Position" }, "connect_from": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Connect From" } }, "required": [ "action_id", "node_id", "node_type" ], "title": "add_nodeArguments", "type": "object"}g8_workflow_connect_nodes
Add an edge connecting one node to another. DUAL write: appends to top-level
edgesAND appendstargetto the source node’sconnectionslist (the field the executor actually traverses; an edge without it renders but never executes). Idempotent on (source, target) when both are already present. For branch / decision nodes, passconditionto set the edge label, and useg8_workflow_update_nodeto set the source node’sconditional_connections({path_id: target_node_id}). Args: action_id: Workflow id. source: Upstream node id. target: Downstream node id. edge_id: Optional explicit edge id. Defaults to"edge-{source}-{target}". condition: Optional condition string for branch / decision nodes (e.g."true","false","matches_icp").
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
source | Yes | string | See the schema below for constraints and defaults. |
target | Yes | string | See the schema below for constraints and defaults. |
edge_id | No | string / null | See the schema below for constraints and defaults. |
condition | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" }, "source": { "title": "Source", "type": "string" }, "target": { "title": "Target", "type": "string" }, "edge_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Edge Id" }, "condition": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Condition" } }, "required": [ "action_id", "source", "target" ], "title": "connect_nodesArguments", "type": "object"}g8_workflow_create
Create a new workflow. Persists a real workflow row - ALWAYS confirm with the user first. Recommended pattern: run
g8_workflow_validate, then call withdry_run=Trueto render a confirmation widget, thendry_run=Falseafter the user confirms.configfollows the canonical snake_case shape. Each node MUST carry aconnectionslist (the executor traverses vianode.connections[0], NOT top-leveledges); a node with only an edge halts the executor. Branch / condition nodes also useconditional_connections({path_id: target_node_id}) to gate which downstream branch fires. Shape (per node):{node_id, node_type, name, config, position, connections: [...]}plus a top-level{metadata, settings, start_node_id, nodes: [...], edges: [...]}. Get the per-node-typeconfigfields fromg8_workflow_describe_node_type. Conventions:node_id={node_type}-{8-hex},edge.id=edge-{source}-{target}, cross-node refs =${node_id.field}, andinput_mappings=[{target_field, source_expression}].runtime_type='workflow'andorg_idare pinned server-side. Args: name: Workflow display name. config: The graph dict (nodes / edges / start_node_id / trigger). description: Optional human-readable summary. category: Optional grouping (e.g."sales"). enabled: DefaultFalseso a fresh workflow stays paused until the user enables it. SetTrueonly if already approved. dry_run: WhenTrue, return a confirmation preview without creating the workflow.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
config | Yes | object | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
category | No | string / null | See the schema below for constraints and defaults. |
enabled | No | boolean | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "config": { "additionalProperties": true, "title": "Config", "type": "object" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "category": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Category" }, "enabled": { "default": false, "title": "Enabled", "type": "boolean" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "name", "config" ], "title": "create_workflowArguments", "type": "object"}g8_workflow_create_workbench
Create an empty workbench and return its
workbench_id. Use when a workflow needs somewhere to write and the org has none, or the user asks for a NEW one. Checkg8_workflow_list_workbenchesfirst so you reuse an existing workbench instead of making a near-duplicate. Args: name: Display name. Required. entity_type:contactorcompany. Optional; a blank workbench may defer it. description: Optional free text. Returns{workbench_id, name, entity_type, description}. Feedworkbench_idstraight into the workbench node config.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
name | Yes | string | See the schema below for constraints and defaults. |
entity_type | No | string / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "name": { "title": "Name", "type": "string" }, "entity_type": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Entity Type" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" } }, "required": [ "name" ], "title": "create_workbenchArguments", "type": "object"}g8_workflow_delete
Delete a workflow permanently. One-way -
g8_workflow_get404s after. ALWAYS confirm with the user; calldry_run=Truefirst to render the confirmation widget. Args: action_id: Workflow id. dry_run: WhenTrue, return a confirmation preview without deleting.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "action_id" ], "title": "delete_workflowArguments", "type": "object"}g8_workflow_describe_form_fields
Discover the field names submitted to a form by sampling recent submissions. REQUIRED before authoring a
new_form_submittedtrigger node, otherwise the field picker is empty. Call right after the user names a form_id, then pass the returnedfieldslist asform_fieldson the trigger node config: g8_workflow_add_node(node_type=“trigger”, config={ “trigger_type”: “new_form_submitted”, “form_id”: “contact-us-form”, “form_fields”: [“email”, “name”, “title”, “message”], }) Downstream nodes reference values via${<trigger_node_id>.<field>}. Returns{form_id, fields: [str], sample_size: int}. An emptyfieldslist means no submissions exist yet - ask the user instead. Args: form_id: HTML form id (form_tag_id) - same value used asform_idon the trigger node config.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
form_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "form_id": { "title": "Form Id", "type": "string" } }, "required": [ "form_id" ], "title": "describe_form_fieldsArguments", "type": "object"}g8_workflow_describe_node_type
Get the config schema for a single node type. Cheaper than
g8_workflow_list_node_types(detail="full")when you already know the type - returns one entry, same payload shape. Args: node_type: A value fromg8_workflow_list_node_types(e.g."sequence_reply_trigger","llm_completion"). detail:"slim"or"full"(default"full").
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
node_type | Yes | string | See the schema below for constraints and defaults. |
detail | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "node_type": { "title": "Node Type", "type": "string" }, "detail": { "default": "full", "title": "Detail", "type": "string" } }, "required": [ "node_type" ], "title": "describe_node_typeArguments", "type": "object"}g8_workflow_execute
Trigger a workflow run. Runs for real - can spend credits, send messages, or call external APIs depending on the nodes. ALWAYS confirm with the user; call
dry_run=Truefirst for a confirmation widget, thendry_run=Falseafter the user confirms. Returns{execution_id, status: "queued" \| "running"}. Poll withg8_workflow_get_executionuntilcompletedorfailed. Args: action_id: Workflow id. input_data: Optional{key: value}dict - becomes{{trigger.key}}references inside the graph. Defaults to{}. triggered_by: Optional caller user_id (defaults to the API key’s user server-side). dry_run: WhenTrue, return a confirmation preview without firing the workflow.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
input_data | No | object / null | See the schema below for constraints and defaults. |
triggered_by | No | string / null | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" }, "input_data": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Input Data" }, "triggered_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Triggered By" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "action_id" ], "title": "execute_workflowArguments", "type": "object"}g8_workflow_get
Get the full graph for a workflow (nodes + edges + trigger). Shape:
{action_id, name, description, runtime_type, enabled, config: {metadata, settings, nodes: [...], edges: [...], start_node_id}, managed_by}. Call before any granular edit to get current node/edge ids. Each node uses canonical snake_case (flatnode_id/node_type/name/config/position); the granular helpers also read legacy ReactFlow-shape rows. Args: action_id: Workflow id fromg8_workflow_listor the URLapp.graph8.com/agents/workflows/{action_id}.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" } }, "required": [ "action_id" ], "title": "get_workflowArguments", "type": "object"}g8_workflow_get_execution
Get a workflow execution’s status / output / token cost. Polling pattern: call every few seconds after
g8_workflow_executeuntilstatusiscompletedorfailed. 404s for executions outside the caller’s org. Args: execution_id: Execution UUID returned byg8_workflow_execute.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
execution_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "execution_id": { "title": "Execution Id", "type": "string" } }, "required": [ "execution_id" ], "title": "get_executionArguments", "type": "object"}g8_workflow_get_trigger_status
Get the trigger status (cursor + config) for a workflow. Useful for debugging “why isn’t my workflow firing?” - surfaces whether a trigger is configured, its type, and the last cursor timestamp processed. Args: action_id: Workflow id.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" } }, "required": [ "action_id" ], "title": "get_trigger_statusArguments", "type": "object"}g8_workflow_list
List workflows owned by the caller’s organization. Returns
runtime_type='workflow'actions only. A row with a non-nullmanaged_by({kind: "work_routine", routine_id}) is the backing workflow of an event-triggered Work routine: read it freely, but change it from Agents > Routines, not here. Args: enabled:Truefor enabled only,Falsefor disabled. Omit to return both. category: Optional free-form category filter (e.g."sales"). is_template:Truereturns templates other orgs can fork. Omit for non-templates.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
enabled | No | boolean / null | See the schema below for constraints and defaults. |
category | No | string / null | See the schema below for constraints and defaults. |
is_template | No | boolean / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "enabled": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Enabled" }, "category": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Category" }, "is_template": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Is Template" } }, "title": "list_workflowsArguments", "type": "object"}g8_workflow_list_dispositions
List every valid call disposition - system values AND this organization’s own custom dispositions. The
valueof each entry is EXACTLY what goes intodisposition_filterson the new_call_disposition trigger. That is the ONLY trigger with a server-side disposition filter.new_call_endedcarries adispositionoutput field for downstream nodes but does NOT filter on it, andnew_voicemail_detectedhas no disposition field at all; settingdisposition_filterson either saves cleanly and is then silently ignored, so the workflow fires on every call. Returns{dispositions: [{value, label, category, origin, ...}], custom_count, source}: -originissystem(built-in vocabulary) orcustom(defined by this org). Custom entries also carrydescription,colorandis_connected. - A custom disposition’svalueis its storedcustom_{id}key - NEVER its display name. Filtering on the name silently never matches. -categoryissdr_selectable(a rep can pick it) orsystem_set(only the dialer backend writes it). -sourceisvoicenormally, orstatic_fallbackif the custom-disposition lookup was unavailable. Onstatic_fallback, say you could not confirm this org’s custom dispositions rather than claiming there are none. Matching is an EXACT, case-sensitive comparison against the stored key, and an empty filter fires for every disposition. Always resolve the user’s wording through this tool instead of guessing a key.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "list_dispositionsArguments", "type": "object"}g8_workflow_list_inbox_tags
List the org’s AI Inbox tags, so a human description becomes a tag ID. REQUIRED before authoring a new_inbox_tag_set trigger: its
tag_filterstakes tag IDs, not tag names, and there is no other way to discover them. Resolve phrasing like “out of office”, “interested”, “referred me to a colleague”, “unsubscribe request” to the matching tag’sidhere, then pass those ids: g8_workflow_add_node(node_type=“trigger”, config={ “trigger_type”: “new_inbox_tag_set”, “tag_filters”: [“<id from this tool>”, ”…”], “tag_source_filters”: [“ai”], })tag_source_filtersaccepts"ai"(the inbox AI agent applied the tag, normally within seconds of the email arriving) and"manual"(a human applied it). Omit it to fire on both. Prefer this over anew_email_replytrigger plus a condition node that greps the body text. The inbox AI agent has already classified the reply; re-deriving intent from raw text is fragile and fires late. Args: ai_applicable_only: WhenTrue, return only tags the AI agent is allowed to apply automatically (ai_can_apply). Those are the tags anew_inbox_tag_settrigger fires on with no human in the loop. Returns{tags: [{id, name, description, color, ai_can_apply}], total}. An empty list means the org has no inbox tags configured yet - tell the user to create them in Inbox -> Tags rather than inventing ids.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
ai_applicable_only | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "ai_applicable_only": { "default": false, "title": "Ai Applicable Only", "type": "boolean" } }, "title": "list_inbox_tagsArguments", "type": "object"}g8_workflow_list_linkedin_senders
List the org’s LinkedIn sender accounts (seats). Resolves the
sender_account_idonsend_netrion_connection_requestandsend_netrion_message, and thelinkedin_account_idcarried by thelinkedin_connection_accepted/linkedin_message_sent/linkedin_reply_receivedtriggers. USEsender_account_idVERBATIM: it is the numeric PK as a string. Do NOT passaccount_id(thelia_...form): the resolver cannot parse it, and these nodes run in strict mode, so naming it FAILS the send rather than falling back to another seat. Returns{senders: [{sender_account_id, account_id, display_name, public_identifier, status, account_tier}], total_count}. Seats that are notstatus='OK'are included WITH their status, so a disconnected seat can be reported as such instead of looking like no seats at all. An empty list means LinkedIn is not connected for this org.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "list_linkedin_sendersArguments", "type": "object"}g8_workflow_list_mcp_servers
List MCP servers connected to the org with their available tools. Use to fill the
toolnode config:mcp_server_idfromservers[].mcp_server_idandmcp_tool_namefrom the per-server tools list. Returns{servers: [...], total}.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "list_mcp_serversArguments", "type": "object"}g8_workflow_list_node_types
List every workflow node type with its config schema. Call this BEFORE building a workflow to learn the valid
typestrings and what each one’sconfigmust contain. Covers triggers, actions, and integrations. Action-vs-Agent node choice: for ANY one-shot natural-language step (summarize, generate, extract, classify, draft, parse) pick an Action node (llm_completion) bound to an LLM skill authored viag8_workflow_skill_create_llm; wire its{variable}placeholders to upstream nodes viainput_mappingsand read its output as{{<node_id>.result}}. Pick anagentnode ONLY for autonomous multi-turn tool use across turns. The catalog also includestrigger_output_schemas(the input_data each trigger run provides, for{{trigger.field}}refs),resolver_tool_hints(MCP tools that resolve opaque id fields), andexample_workflows(worked runnable graphs). Args: detail:"slim"(default) returns a compact[(field_name, type_str)]per node."full"returns the Pydantic JSON schema for every config field - use when slim is not enough.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
detail | No | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "detail": { "default": "slim", "title": "Detail", "type": "string" } }, "title": "list_node_typesArguments", "type": "object"}g8_workflow_list_roam_groups
List Roam groups connected to the org. Resolves a group description into the
address_idneeded forsend_roam_notification(mode=group, recipient_id=…). Returns{groups: [{address_id, name, group_type, access_mode}]}.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "list_roam_groupsArguments", "type": "object"}g8_workflow_list_roam_users
List Roam users connected to the org. Resolves a user description into the user_ids needed for
send_roam_notification(mode=dm, user_ids=[…]). Returns{users: [{id, name, email}]}.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "list_roam_usersArguments", "type": "object"}g8_workflow_list_slack_channels
List Slack channels in the connected workspace. Resolves a channel description into the Slack channel_id needed for
send_slack_notification(mode=channel, channel_id=…). Returns{channels: [{id, name, is_private, num_members}]}.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "list_slack_channelsArguments", "type": "object"}g8_workflow_list_slack_users
List Slack users in the connected workspace. Resolves a user description into the Slack user_id needed for
send_slack_notification(mode=dm, user_id=…). Returns{users: [{id, name, real_name, is_bot, deleted}]}.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
| None | No | — | No user-supplied inputs. |
Complete input schema
{ "properties": {}, "title": "list_slack_usersArguments", "type": "object"}g8_workflow_list_workbenches
List the org’s workbenches (staging tables). Resolves the
workbench_idrequired byadd_to_workbench,workbench_lookupandworkbench_pull_rows. It is the same id the Workbench page URL shows, so you and the user are naming the same thing. Returns{workbenches: [{workbench_id, name, entity_type, description, row_count, created_at}], total, page, limit}. An empty list means the org has none yet; create one withg8_workflow_create_workbench.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
limit | No | integer | See the schema below for constraints and defaults. |
page | No | integer | See the schema below for constraints and defaults. |
filter_name | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "limit": { "default": 50, "title": "Limit", "type": "integer" }, "page": { "default": 1, "title": "Page", "type": "integer" }, "filter_name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Filter Name" } }, "title": "list_workbenchesArguments", "type": "object"}g8_workflow_list_workflow_executions
List workflow executions for the caller’s org (recover a lost execution_id). Uses the current organization and existing API permissions. API: GET /workflows/executions
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | No | string / null | Filter to a single workflow’s executions. |
status_filter | No | string / null | Filter by execution status (equality match - one status per call). The backend writes seven values: pending|running|completed|failed|paused|pending_approval|stopped. The four terminal-or-early states are pending, running, completed, failed; paused and pending_approval are resumable, stopped is terminal. |
triggered_by | No | string / null | Filter by the identity that started the run (user email, agent id, ‘api’, …). |
limit | No | integer / null | Page size (1..200). |
offset | No | integer / null | Rows to skip for pagination. |
Complete input schema
{ "properties": { "action_id": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter to a single workflow's executions.", "title": "Action Id" }, "status_filter": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter by execution status (equality match - one status per call). The backend writes seven values: pending|running|completed|failed|paused|pending_approval|stopped. The four terminal-or-early states are pending, running, completed, failed; paused and pending_approval are resumable, stopped is terminal.", "title": "Status Filter" }, "triggered_by": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "description": "Filter by the identity that started the run (user email, agent id, 'api', ...).", "title": "Triggered By" }, "limit": { "anyOf": [ { "maximum": 200, "minimum": 1, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Page size (1..200).", "title": "Limit" }, "offset": { "anyOf": [ { "minimum": 0, "type": "integer" }, { "type": "null" } ], "default": null, "description": "Rows to skip for pagination.", "title": "Offset" } }, "title": "g8_workflow_list_workflow_executionsArguments", "type": "object"}g8_workflow_pause_execution
Pause a running workflow execution. Reversible - call
g8_workflow_resume_executionto flip back torunning. Idempotent: pausing an already-paused execution is a no-op. Args: execution_id: Execution UUID. reason: Optional short reason saved with the execution. message: Optional human-readable note.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
execution_id | Yes | string | See the schema below for constraints and defaults. |
reason | No | string / null | See the schema below for constraints and defaults. |
message | No | string / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "execution_id": { "title": "Execution Id", "type": "string" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reason" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Message" } }, "required": [ "execution_id" ], "title": "pause_executionArguments", "type": "object"}g8_workflow_plan_inline_workflow
Preview a normalized execution plan for an inline workflow graph. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /workflows/plan
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
body | Yes | object | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "body": { "additionalProperties": true, "title": "Body", "type": "object" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "body" ], "title": "g8_workflow_plan_inline_workflowArguments", "type": "object"}g8_workflow_plan_workflow
Preview a normalized execution plan for a saved workflow. Uses the current organization and existing API permissions. Review the intended change and set confirm=true to execute; otherwise no API request is sent. API: POST /workflows/{action_id}/plan
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | Workflow action_id. |
body | No | object / null | See the schema below for constraints and defaults. |
confirm | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "description": "Workflow action_id.", "minLength": 1, "title": "Action Id", "type": "string" }, "body": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Body" }, "confirm": { "default": false, "title": "Confirm", "type": "boolean" } }, "required": [ "action_id" ], "title": "g8_workflow_plan_workflowArguments", "type": "object"}g8_workflow_remove_node
Remove a node from a workflow’s graph. Also drops any edge referencing the node and scrubs the id from other nodes’
connections/conditional_connectionsand from the node ids they carry in config (a condition’strue_node_id/false_node_id, a loop’sbody_node_id, an errorfallback_node_id) so no dangling reference remains - voice refuses to save a graph that still points at the removed node. Ifnode_idis the workflow’sstart_node_idthe graph becomes invalid and the PUT is rejected - pick a new start node viag8_workflow_updatefirst. Args: action_id: Workflow id. node_id: Node to remove.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
node_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" }, "node_id": { "title": "Node Id", "type": "string" } }, "required": [ "action_id", "node_id" ], "title": "remove_nodeArguments", "type": "object"}g8_workflow_reset_trigger_cursor
Reset the workflow’s trigger cursor to
now(). Use before re-enabling a workflow that was disabled for a while, so it does not replay the backlog - the cursor jumps forward and only events from now on fire it. Args: action_id: Workflow id.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" } }, "required": [ "action_id" ], "title": "reset_trigger_cursorArguments", "type": "object"}g8_workflow_resume_execution
Resume a paused workflow execution. Idempotent. Args: execution_id: Execution UUID. from_step: Optional step id to resume from (defaults to the step where the pause happened). skip_failed: When
True, skip any previously-failed step instead of retrying.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
execution_id | Yes | string | See the schema below for constraints and defaults. |
from_step | No | string / null | See the schema below for constraints and defaults. |
skip_failed | No | boolean / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "execution_id": { "title": "Execution Id", "type": "string" }, "from_step": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "From Step" }, "skip_failed": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Skip Failed" } }, "required": [ "execution_id" ], "title": "resume_executionArguments", "type": "object"}g8_workflow_stop_execution
Stop a workflow execution permanently. One-way - cannot be resumed after stop; use
g8_workflow_pause_executioninstead if the user might want to flip it back. ALWAYS confirm with the user; calldry_run=Truefirst. Args: execution_id: Execution UUID. reason: Optional short reason saved with the execution. save_partial_results: WhenTrue, persist per-step output produced before the stop. DefaultFalse. message: Optional human-readable note. dry_run: WhenTrue, return a confirmation preview.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
execution_id | Yes | string | See the schema below for constraints and defaults. |
reason | No | string / null | See the schema below for constraints and defaults. |
save_partial_results | No | boolean / null | See the schema below for constraints and defaults. |
message | No | string / null | See the schema below for constraints and defaults. |
dry_run | No | boolean | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "execution_id": { "title": "Execution Id", "type": "string" }, "reason": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Reason" }, "save_partial_results": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Save Partial Results" }, "message": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Message" }, "dry_run": { "default": false, "title": "Dry Run", "type": "boolean" } }, "required": [ "execution_id" ], "title": "stop_executionArguments", "type": "object"}g8_workflow_update
Update a workflow’s metadata or graph. Partial update - pass only the fields you want to change. For node/edge edits prefer the granular
g8_workflow_add_node/update_node/remove_node/connect_nodeshelpers, which fetch + mutate + put for you. A workflow whosemanaged_by.kindiswork_routineaccepts onlyenabled; any other edit is refused with “This workflow is managed by a Work routine. Edit it in Agents › Routines.” Relay that to the user instead of retrying. Args: action_id: Workflow id. name: New display name (omit to keep current). description: New description. category: New category. enabled:Trueto enable,Falseto pause. config: New full graph dict. Replaces the existing graph wholesale - for granular edits use the helpers above.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
name | No | string / null | See the schema below for constraints and defaults. |
description | No | string / null | See the schema below for constraints and defaults. |
category | No | string / null | See the schema below for constraints and defaults. |
enabled | No | boolean / null | See the schema below for constraints and defaults. |
config | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" }, "name": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Name" }, "description": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Description" }, "category": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Category" }, "enabled": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "title": "Enabled" }, "config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Config" } }, "required": [ "action_id" ], "title": "update_workflowArguments", "type": "object"}g8_workflow_update_node
Update one node’s config / label / position / connections in place. Pass only the fields you want to change. The node’s
typeis NOT updatable here - switching types requires remove + re-add so the new config schema validates cleanly.connectionsandconditional_connectionsdrive how the executor traverses: useconnectionsfor sequential nodes andconditional_connections(a dict{path_id: target_node_id}or{"true": target, "false": target}) for branchingcondition/loop/human_approvalnodes. Most callers letadd_node/connect_nodeskeep these in sync; touch them here only when rewiring a condition node by hand. Args: action_id: Workflow id. node_id: Existing node’s id. config: New full per-node config dict (replaces, not merges). label: New display label. position: New{"x":..., "y":...}. connections: New outgoing connections list (replaces). Empty list clears; omit to leave unchanged. conditional_connections: New conditional connections dict (replaces). Empty dict clears; omit to leave unchanged.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
action_id | Yes | string | See the schema below for constraints and defaults. |
node_id | Yes | string | See the schema below for constraints and defaults. |
config | No | object / null | See the schema below for constraints and defaults. |
label | No | string / null | See the schema below for constraints and defaults. |
position | No | object / null | See the schema below for constraints and defaults. |
connections | No | array / null | See the schema below for constraints and defaults. |
conditional_connections | No | object / null | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "action_id": { "title": "Action Id", "type": "string" }, "node_id": { "title": "Node Id", "type": "string" }, "config": { "anyOf": [ { "additionalProperties": true, "type": "object" }, { "type": "null" } ], "default": null, "title": "Config" }, "label": { "anyOf": [ { "type": "string" }, { "type": "null" } ], "default": null, "title": "Label" }, "position": { "anyOf": [ { "additionalProperties": { "type": "number" }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Position" }, "connections": { "anyOf": [ { "items": { "type": "string" }, "type": "array" }, { "type": "null" } ], "default": null, "title": "Connections" }, "conditional_connections": { "anyOf": [ { "additionalProperties": { "type": "string" }, "type": "object" }, { "type": "null" } ], "default": null, "title": "Conditional Connections" } }, "required": [ "action_id", "node_id" ], "title": "update_nodeArguments", "type": "object"}g8_workflow_validate
Validate a workflow graph WITHOUT saving it. Returns
{errors: [...], warnings: [...], missing_references: [...]}. Call beforeg8_workflow_createor after a granular edit to confirm the graph is sound and every templated reference ({{node1.output}}) resolves. Args: config: The graph dict{metadata?, settings?, nodes, edges, start_node_id, trigger?}- same shapeg8_workflow_getreturns underresponse.config.
Inputs
| Input | Required | Type | Description |
|---|---|---|---|
config | Yes | object | See the schema below for constraints and defaults. |
Complete input schema
{ "properties": { "config": { "additionalProperties": true, "title": "Config", "type": "object" } }, "required": [ "config" ], "title": "validate_workflowArguments", "type": "object"}