Summary
jira_update_issue silently drops parent: null (and a null Epic Link customfield). The field is skipped, the parent is left unchanged, but the tool still returns a success response — so callers cannot tell the write failed. Setting a parent works fine; only clearing it is broken. The net effect is that it's impossible to unlink an issue from its epic via jira_update_issue, and the failure is silent.
Environment
mcp-atlassian 0.21.1
- Jira Cloud, company-managed project
- Transport: stdio; auth: API token (Basic)
Steps to reproduce
- Link an issue to an epic (works):
jira_update_issue(issue_key="PROJ-123", fields='{"parent": {"key": "EPIC-1"}}')
→ parent and the legacy Epic Link are both set. ✅
- Try to clear it:
jira_update_issue(issue_key="PROJ-123", fields='{"parent": null}')
→ Tool returns success, but the parent is unchanged. Server log:
WARNING - mcp-jira - Invalid parent value for issue PROJ-123: None
- Same for clearing the Epic Link customfield directly:
jira_update_issue(issue_key="PROJ-123", fields='{"customfield_10014": null}')
→ Server log: WARNING - mcp-jira - Skipping field 'customfield_10014' due to formatting error or invalid value. Field unchanged; success returned.
Expected behavior
Either actually clear the field when null is passed, or return an explicit error. Silently skipping a requested field while reporting success is data-loss-masking: automation believes the epic was unlinked when it wasn't.
Actual behavior
The field is silently left unchanged and a success response is returned. No error surfaces to the caller.
Impact
Any workflow that needs to remove an issue from an epic (e.g. re-triage / re-parenting automation) silently no-ops. Because there's no error, downstream logic assumes success and the issue lingers in the old epic indefinitely.
Verified workaround (Cloud)
A direct REST call bypasses the tool's field handling and works:
PUT /rest/api/3/issue/{key}
{"fields": {"parent": null}} # HTTP Basic auth (email:token) → 204
On Cloud company-managed projects this clears the native parent and the synced legacy Epic Link, dropping the issue from "Epic Link" = <epic> membership.
Related
Summary
jira_update_issuesilently dropsparent: null(and a null Epic Link customfield). The field is skipped, the parent is left unchanged, but the tool still returns a success response — so callers cannot tell the write failed. Setting a parent works fine; only clearing it is broken. The net effect is that it's impossible to unlink an issue from its epic viajira_update_issue, and the failure is silent.Environment
mcp-atlassian0.21.1Steps to reproduce
parentand the legacy Epic Link are both set. ✅WARNING - mcp-jira - Skipping field 'customfield_10014' due to formatting error or invalid value.Field unchanged; success returned.Expected behavior
Either actually clear the field when
nullis passed, or return an explicit error. Silently skipping a requested field while reporting success is data-loss-masking: automation believes the epic was unlinked when it wasn't.Actual behavior
The field is silently left unchanged and a success response is returned. No error surfaces to the caller.
Impact
Any workflow that needs to remove an issue from an epic (e.g. re-triage / re-parenting automation) silently no-ops. Because there's no error, downstream logic assumes success and the issue lingers in the old epic indefinitely.
Verified workaround (Cloud)
A direct REST call bypasses the tool's field handling and works:
On Cloud company-managed projects this clears the native
parentand the synced legacy Epic Link, dropping the issue from"Epic Link" = <epic>membership.Related
jira_update_issuealready acceptsparent/Epic-Linknulland returns success, so at minimum it should error instead of silently no-op'ing (and ideally clear the field, which the REST PUT above shows is possible).