Skip to main content
Glama

bulk_create_work_packages

Destructive

Creates multiple OpenProject work packages in one sequential call, returning per-item success or errors. Use it to batch project tasks in order instead of repeated single creates.

Instructions

Create multiple work packages in one call.

New items have no identifier field to set (unlike bulk_update_work_packages's work_package_id); each result item is matched back to its input purely by index.

Each item in items must contain project, type, and subject. Optional fields per item: description, version, target_versions (a list of version names/ids for OpenProject's multi-version feature; cannot be combined with version on the same item), project_phase, assignee, responsible, priority, category, custom_fields, parent_work_package_id (or parent, an alias for the same field, matching create_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'). An item containing any other key is rejected with an indexed validation error rather than silently dropping the unrecognized field. due_date falling on a non-working day (e.g. a weekend) can be silently moved forward to the next working day by OpenProject; compare the request and the returned item's result.result.due_date if the exact calendar date matters. This server does not expose a way to opt out of that shift (OpenProject's own ignoreNonWorkingDays flag is not a write parameter here).

A rejected item's validation is not a tool error; inspect each item's success, error, and nested result rather than the MCP error envelope.

select restricts each item's nested result to the given fields (e.g. ["ready", "work_package_id"]); an invalid name returns the allowed set. These are 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. The index/success/error fields on each item are always included regardless of select, so you can still tell which items succeeded; listing them in select is accepted and changes nothing. For batches with many items or long descriptions, set select proactively; an unconfirmed preview echoes each item's full proposed payload, and an unbounded batch can exceed the tool-result size limit and get redirected to a file.

A per-item timeout is reported as that item's failure and does not stop the loop. If this call is cancelled outright (e.g. the host cancels the request), items already created beforehand remain on the server; items not yet attempted are not created. No result summary is returned in that case (the call ends via cancellation, not a normal return); use list_work_packages/get_work_package afterward to determine what was actually written. This operation is not atomic; OpenProject CE has no batch/transaction endpoint.

Items are processed strictly sequentially in list order, and each result's index reflects that order; use this tool instead of parallel create_work_package/create_subtask calls whenever the relative order of a batch matters.

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.9/5.0
Behavior5/5

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

Goes far beyond the annotations (destructiveHint=true, idempotentHint=false) by disclosing that the operation is non-atomic, that per-item validation failures are not tool errors, that a per-item timeout does not stop the loop, that an outright cancellation leaves already-created items on the server with no result summary, and that due_date may be silently shifted off non-working days with no opt-out. This is exactly the mutation-risk context an agent needs and annotations cannot convey.

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-loaded with the core action and organized into topical paragraphs (fields, errors, select, cancellation, ordering), so it scans well despite its length. The field enumeration is long but each item carries non-obvious semantics; a few clauses (e.g. restating that listing always-included fields in select changes nothing) could be trimmed.

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?

There is no output schema, yet the description fully explains the per-item result shape (index, success, error, nested result), how items map back to inputs, and what to do after a cancellation (query list_work_packages/get_work_package). Combined with the partial-failure and size-limit guidance, an agent has everything needed to call this correctly and interpret the outcome.

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?

With only 67% schema coverage, the description compensates thoroughly: it names the three required keys, enumerates every optional field with semantics the schema lacks (target_versions is incompatible with version, parent is an alias for parent_work_package_id and must not be combined, ISO8601 duration format, YYYY-MM-DD dates), and warns that unknown keys are rejected rather than dropped. It also explains select precisely (write-result fields vs. the nested result work package, index/success/error always included) and what confirm=false vs. true does.

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 ('Create multiple work packages in one call') and immediately differentiates itself from bulk_update_work_packages by noting there is no identifier field, only an index-based match. It also contrasts itself with create_work_package/create_subtask, so an agent can pick it out of a very crowded sibling list 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 Guidelines5/5

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

Gives an explicit selection rule against alternatives: use this instead of parallel create_work_package/create_subtask calls when the relative order of a batch matters. It also prescribes when to set select proactively (many items or long descriptions) and requires user approval of the preview before setting confirm=true.

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