Skip to main content
Glama

update_workflow

DestructiveIdempotent

Partial update of a workflow template: only the keys you send change; everything else is preserved. Call get_workflow first to see the current state, then send the minimal diff.

Fields: workflow_id (UUID, required); name / description / steps / inputs / allowed_tools / tags as partial overrides; status: "active" | "inactive" | "archived" ("archived" is a soft delete).

Only set status: "active" when the user has actually asked for it. A workflow the user has not approved stays Inactive.

This tool cannot edit a schedule, and it fails silently: a schedule or schedule_config field is ignored, no error is raised and you get a normal success response. Editing a schedule, and turning it On or Paused, happen only in the Marcora app; direct the user there.

Two switches, two vocabularies, never mixed. The workflow's status is Active or Inactive. Its schedule, if any, is On or Paused. Never call a schedule "active"/"inactive" or a workflow "paused"/"on". Active does not mean running; it means the workflow is allowed to run. It runs on its own only when it is Active AND its schedule is On. Setting status: "active" does not turn a Paused schedule On; that takes Resume schedule in the app. Setting it Inactive keeps the schedule as it was: a schedule that was On fires again once the workflow is Active.

When this call changes the status, the response carries a next_step stating what will and won't run afterwards, computed from the saved schedule. Follow it and describe the state that exists after this call. After you set it Active, never tell the user it is Inactive or that they still need to activate it.

Present link_url exactly as returned.

What actually runs needs BOTH switches; describe the pair that exists when you finish:

  • Inactive → nothing runs, by any route (manual runs are refused too).

  • Active, no schedule → runs only when started manually; never starts by itself.

  • Active, schedule Paused → manual runs work; it won't run on its schedule until the user turns the schedule on with Resume schedule in the app.

  • Active, schedule On → runs on its schedule.

  • Inactive, schedule On → nothing runs until the workflow is set Active.

Usage patterns:

  • To set Active: {workflow_id: "", status: "active"}.

  • To set Inactive: {workflow_id: "", status: "inactive"}.

  • To soft-delete: {workflow_id: "", status: "archived"}.

  • To rename: call get_workflow first, then send just {workflow_id, name}.

Links: copy link_url character for character. Never retype, shorten, or rebuild a link or the IDs inside it.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "workflow_id": "<workflow_id>"
    },
    "name": "update_workflow"
  }
}

Input Schema

NameRequiredDescriptionDefault
nameNoNew display name for the workflow. Omit it to leave the name as it is — only the keys you send are written.
tagsNoReplacement array of label strings; it overwrites the existing tags. Must be an array — any other value leaves the tags untouched.
stepsNoReplacement ordered list of actions. It overwrites the existing steps outright rather than merging, so start from the list `get_workflow` returned and send the whole intended sequence. Omit it — or send an empty object, which counts as "not provided" — to leave the steps unchanged.
inputsNoReplacement declaration of the values the workflow expects at run time. It overwrites the previous declaration outright. Omit it to leave it unchanged; note an empty object `{}` is also treated as "not provided" and changes nothing.
statusNoLifecycle state of the workflow: "active" (allowed to run — required before `run_workflow` will start it or its schedule will fire), "inactive" (nothing runs, by any route; its schedule, if any, is kept exactly as it is) or "archived" (the soft-delete convention; the record is kept but taken out of normal use). Set "active" only once the user has confirmed the steps. Any other value is rejected and nothing is saved — there is no "paused" status: pausing is something a schedule does, and the user does it in the app.
descriptionNoReplacement description. It is inserted into the prompt given to the agent that runs the workflow, so refresh it whenever the steps change meaningfully. Omit to leave it unchanged.
workflow_idYesUUID of the workflow to update, as returned by `list_workflows`, `create_workflow` or `get_workflow`. Required, and the workflow must belong to the user's current team. Call `get_workflow` first so you can send a minimal change set and know what the current values are.
allowed_toolsNoReplacement list of the tools the workflow's agent is told it may call (an instruction in its prompt, not a separate permission check). It overwrites the existing allowlist, so send the full intended set rather than just additions, and keep it tight for scheduled workflows. Omit it (or send an empty object) to leave the allowlist unchanged.

Output Schema

NameRequiredDescriptionDefault
idNo
nameNo
tagsNo
stepsNo
inputsNo
statusNo
link_urlNoDirect URL to view this workflow in Marcora.
scheduleNoPresent whenever the workflow has a schedule, on every update. Inert context, read back from the saved trigger.
next_stepNoPresent ONLY when this call set status to "active" or "inactive". What will and won't run afterwards, across both switches — the workflow's status and its schedule — with the words to use. Follow it in substance. A call that changes anything else (a rename, say) returns no next_step, so nothing asserts a change that did not happen or pushes the user toward a schedule they did not ask about.
updated_atNo
allowed_toolsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the merge/soft-delete semantics are partly pre-signalled; the description nonetheless adds real undisclosed behavior, notably that schedule/schedule_config fields fail silently with a normal success response. Without that sentence an agent would confidently believe a schedule edit succeeded. Note the flagged score is not a penalty for the annotations — see the dedicated note in the summary.

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?

Well front-loaded and heavily structured with bold headers, bullets and payload examples, appropriate for a tool with genuinely subtle dual-state semantics. It is long, however, and the "What actually runs" state table overlaps substantially with the preceding two-switches paragraph, so a few lines could be cut without losing information.

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

Completeness5/5

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

Covers the full complexity surface: merge semantics, status vocabulary, the schedule/workflow state pairing, the silent-failure trap, the next_step contract, and the link-copying instruction. An output schema exists, yet the description still adds the one thing the schema cannot — how to phrase the resulting state back to the user.

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 100%, so the baseline is 3, but the description still adds meaning beyond the schema: the activate/inactivate/archive decision rules, the warning that schedule-shaped keys are ignored, and concrete minimal-diff payload examples. It largely restates the already-detailed status preamble, which caps it below 5.

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

Purpose5/5

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

Opens with a precise verb+resource+semantics statement: "Partial update of a workflow template: only the keys you send change; everything else is preserved." That single line distinguishes it from create_workflow and update_playbook and tells the agent the write is a merge, not a replace-all.

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

Usage Guidelines5/5

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

Explicit routing in both directions: "Call `get_workflow` first to see the current state, then send the minimal diff," plus concrete usage-pattern payloads for activate/inactivate/archive/rename. It also states a hard exclusion — schedule edits cannot be done here and must go to the Marcora app — and warns to set status active only when the user actually asked.

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