Skip to main content
Glama

bulk_update_work_packages

DestructiveIdempotent

Update multiple work packages in one request by supplying each work_package_id and the fields to change; preview the changes, then confirm to apply them.

Instructions

Update multiple work packages in one call.

Each item's identifier field is work_package_id, not id, e.g. {"work_package_id": 952, "status": "Closed"}.

Each item in items must contain work_package_id. At least one other field must be present per item. Optional fields per item: subject, description, type, version, target_versions (a list of version names/ids for OpenProject's multi-version feature; pass [] to clear all; cannot be combined with version on the same item; rejected if the item's work package already has more than one target version assigned), sprint (Backlogs sprint name/id, requires the Backlogs module and OpenProject 17.3+), project_phase, status, assignee, responsible, priority, category, custom_fields, parent_work_package_id (or parent, an alias for the same field, matching update_work_package's naming; do not specify both on the same item), start_date (YYYY-MM-DD), due_date (YYYY-MM-DD), estimated_time, remaining_time, duration (ISO8601 duration strings, e.g. 'PT8H' or 'P1D'; pass 'none' to clear one of these), percentage_done (integer 0-100). Pass 'none' to version, sprint, project_phase, assignee, responsible, category, parent_work_package_id, or parent to clear that field on the item, same as update_work_package. An item containing any other key is rejected with an indexed validation error rather than silently dropping the unrecognized field. Setting an item's status to a closed status auto-fills percentage_done=100 and remaining_time=PT0H when that item doesn't supply them explicitly and OpenProject's schema reports those fields as writable. On an instance using status-based progress calculation, explicitly passing percentage_done together with a closing status on the same item is rejected with a hard, indexed validation error (percentageDone is not writable there) rather than silently ignored; omit percentage_done on that item and let OpenProject derive it instead.

due_date's non-working-day shift, the confirm/preview contract, select's item-trimming behavior, and cancellation/atomicity semantics all work exactly as documented on bulk_create_work_packages; only the affected result field differs (result.result.due_date here too). As there, select names write-result fields (work_package_id, ready, state, ...), not work package fields: display_id and the rest come with result, the full written work package.

Input Schema

NameRequiredDescriptionDefault
itemsYes
selectNoFields to return; a requested unset field comes back as null. Allowed: action, error, index, message, payload, project, ready, result, state, success, validation_errors, work_package_id.
confirmNofalse: preview of every item, nothing changes. true: attempts every item; get the user's approval of the preview first. Failed items are reported per item; items already written are not undone.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv0.4.4

TDQS

A4.4/5.0
Behavior4/5

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

Goes well beyond the annotations (destructive/idempotent/openWorld) with real behavioral detail: unknown keys are rejected with indexed errors, 'none' clears nullable fields, closed status auto-fills percentage_done/remaining_time, and percentage_done plus a closing status is hard-rejected on status-based-progress instances. However, the confirm/preview contract, item-trimming via select, and cancellation/atomicity semantics — critical for a destructive tool — are delegated to bulk_create_work_packages rather than restated.

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?

Front-loads the highest-value fact (the work_package_id key naming) and is organized as lead sentence, field inventory, then edge-case rules. It is dense and the target_versions/sprint parentheticals plus the deferred-contract paragraph make it longer than strictly necessary, but every sentence carries operational rules.

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

Completeness4/5

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

No output schema exists, and the description partially compensates by naming result shape fields (result.result.due_date, work_package_id, ready, state, display_id) and noting that select refers to write-result fields. Combined with the schema's confirm parameter documenting preview vs. execute, the description is nearly complete, though atomicity/cancellation behavior must still be read from a sibling.

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

Parameters5/5

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

Adds substantial meaning beyond the 67%-covered schema: the 'none' sentinel for clearing, mutual exclusion of target_versions vs version and parent vs parent_work_package_id, target_versions [] to clear all, ISO8601 duration format, YYYY-MM-DD dates, percentage_done 0-100, and that select names write-result fields rather than work package fields. This compensates for the schema's terse titles.

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+scope: 'Update multiple work packages in one call'. The bulk scope distinguishes it from update_work_package, and the explicit instruction that the key is `work_package_id`, not `id`, immediately separates it from the single-item sibling's payload shape.

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?

Usage context is clear from 'in one call' and the repeated comparison to update_work_package ('same as update_work_package', 'matching update_work_package's naming') plus the pointer to bulk_create_work_packages for shared contracts. It never states an explicit when-not-to-use (e.g. use update_work_package for a single item), leaving that inference to the agent.

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