redmine_update_issue
Update a Redmine issue's fields and status, with pre-flight checks to block disallowed workflow transitions.
Instructions
Update an issue, with reactive workflow validation on status changes.
Args:
issue_id: numeric Redmine issue id.
subject: optional new subject.
description: optional new description.
status: optional id or name (e.g. "In Progress"). Triggers
workflow pre-flight against the cache.
priority: optional id or name.
assigned_to_id: optional user id; 0 means unchanged.
notes: optional comment to attach with this update (becomes a
journal entry).
difficulty: optional engagement-mode level for the global
Difficulty custom field. Values: "Unclassified" /
"Easy" / "Normal" / "Hard". NO default-fill on
update — empty means "don't change Difficulty."
held: optional reason string explaining why the issue is held
(e.g. "waiting on upstream patch"), which also blocks
closing. Empty (default) means unchanged. This is free text a
human reads later to decide whether the hold still applies —
a bare flag records nothing, so booleans are rejected with
held_reason_required.
clear_held: set True to remove an existing hold. This is the
supported way to un-hold an issue; passing an empty held
means "don't change" and cannot clear. Mutually exclusive with
a non-empty held.
held_until: optional ISO-8601 date ("2026-10-01"). Sets the
Held Until custom field. Empty means unchanged.
Optional and independent of held — plenty of holds have
no knowable end date, so a reason with no date is valid.
due_date: optional ISO-8601 date ("2026-05-17"). Empty leaves
it unchanged; pass the literal string "" (i.e. just don't
send this arg) to leave it untouched. To clear an existing
due_date you currently need redmine_request with
{"issue": {"due_date": null}} — the MCP can't distinguish
"unset" from "leave alone" without explicit null support.
start_date: same shape as due_date.
done_ratio: optional 0-100 progress percent. -1 (sentinel)
means unchanged; 0 is explicit "reset to no progress."
fixed_version_id: optional version id (string for id-or-empty).
Empty leaves unchanged; explicit "0" clears the version.
custom_fields: optional list of {"id": <int>, "value": <str>}
entries. Accepts either a Python list (preferred) or a JSON-
encoded string. Empty means no custom-field changes.
On a status change the cache pre-flight short-circuits any
previously-observed disallowed transition with a
:class:WorkflowTransitionDisallowed payload. After a real PUT the
outcome is recorded so future calls benefit. Honors
REDMINE_MCP_READ_ONLY.
With quiet=True a successful result is reduced to ids + status (bulk:
compact per-item rows + summary) instead of the full issue JSON. Errors
are never reduced.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| held | No | ||
| notes | No | ||
| quiet | No | ||
| status | No | ||
| subject | No | ||
| due_date | No | ||
| issue_id | Yes | ||
| priority | No | ||
| clear_held | No | ||
| difficulty | No | ||
| done_ratio | No | ||
| held_until | No | ||
| start_date | No | ||
| description | No | ||
| custom_fields | No | ||
| assigned_to_id | No | ||
| fixed_version_id | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |