Skip to main content
Glama

update_plan

DestructiveIdempotent

Partial update of a content plan: only the keys you send change; unspecified keys are preserved. Call get_plan FIRST to see the current state, then send a minimal diff. Use produce_plan (not this) to generate a plan's content.

Must-know rules:

  • plan_uuid is required (from create_plan or list_plans).

  • reference_document_ids, context_collection_ids and targeting_dimension_ids: a non-empty array REPLACES the full set (not merge). An empty array [] is ignored, so this tool cannot clear them.

  • blueprint_id and due_date: null CLEARS the field. project_id and category_id: null is ignored; pass a new value to change one. blueprint_id takes a blueprint UUID (from list_blueprints) or integer id.

  • assigned_to must be the NUMERIC user id of a current team member (emails and names are rejected). Assigning a private plan to someone else auto-promotes it to "team" visibility.

  • visibility ("private" | "team"): only the plan's creator may change it. Mention the change to the user before sending it.

  • target_stage triggers a stage transition, validated server-side (use the underscore form In_Process). Common moves: Suggested → Accepted (user accepts), any open stage → Dismissed (terminal), Complete → Accepted (re-open: clears produced_content_id; confirm with the user FIRST).

  • Never send server-managed fields (source, source_metadata, created_by, team_id, id, produced_content_id, the timestamps); the server rejects them.

Present link_url exactly as returned.

Input roles:

  • plan_uuid: required. The UUID from a prior create_plan or list_plans response.

  • title / description / prompt: update the human-facing or executable text.

  • blueprint_id / project_id / category_id / due_date: update executable parameters (null clears blueprint_id and due_date; null is ignored for project_id and category_id).

  • assigned_to: there is no user-lookup tool; get the id from the user or from another plan's assigned_to/created_by. Self-assignment does not change visibility.

Allowed transitions: Suggested → Accepted (user accepts the suggestion) Suggested → Dismissed (user rejects it) Accepted → In_Process (content is being created; usually triggered automatically) Accepted → Dismissed In_Process → Complete (content reached ready; usually triggered automatically) In_Process → Accepted (content was deleted; plan reverts) In_Process → Dismissed Complete → Accepted (re-open the plan; clears produced_content_id and completed_at) Complete → Dismissed Dismissed → (nothing; terminal)

Do NOT send (server rejects with InputError "{field} is immutable" or "{field} is server-managed"): source, source_metadata, created_by, team_id, id, plan_uuid (as an update value), produced_content_id, created_at, updated_at, completed_at, dismissed_at.

Usage patterns:

  • Dismiss a plan: { plan_uuid: X, target_stage: "Dismissed" }

  • Re-open a Complete plan: { plan_uuid: X, target_stage: "Accepted" } (confirm with the user first)

  • Reassign: { plan_uuid: X, assigned_to: <user_id> }

  • Accept a Marcora-suggested plan: { plan_uuid: X, target_stage: "Accepted" }

Errors:

  • Missing param: plan_uuid. Pass the plan_uuid from a prior list_plans or create_plan response.

  • NotFound: plan_uuid doesn't exist or is not visible to your team.

  • InputError: stage transition {from} → {to} not allowed.

  • InputError: source is immutable / source_metadata is immutable.

  • InputError: assigned_to is not a member of the team.

  • InputError: assigned_to must be the numeric user id of a team member (a non-numeric value was sent).

  • InputError: only the plan creator can change visibility.

  • InputError: visibility must be one of [private, team].

  • AccessDenied: JWT doesn't resolve to the right team context.

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": {
      "plan_uuid": "<plan_uuid>"
    },
    "name": "update_plan"
  }
}

Input Schema

