Skip to main content
Glama

Update work package

update_work_package

Change any writable work package field—assign, unassign, move status, reschedule, re-parent, set progress, or write custom fields—with lock_version to prevent conflicting edits.

Instructions

Change any writable field of a work package, with optimistic locking done properly.

Use it to assign or unassign, move a status forward, re-schedule, re-parent, set progress, or write custom fields — one tool instead of many.

Returns the updated work package in full detail, including the new lock_version to use for a follow-up edit.

Pitfalls: omitted parameters are left alone, while passing null clears a field (assignee, responsible, version, sprint, parent, dates, description). A 409 error means somebody else changed the work package first — the error carries the fresh lock_version and the conflicting fields, so re-read and retry deliberately.

Ids come from get_work_package / list_work_packages; status, priority, type and version values come from get_project_metadata; sprint ids come from list_sprints.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesWork package id to change (#1234).
dateNoMilestone date (YYYY-MM-DD); only valid on milestone types.__unchanged__
typeNoNew type as a name or numeric id. Cannot be cleared.
notifyNoEmail notifications for this change.
sprintNoNumeric sprint id from list_sprints; null removes it.__unchanged__
statusNoNew status as a name or id; invalid transitions list the reachable statuses.
subjectNoNew title. Omit to leave unchanged; cannot be cleared.
versionNoNumeric version id; null removes it.__unchanged__
assigneeNoNumeric user id; omit to leave unchanged, null (or 'none') to unassign.__unchanged__
due_dateNoISO date (YYYY-MM-DD); null clears it.__unchanged__
priorityNoNew priority as a name or numeric id.
parent_idNoRe-parent under another id; null detaches to top level (the only hierarchy tool).__unchanged__
start_dateNoISO date (YYYY-MM-DD); null clears it.__unchanged__
descriptionNoNew markdown body; omit to leave unchanged, null to empty it. Replaces the whole text; read it first to append instead.__unchanged__
responsibleNoNumeric id of the accountable person; null clears it.__unchanged__
lock_versionNoThe `lock_version` from get_work_package. Passing it makes a concurrent edit fail loudly (409); omitting it fetches and echoes the current version — safe, but a wider conflict window.
story_pointsNoStory points as a non-negative integer.
custom_fieldsNoCustom field writes keyed by wire key or display name, e.g. {'Severity': 'High'}. Unknown or non-writable keys fail listing the valid ones. Only passed keys are touched.
estimated_hoursNoEstimate in hours, decimal.
percentage_doneNoProgress 0-100.
remaining_hoursNoRemaining work in hours, decimal.
target_versionsNoTarget version ids; [] clears, omit leaves unchanged. Multiple values need instance support. Mutually exclusive with version.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoWork package id.
dateNoMilestone date (ISO YYYY-MM-DD); null for non-milestones.
typeNoWork package type.
notesNoDegradation notes for this result.
authorNoCreating user.
parentNoParent work package.
sprintNoThe sprint the work package is planned in; null when unassigned.
statusNoStatus.
projectNoOwning project.
subjectNoSubject line.
versionNoLegacy alias: the sole target version, or null for zero/multiple.
assigneeNoAssigned user or group.
categoryNoCategory.
due_dateNoISO date (YYYY-MM-DD).
priorityNoPriority.
availableNoFeature availability for this WP: dev links, meetings, files.
created_atNoISO 8601 UTC timestamp.
display_idNoHuman-facing id as the instance renders it. Matches the numeric id unless the instance uses semantic identifiers (17.x, e.g. 'PROJ-42'); null when the instance predates it.
start_dateNoISO date (YYYY-MM-DD).
updated_atNoISO 8601 UTC timestamp.
descriptionNoDescription as markdown (raw); html is dropped.
responsibleNoAccountable user.
spent_hoursNoLogged time in hours.
lock_versionNoOptimistic-locking version; pass to update_work_package.
story_pointsNoStory points.
custom_fieldsNoAlways a list; empty when none are set.
project_phaseNoProject phase this work package sits in (16.1+, only when phases are active in the project and visible to this user); details via get_project_phase.
estimated_hoursNoEstimate in hours.
percentage_doneNoProgress, 0-100.
remaining_hoursNoRemaining work in hours.
target_versionsNoAll target versions; legacy instances yield zero or one.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changedv0.3.3
    • changedInput schema / properties / assignee / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / priority / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / responsible / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / sprint
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": "__unchanged__",
      +  "description": "Numeric sprint id from list_sprints; null removes it."
      +}
    • changedInput schema / properties / status / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / type / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / version / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / version / description
      Previous value: -"Numeric version/sprint id; null removes it."New value: +"Numeric version id; null removes it."
    • addedOutput schema / properties / sprint
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "description": "A reference to another resource. Canonical output shape.",
      +      "properties": {
      +        "id": {
      +          "anyOf": [
      +            {
      +              "type": "integer"
      +            },
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Resource id."
      +        },
      +        "name": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Human-readable name."
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The sprint the work package is planned in; null when unassigned."
      +}
  2. Changed13 schema fields changedv0.3.2
    • changedInput schema / properties / assignee / description
      Previous value: -"Numeric user id to assign. Omit to leave unchanged; pass null (or 'none') to unassign — that sends a null href rather than a bogus user id."New value: +"Numeric user id; omit to leave unchanged, null (or 'none') to unassign."
    • changedInput schema / properties / custom_fields / description
      Previous value: -"Custom field writes keyed by wire key or display name, e.g. {'Severity': 'High'}. Unknown or non-writable keys fail with the valid keys listed. Only the keys you pass are touched."New value: +"Custom field writes keyed by wire key or display name, e.g. {'Severity': 'High'}. Unknown or non-writable keys fail listing the valid ones. Only passed keys are touched."
    • changedInput schema / properties / description / description
      Previous value: -"New markdown body. Omit to leave unchanged; pass null to empty it. Replaces the whole description — read it with get_work_package first if you mean to append."New value: +"New markdown body; omit to leave unchanged, null to empty it. Replaces the whole text; read it first to append instead."
    • changedInput schema / properties / estimated_hours / description
      Previous value: -"Estimate in hours as a decimal."New value: +"Estimate in hours, decimal."
    • changedInput schema / properties / id / description
      Previous value: -"Work package id to change (the #1234 number)."New value: +"Work package id to change (#1234)."
    • changedInput schema / properties / lock_version / description
      Previous value: -"The `lock_version` you read from get_work_package. Pass it and the write fails loudly (409) if somebody else edited the work package in the meantime. Omit it and the current version is fetched and echoed — still safe, just one more round trip and a slightly wider conflict window."New value: +"The `lock_version` from get_work_package. Passing it makes a concurrent edit fail loudly (409); omitting it fetches and echoes the current version — safe, but a wider conflict window."
    • changedInput schema / properties / notify / description
      Previous value: -"Send OpenProject notification emails for this change."New value: +"Email notifications for this change."
    • changedInput schema / properties / parent_id / description
      Previous value: -"Re-parent this work package under another id; null detaches it and makes it top level. This is the only hierarchy tool — there is no separate set/remove-parent tool."New value: +"Re-parent under another id; null detaches to top level (the only hierarchy tool)."
    • changedInput schema / properties / remaining_hours / description
      Previous value: -"Remaining work in hours as a decimal."New value: +"Remaining work in hours, decimal."
    • changedInput schema / properties / responsible / description
      Previous value: -"Numeric user id of the accountable person; null clears it."New value: +"Numeric id of the accountable person; null clears it."
    • changedInput schema / properties / status / description
      Previous value: -"New status as a name or numeric id. Validated through the form endpoint, so an invalid workflow transition comes back listing the statuses that *are* reachable from the current one."New value: +"New status as a name or id; invalid transitions list the reachable statuses."
    • changedInput schema / properties / target_versions / description
      Previous value: -"Target version ids. [] clears assignments; omit to leave unchanged. Multiple values require instance support. Mutually exclusive with version."New value: +"Target version ids; [] clears, omit leaves unchanged. Multiple values need instance support. Mutually exclusive with version."
    • changedInput schema / properties / version / description
      Previous value: -"Numeric version / sprint id; null removes it from the version."New value: +"Numeric version/sprint id; null removes it."
  3. Changed4 schema fields changedv0.3.1
    • addedInput schema / properties / remaining_hours
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Remaining work in hours as a decimal."
      +}
    • addedInput schema / properties / story_points
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Story points as a non-negative integer."
      +}
    • addedOutput schema / properties / remaining_hours
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Remaining work in hours."
      +}
    • addedOutput schema / properties / story_points
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Story points."
      +}
  4. Changed3 schema fields changedv0.3.0
    • addedInput schema / properties / target_versions
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "integer"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Target version ids. [] clears assignments; omit to leave unchanged. Multiple values require instance support. Mutually exclusive with version."
      +}
    • addedOutput schema / properties / target_versions
      Added value: +{
      +  "description": "All target versions; legacy instances yield zero or one.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "A reference to another resource. Canonical output shape.",
      +    "properties": {
      +      "id": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Resource id."
      +      },
      +      "name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Human-readable name."
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / version / description
      Previous value: -"Version / sprint."New value: +"Legacy alias: the sole target version, or null for zero/multiple."
  5. First observedv0.1.0

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing optimistic locking behavior, the exact semantics of omitted-vs-null parameters, the 409 conflict path including that the error carries the fresh lock_version and conflicting fields, and that null clears fields like assignee/dates. This is precisely the mutation behavior an agent needs and annotations (readOnlyHint=false, idempotentHint=false) do not supply.

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?

Purpose is front-loaded in the first sentence, then use cases, return value, pitfalls, and id sources follow in scannable short paragraphs. It is dense rather than padded, though the multi-paragraph length is on the long side for a description.

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 22-parameter mutation tool, the critical gaps are covered: null-vs-omit semantics, conflict/409 handling, id provenance, and the return payload (with the fact that an output schema exists meaning return details need not be restated). Nothing an agent needs to call it correctly is missing.

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 description coverage is 100%, so each of the 22 parameters is already documented in the schema. The description reinforces the cross-cutting null-vs-omit rule and the lock_version conflict mechanics, but adds little per-parameter meaning beyond what the schema already states; baseline 3 applies.

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?

States a specific verb and resource ('Change any writable field of a work package') and frames the scope as 'one tool instead of many', which separates it from the sibling bulk_update_work_packages and create_work_package. An agent can identify the tool's role without opening the schema.

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

Usage Guidelines4/5

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

Enumerates concrete use cases (assign/unassign, move status, re-schedule, re-parent, set progress, custom fields) and names the source tools for ids and enum values (get_work_package, list_work_packages, get_project_metadata, list_sprints). It does not, however, explicitly state when to prefer bulk_update_work_packages over this tool for multiple items.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools