b5b4eb2b070a098e606e9e025d260c0d9857a4d9source_git · southocean/jira-mcp · current release
Observed 2026-08-25T21:04:04.436Z using mcpSecurity-inventory. Status: succeeded. Negotiated protocol: 2025-06-18.
{
"tools": {
"listChanged": true
}
}| Tool | Category | Annotations | Risk |
|---|---|---|---|
add_commentAdd a comment to a Jira ticket.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just 341"
},
"comment": {
"type": "string"
}
},
"required": [
"key",
"comment"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
add_labelAdd a label to a Jira ticket.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just 341"
},
"label": {
"type": "string",
"description": "Label to add, e.g. 'ai-inprogress'"
}
},
"required": [
"key",
"label"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
convert_to_subtaskConvert one or more EXISTING standard issues (Task/Story/Bug) into Sub-tasks nested under a parent, in the same project. This is the only way to nest an existing ticket — Jira's edit API refuses an issue-type change to subtask, so this uses the bulk-move API (the same operation as the UI 'Move'). Notifications are always sent (disabling them needs elevated permissions). Returns the per-issue result.Input schema{
"type": "object",
"properties": {
"keys": {
"type": "string",
"description": "One or more ticket keys to convert, comma- or space-separated. E.g. 'ABC-371, ABC-373'"
},
"parent": {
"type": "string",
"description": "Parent ticket key the subtasks nest under (e.g. 'ABC-370'). Must be a standard-level issue (Task/Story/Feature/Bug) — not an Epic and not itself a subtask."
}
},
"required": [
"keys",
"parent"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
create_ticketCreate a Jira ticket. Uses your configured default project unless `project` is given. If no default is set and `project` is omitted, this errors asking which project to use. Returns the ticket key (e.g. ABC-341).Input schema{
"type": "object",
"properties": {
"summary": {
"type": "string",
"description": "Short title of the ticket"
},
"description": {
"type": "string",
"description": "Detailed description"
},
"type": {
"type": "string",
"enum": [
"task",
"bug",
"feature",
"subtask"
],
"default": "task"
},
"project": {
"type": "string",
"description": "Project key to create in, e.g. 'ABC'. Omit to use the configured default project. Required (ask the user) when no default is configured."
},
"estimate": {
"type": "string",
"description": "Time estimate e.g. '2h', '1d'"
},
"assignee": {
"type": "string",
"description": "Who to assign — a full name, email, or 'me'/'unassigned'. Omit to leave unassigned. Resolved to a Jira account via the project's assignable-user search."
},
"parent": {
"type": "string",
"description": "Parent ticket key (e.g. 'ABC-370'). Required for type 'subtask' (parent must be a standard issue: Task/Story/Feature/Bug). For a Task/Story/Feature/Bug the parent must be an Epic — same-level parenting (e.g. Task under Feature) is rejected by Jira."
},
"move_to_in_progress": {
"type": "boolean",
"description": "Immediately move to In Progress after creation"
}
},
"required": [
"summary"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
download_attachmentDownload a Jira attachment by id to a local directory (created if missing). Returns the saved absolute path.Input schema{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Attachment id, e.g. '19014' — from list_attachments"
},
"outDir": {
"type": "string",
"description": "Directory to save into; created (recursively) if it doesn't exist"
},
"filename": {
"type": "string",
"description": "Override filename; defaults to the attachment's original filename"
}
},
"required": [
"id",
"outDir"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
get_commentsGet comments on a Jira ticket: author, timestamp, and body flattened from ADF to plain text.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just 341"
},
"max": {
"type": "number",
"default": 50,
"description": "Max comments to return"
}
},
"required": [
"key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
get_ticketGet details of a Jira ticket by key or number. E.g. 'ABC-341' or just '341'.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just the number 341"
}
},
"required": [
"key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
list_attachmentsList attachments on a Jira ticket: id, filename, mimeType, size, created, author.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just 341"
}
},
"required": [
"key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
move_ticketMove a Jira ticket to a new status.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just 341"
},
"status": {
"type": "string",
"enum": [
"todo",
"in-progress",
"qa",
"vqa",
"done"
]
}
},
"required": [
"key",
"status"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
move_ticket_to_projectMove one or more Jira tickets to a DIFFERENT project (re-keys them, e.g. BUG-99 -> ABC-358). This is the cross-project 'Move' operation, not a status change — use move_ticket for status. Requires Move Issues permission on the source project. Statuses/fields the target workflow doesn't share are remapped to target defaults. Notifications are always sent (disabling them requires elevated permissions). Returns the old->new key mapping.Input schema{
"type": "object",
"properties": {
"keys": {
"type": "string",
"description": "One or more ticket keys, comma- or space-separated. E.g. 'BUG-98, BUG-99'"
},
"target_project": {
"type": "string",
"description": "Target project key, e.g. 'ABC'. Defaults to your configured default project if one is set; required otherwise."
}
},
"required": [
"keys"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
remove_labelRemove a label from a Jira ticket.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just 341"
},
"label": {
"type": "string",
"description": "Label to remove, e.g. 'ai-inprogress'"
}
},
"required": [
"key",
"label"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
search_ticketsSearch Jira tickets using a plain-English query or JQL.Input schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Plain text like 'my open bugs' or JQL like 'project=ABC AND status=QA'"
},
"max": {
"type": "number",
"default": 10
}
},
"required": [
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |
update_ticketUpdate fields on an existing Jira ticket.Input schema{
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "Ticket key like ABC-341 or just 341"
},
"summary": {
"type": "string"
},
"description": {
"type": "string"
},
"estimate": {
"type": "string",
"description": "e.g. '2h', '1d'"
},
"assignee": {
"type": "string",
"description": "A full name, email, 'me', or 'unassigned'. Resolved to a Jira account via the project's assignable-user search."
},
"parent": {
"type": "string",
"description": "Parent ticket key (e.g. 'ABC-370'). Jira hierarchy applies: only an Epic can parent a Task/Story/Feature, and only a standard issue can parent a Subtask — same-level parenting is rejected."
},
"sprint": {
"type": "number",
"description": "Sprint id (integer) to place the ticket in, e.g. the current active sprint. Find it via JQL 'sprint in openSprints()'. Required after a cross-project move for the ticket to appear on the board."
}
},
"required": [
"key"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
} | — | — · — | — |