NameRequiredDescriptionDefault
titleNoUpdate plan title (1-200 chars).
promptNoUpdate the content prompt.
due_dateNoUpdate due date (ISO YYYY-MM-DD). null clears it.
plan_uuidYesRequired. UUID of the plan to update.
project_idNoUpdate project association. null is ignored; pass a new value to change it.
visibilityNoChange the plan's visibility. Creator-only — non-creators get InputError.
assigned_toNoReassign to a different team member (integer user ID). Must be a current team member. Assigning a private plan to anyone other than the calling user auto-promotes it to team visibility.
category_idNoUpdate category association. null is ignored; pass a new value to change it.
descriptionNoUpdate plan description.
blueprint_idNoUpdate blueprint association — accepts a blueprint UUID (from list_blueprints) or integer id. null clears it.
target_stageNoRequest a stage transition. Use UNDERSCORE form In_Process. Validated against the allowed-transition map; disallowed transitions return InputError. Allowed: Suggested, Accepted, In_Process, Complete, Dismissed.
context_collection_idsNoREPLACES full set of context collection associations with a non-empty array. [] is ignored, so this cannot clear the set.
reference_document_idsNoREPLACES full set of reference doc associations with a non-empty array. [] is ignored, so this cannot clear the set.
targeting_dimension_idsNoREPLACES full set of targeting dimension associations with a non-empty array. [] is ignored, so this cannot clear the set.

Output Schema

NameRequiredDescriptionDefault
idNo
stageYes
titleNo
promptNo
sourceNo
team_idNo
due_dateNo
link_urlYesShareable deep-link that opens the plans screen with this plan's detail overlay. Give this to the user.
plan_uuidYes
created_atNo
created_byNo
project_idNo
updated_atYes
visibilityNoprivate = creator-only; team = visible to all active teammates.
assigned_toNo
category_idNo
descriptionNo
blueprint_idNo
completed_atNo
dismissed_atNo
source_metadataNo
context_collectionsNo
produced_content_idNo
reference_documentsNo
targeting_dimensionsNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Well beyond the annotations: it discloses replace-vs-merge semantics for the three array fields, that `[]` is ignored so they cannot be cleared, which nulls clear versus are ignored per field, creator-only visibility, and the side effect that assigning a private plan auto-promotes it to team visibility. It also enumerates the full allowed-transition map and names every server-managed/immutable field the server will reject. The only deduction is that the type-level behavior is spread across four separate sections that partially restate each other rather than stated once.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Strong front-loading and useful headers, but the same facts are restated three and four times: the immutable-field list appears in the must-know rules, again under 'Do NOT send', and again in the errors list; the null-clear/ignore semantics appear in the bullets, in 'Input roles', and in the schema. The allowed-transitions block is also duplicated between 'target_stage' prose and the dedicated section. Trimming the repetition would cut length substantially without losing any 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?

For a 14-parameter, destructive, high-blast-radius mutation tool, the definition covers everything material: preconditions, diff-minimality, field-by-field null semantics, the transition graph, permission gates, an enumerated error catalogue mapping to causes, and a link-handling instruction. With an output schema present it correctly omits return-value description, so nothing an agent needs before calling is missing.

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; the description earns one step above it by adding cross-field meaning the schema does not carry — the full allowed-transition graph for `target_stage`, the `blueprint_id`-clears-vs-`project_id`-ignored asymmetry, and the rule that self-assignment leaves visibility alone. Much of the per-parameter text (numeric user id, replace-not-merge, null handling) duplicates the schema descriptions verbatim, 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 specific verb+resource and scope ('Partial update of a content plan'), immediately defining the PATCH-like semantics ('only the keys you send change'). It explicitly differentiates from two siblings by name — `get_plan` (read first) and `produce_plan` (do not use this to generate content) — so an agent can place it correctly without opening a schema.

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?

Gives an explicit precondition ('Call `get_plan` FIRST ... then send a minimal diff'), an explicit not-this case ('Use `produce_plan` (not this)'), and per-operation usage patterns for dismiss, re-open, reassign, and accept. It also flags two operations that require confirming with the user first (re-opening a Complete plan, changing visibility), which is exactly the kind of gating an agent needs.

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