Skip to content

[Bug]: jira_update_issue silently drops parent: null (clearing epic membership fails but returns success) #1500

Description

@scottirvinsonos

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

  1. 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. ✅
  2. 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
    
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions