<!-- Generated by `just docs` from catalog/toolkits/jira.yaml, catalog/expansions/jira.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# Jira

Issue tracking. Create, search, and update issues, move them through workflow transitions, comment, and manage projects and sprints.

| Property | Value |
| --- | --- |
| Slug | `jira` |
| Definition version | `0.1.0` |
| Base URL | `https://api.atlassian.com` |
| Auth schemes | `oauth2` |
| Action tools | 31 |
| By class | 14 read, 13 write, 4 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

65 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 31 cases written by hand and 31 cases from the paraphrase pass, plus 3 context cases whose intent names no app and is decided by the session. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 22/65 | 33.8% |
| top-8 | 48/65 | 73.8% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `oauth2`

| Property | Value |
| --- | --- |
| Authorization URL | `https://auth.atlassian.com/authorize` |
| Token URL | `https://auth.atlassian.com/oauth/token` |
| Default scopes | `read:jira-work`, `write:jira-work`, `read:jira-user`, `offline_access` |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |

## Tools

31 action tools. The catalog-wide slug is `jira.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `jira.create_issue`

Open a new issue, ticket, bug, story, or task in a project. Use when the user wants to file, log, or report something in Jira. Requires a project, issue type, and summary; assignee, priority, labels, and a parent (for a subtask) are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /ex/jira/{{params.cloud_id}}/rest/api/3/issue`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee` | object | no | Assignee object, e.g. {"accountId": "5b10a2..."}. Look up an accountId with search_users. |
| `assignee.accountId` | string | no |  |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `description` | object | no | Issue body in Atlassian Document Format (ADF), e.g. {"type":"doc","version":1,"content":[{"type":"paragraph","content": [{"type":"text","text":"..."}]}]}. Omit for no description. |
| `issue_type` | string | **yes** | Issue type name, e.g. "Bug", "Task", "Story", "Epic". |
| `labels` | array of string | no | Label names to apply. |
| `parent` | object | no | Parent issue object for a subtask, e.g. {"key": "ENG-10"}. |
| `parent.key` | string | no |  |
| `priority` | object | no | Priority object, e.g. {"name": "High"}. |
| `priority.name` | string | no |  |
| `project_key` | string | **yes** | Project key the issue belongs to, e.g. "ENG". |
| `summary` | string | **yes** | One-line issue title. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `key` | string |  |
| `self` | string |  |

Also retrieved by: "file a bug in jira", "open a new ticket for this", "log a task in the tracker", "report a problem to the team", "start a new story for this feature".

### `jira.get_issue`

Get one Jira issue's full detail by key or id: summary, description, status, assignee, reporter, priority, labels, and dates. Use when the user names one specific Jira issue by its key. For many issues at once use search_issues instead.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `fields` | string | no | Comma-separated field names to return, e.g. "summary,status,assignee". Omit for the default field set. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `fields` | object |  |
| `fields.assignee` | object |  |
| `fields.assignee.accountId` | string |  |
| `fields.assignee.displayName` | string |  |
| `fields.created` | string |  |
| `fields.description` | object |  |
| `fields.issuetype` | object |  |
| `fields.issuetype.name` | string |  |
| `fields.labels` | array of string |  |
| `fields.priority` | object |  |
| `fields.priority.name` | string |  |
| `fields.project` | object |  |
| `fields.project.key` | string |  |
| `fields.project.name` | string |  |
| `fields.reporter` | object |  |
| `fields.reporter.accountId` | string |  |
| `fields.reporter.displayName` | string |  |
| `fields.status` | object |  |
| `fields.status.name` | string |  |
| `fields.summary` | string |  |
| `fields.updated` | string |  |
| `id` | string |  |
| `key` | string |  |
| `self` | string |  |

Also retrieved by: "pull up a jira issue by its key", "what's the status of this ticket", "show me the details on that bug", "look up a specific jira ticket".

### `jira.update_issue`

Edit an existing issue's summary, description, priority, assignee, labels, or parent. Use when the user wants to change, edit, retitle, or relabel a ticket, or hand it to someone else. For moving it to a different workflow status use transition_issue instead.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `assignee` | object | no | Assignee object, e.g. {"accountId": "5b10a2..."}. |
| `assignee.accountId` | string | no |  |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `description` | object | no | New issue body in Atlassian Document Format (ADF). See create_issue for the shape. |
| `issue_key` | string | **yes** | Issue key or id to edit, e.g. "ENG-42". |
| `labels` | array of string | no | Replaces the issue's full label set. |
| `parent` | object | no | Parent issue object, e.g. {"key": "ENG-10"}. |
| `parent.key` | string | no |  |
| `priority` | object | no | Priority object, e.g. {"name": "High"}. |
| `priority.name` | string | no |  |
| `summary` | string | no | New one-line title. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `updated` | boolean |  |

Also retrieved by: "change the title on this ticket", "reassign this bug to someone else", "edit the description of this ticket", "retitle that story", "relabel this task", "update the fields on a ticket".

### `jira.delete_issue`

Permanently delete an issue. Use when the user wants to delete, remove, or trash a ticket, bug, story, or task. Fails if the issue has subtasks unless delete_subtasks is true. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `delete_subtasks` | boolean | no | Also delete the issue's subtasks. Default false. |
| `issue_key` | string | **yes** | Issue key or id to delete, e.g. "ENG-42". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "trash this jira ticket", "remove this bug from the jira project for good", "get rid of a jira issue entirely", "wipe this ticket out of jira", "delete one issue from the jira board".

### `jira.search_issues`

Search across all Jira projects using Jira Query Language (JQL), e.g. 'status = "In Progress" ORDER BY updated DESC'. Use for any query spanning more than one issue: by project, status, assignee, label, or text. For one known issue use get_issue.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `POST /ex/jira/{{params.cloud_id}}/rest/api/3/search/jql`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `fields` | array of string | no | Field names to return per issue, e.g. ["summary", "status", "assignee"]. Omit for the default field set. |
| `jql` | string | **yes** | JQL query, e.g. 'project = ENG AND status = "In Progress" ORDER BY updated DESC'. |
| `max_results` | integer | no | Page size, default 50. |
| `next_page_token` | string | no | Token from a previous response's nextPageToken. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `issues` | array of object |  |
| `issues[].fields` | object |  |
| `issues[].fields.assignee` | object |  |
| `issues[].fields.status` | object |  |
| `issues[].fields.summary` | string |  |
| `issues[].id` | string |  |
| `issues[].key` | string |  |
| `nextPageToken` | string |  |

Also retrieved by: "find every open bug assigned to me", "look up tickets by project and status", "run a jql query across the tracker", "what's still outstanding in this project", "filter tickets by label".

### `jira.assign_issue`

Assign an issue to a person, or unassign it. Use when the user wants to assign, reassign, hand off, or take an issue. Pass null to unassign, or "-1" to set the project's default assignee.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}/assignee`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `account_id` | any | **yes** | Assignee's Atlassian accountId from search_users, "-1" for the project's default assignee, or null to unassign. |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `assigned` | boolean |  |

Also retrieved by: "hand this ticket to someone", "give this bug to a teammate", "take this ticket myself", "unassign this task", "put the default assignee back on it".

### `jira.list_transitions`

List the workflow transitions available for an issue right now, e.g. moving it from "To Do" to "In Progress" or "Done". Use before transition_issue to find the transition id for the status the user named.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}/transitions`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `transitions` | array of object |  |
| `transitions[].id` | string |  |
| `transitions[].name` | string |  |
| `transitions[].to` | object |  |
| `transitions[].to.name` | string |  |

Also retrieved by: "what statuses can this ticket move to", "show me the next steps for this ticket", "what workflow moves are available here".

### `jira.transition_issue`

Move an issue to a new workflow status, e.g. mark it done, move it to in progress, resolve it, reopen it, or send it back a step. Use when the user wants to change an issue's state. Requires a transition_id from list_transitions.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}/transitions`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `fields` | object | no | Extra fields to set as part of the transition, e.g. {"resolution": {"name": "Done"}}. Omit when the transition needs no extra fields. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |
| `transition_id` | string | **yes** | Transition id from list_transitions. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `transitioned` | boolean |  |

Also retrieved by: "move this ticket to done", "mark this bug as resolved", "send this story back to in progress", "close out this task", "reopen that ticket", "mark this ticket as done".

### `jira.list_issue_types`

List the issue types available on the site: Bug, Task, Story, Epic, and any custom types, each with whether it is a subtask type. Use to find the exact issue_type name create_issue expects.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/issuetype`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |

Also retrieved by: "what kinds of tickets can I create", "show me the available issue categories", "list the ticket types on this site".

### `jira.list_comments`

List the comments on an issue, oldest first. Use when the user wants to read the discussion, history, or conversation on a ticket.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}/comment`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |
| `max_results` | integer | no | Page size, default 50. |
| `start_at` | integer | no | Offset into the comment list, default 0. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `comments` | array of object |  |
| `comments[].author` | object |  |
| `comments[].author.displayName` | string |  |
| `comments[].body` | object |  |
| `comments[].created` | string |  |
| `comments[].id` | string |  |
| `comments[].updated` | string |  |
| `total` | integer |  |

Also retrieved by: "what did people say on this ticket", "read the discussion on this bug", "show the conversation history on this issue", "list every comment on a ticket".

### `jira.add_comment`

Add a new comment to an issue. Use when the user wants to comment, reply, note, or leave an update on a ticket. To change a comment already posted use update_comment.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}/comment`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `body` | object | **yes** | Comment text in Atlassian Document Format (ADF), e.g. {"type":"doc","version":1,"content":[{"type":"paragraph","content": [{"type":"text","text":"..."}]}]}. |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created` | string |  |
| `id` | string |  |

Also retrieved by: "leave a note on this ticket", "reply on this bug with an update", "post a comment for the team", "tell them the fix shipped".

### `jira.update_comment`

Edit the text of a comment already posted on an issue. Use when the user wants to fix, correct, or update something they or someone else wrote on a ticket.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}/comment/{{params.comment_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `body` | object | **yes** | Replacement comment text in Atlassian Document Format (ADF). See add_comment for the shape. |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `comment_id` | string | **yes** | Comment id from list_comments. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `updated` | string |  |

Also retrieved by: "fix a typo in my last comment", "correct what I wrote on that ticket", "edit my earlier note".

### `jira.delete_comment`

Permanently delete a comment from an issue. Use when the user wants to delete or remove a comment, not the whole issue. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /ex/jira/{{params.cloud_id}}/rest/api/3/issue/{{params.issue_key}}/comment/{{params.comment_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `comment_id` | string | **yes** | Comment id to delete, from list_comments. |
| `issue_key` | string | **yes** | Issue key or id, e.g. "ENG-42". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove that comment", "delete what I posted by mistake", "take down a note on this ticket", "take down something I posted by mistake".

### `jira.list_projects`

List or search projects (workspaces) on the site by name or key. Use when the user wants to see what projects exist or find a project's key.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/project/search`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `max_results` | integer | no | Page size, default 50. |
| `query` | string | no | Filter by project name or key substring. Omit to list all. |
| `start_at` | integer | no | Offset into the project list, default 0. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `isLast` | boolean |  |
| `total` | integer |  |
| `values` | array of object |  |
| `values[].id` | string |  |
| `values[].key` | string |  |
| `values[].name` | string |  |
| `values[].projectTypeKey` | string |  |

Also retrieved by: "what projects exist in jira", "find the key for a project", "show me every project on the site", "show me every workspace we have".

### `jira.get_project`

Get one project's (workspace's) detail by key or id: name, description, type, and who leads it. Use when the user names a specific project. For the whole list use list_projects.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/project/{{params.project_key}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `project_key` | string | **yes** | Project key or id, e.g. "ENG". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `description` | string |  |
| `id` | string |  |
| `key` | string |  |
| `lead` | object |  |
| `lead.accountId` | string |  |
| `lead.displayName` | string |  |
| `name` | string |  |
| `projectTypeKey` | string |  |
| `url` | string |  |

Also retrieved by: "tell me about this project", "who leads this project", "pull up project details", "who's running this and what's it about".

### `jira.create_project`

Create a new project on the site. Use when the user wants to start, set up, or spin up a new project. Requires a unique key, a name, a project type, a project template, and a lead.

Class `write` (writes, no confirmation needed). Scopes `manage:jira-project`. Calls `POST /ex/jira/{{params.cloud_id}}/rest/api/3/project`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `key` | string | **yes** | Unique project key, e.g. "ENG". Uppercase letters, 2-10 chars. |
| `lead_account_id` | string | **yes** | Atlassian accountId of the project lead, from search_users. |
| `name` | string | **yes** | Project display name. |
| `project_template_key` | string | **yes** | Template key for the project type, e.g. "com.pyxis.greenhopper.jira:gh-simplified-agility-kanban". |
| `project_type_key` | string | **yes** | Project type, e.g. "software", "business", "service_desk". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `key` | string |  |
| `name` | string |  |

Also retrieved by: "spin up a new project", "set up a project for this team", "start a fresh project in jira".

### `jira.update_project`

Rename a project, edit its description, or change its lead. Use when the user wants to edit or update a project's own details, not the issues inside it.

Class `write` (writes, no confirmation needed). Scopes `manage:jira-project`. Calls `PUT /ex/jira/{{params.cloud_id}}/rest/api/3/project/{{params.project_key}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `description` | string | no | New project description, plain text. |
| `lead_account_id` | string | no | New project lead's accountId, from search_users. |
| `name` | string | no | New project display name. |
| `project_key` | string | **yes** | Project key or id to edit, e.g. "ENG". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `updated` | boolean |  |

Also retrieved by: "rename this project", "change who leads this project", "edit the project description".

### `jira.delete_project`

Permanently delete a project (workspace) and every issue inside it. Use when the user explicitly asks to delete or remove a whole project, not a single issue. Irreversible once past the trash retention period.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `manage:jira-project`. Calls `DELETE /ex/jira/{{params.cloud_id}}/rest/api/3/project/{{params.project_key}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `project_key` | string | **yes** | Project key or id to delete, e.g. "ENG". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this whole project", "delete a project and everything in it", "get rid of this project for good", "wipe out a project entirely".

### `jira.get_current_user`

Get the profile of the connected account itself: accountId, display name, and email. Use to answer "who am I" or to get the caller's own accountId for assign_issue.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/myself`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `accountId` | string |  |
| `active` | boolean |  |
| `displayName` | string |  |
| `emailAddress` | string |  |

Also retrieved by: "who am I logged in as", "what's my account id", "show my own profile".

### `jira.search_users`

Look up people on the site by name or email. Use before assign_issue or create_issue when the user names a person rather than giving an accountId directly.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ex/jira/{{params.cloud_id}}/rest/api/3/user/search`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `max_results` | integer | no | Page size, default 50. |
| `query` | string | **yes** | Name or email substring to match. |

Also retrieved by: "find someone by name", "look up a teammate's email", "who matches this name in jira".

### `jira.list_boards`

List the agile (scrum or kanban) boards on the site, optionally filtered to one project. Use to find a board_id for list_board_issues, list_board_sprints, or as a starting point before create_sprint.

Class `read` (reads only). Scopes `read:board-scope:jira-software`. Calls `GET /ex/jira/{{params.cloud_id}}/rest/agile/1.0/board`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `max_results` | integer | no | Page size, default 50. |
| `project_key_or_id` | string | no | Restrict to boards of this project. |
| `type` | string, one of scrum, kanban | no | Restrict to boards of this type. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `isLast` | boolean |  |
| `values` | array of object |  |
| `values[].id` | integer |  |
| `values[].name` | string |  |
| `values[].type` | string |  |

Also retrieved by: "show me the scrum and kanban boards", "what boards exist for this project", "find the board id for this team".

### `jira.list_board_issues`

List the issues on a board's kanban or backlog view, optionally filtered by JQL. Use when the user asks what's on a board, as opposed to one sprint's issues (use list_sprint_issues for that).

Class `read` (reads only). Scopes `read:board-scope:jira-software`. Calls `GET /ex/jira/{{params.cloud_id}}/rest/agile/1.0/board/{{params.board_id}}/issue`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `board_id` | integer | **yes** | Board id from list_boards. |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `jql` | string | no | Optional JQL filter over the board's issues. |
| `max_results` | integer | no | Page size, default 50. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `issues` | array of object |  |
| `issues[].fields` | object |  |
| `issues[].fields.status` | object |  |
| `issues[].fields.summary` | string |  |
| `issues[].id` | string |  |
| `issues[].key` | string |  |
| `total` | integer |  |

Also retrieved by: "what's on this board right now", "show every ticket on the board", "list the issues sitting on this board", "what's on this kanban view right now".

### `jira.list_board_sprints`

List a board's sprints (iterations), optionally filtered to active, closed, or future ones. Use to find a sprint_id for get_sprint, start_sprint, close_sprint, or move_issues_to_sprint.

Class `read` (reads only). Scopes `read:board-scope:jira-software`. Calls `GET /ex/jira/{{params.cloud_id}}/rest/agile/1.0/board/{{params.board_id}}/sprint`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `board_id` | integer | **yes** | Board id from list_boards. |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `max_results` | integer | no | Page size, default 50. |
| `state` | string, one of active, closed, future | no | Restrict to sprints in this state. Omit for all. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `isLast` | boolean |  |
| `values` | array of object |  |
| `values[].endDate` | string |  |
| `values[].id` | integer |  |
| `values[].name` | string |  |
| `values[].startDate` | string |  |
| `values[].state` | string |  |

Also retrieved by: "show past and future sprints for this board", "what sprints has this board run", "find the sprint id I need".

### `jira.get_sprint`

Get one sprint's (iteration's) detail by id: name, state, dates, and goal. Use when the user names a specific sprint. For a board's whole list use list_board_sprints.

Class `read` (reads only). Scopes `read:sprint:jira-software`. Calls `GET /ex/jira/{{params.cloud_id}}/rest/agile/1.0/sprint/{{params.sprint_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `sprint_id` | integer | **yes** | Sprint id from list_board_sprints. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `endDate` | string |  |
| `goal` | string |  |
| `id` | integer |  |
| `name` | string |  |
| `originBoardId` | integer |  |
| `startDate` | string |  |
| `state` | string |  |

Also retrieved by: "tell me about this sprint", "when does this sprint end", "what's the goal for this sprint", "when does this iteration wrap up".

### `jira.create_sprint`

Create a new sprint (iteration) on a board, in the future state until started. Use when the user wants to plan, set up, or add a new sprint. Start it later with start_sprint.

Class `write` (writes, no confirmation needed). Scopes `write:sprint:jira-software`. Calls `POST /ex/jira/{{params.cloud_id}}/rest/agile/1.0/sprint`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `end_date` | string (date-time) | no | Planned end, ISO 8601. Optional. |
| `goal` | string | no | Short sprint goal. Optional. |
| `name` | string | **yes** | Sprint name, e.g. "Sprint 24". |
| `origin_board_id` | integer | **yes** | Board id the sprint belongs to, from list_boards. |
| `start_date` | string (date-time) | no | Planned start, ISO 8601. Optional. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | integer |  |
| `name` | string |  |
| `state` | string |  |

Also retrieved by: "plan a new sprint", "set up the next sprint for this board", "add a sprint to the schedule".

### `jira.start_sprint`

Start a sprint (iteration) that is in the future state, moving it to active. Use when the user wants to start, begin, or kick off a sprint. Optionally set or move its start and end dates at the same time.

Class `write` (writes, no confirmation needed). Scopes `write:sprint:jira-software`. Calls `POST /ex/jira/{{params.cloud_id}}/rest/agile/1.0/sprint/{{params.sprint_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `end_date` | string (date-time) | no | New end date, ISO 8601. Optional. |
| `sprint_id` | integer | **yes** | Sprint id from list_board_sprints. |
| `start_date` | string (date-time) | no | New start date, ISO 8601. Optional. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | integer |  |
| `state` | string |  |

Also retrieved by: "kick off this sprint", "begin the sprint now", "get this sprint moving".

### `jira.close_sprint`

Close an active sprint (iteration). Use when the user wants to close, end, wrap up, or complete a sprint. Incomplete issues are left for the team to move manually; this call does not move them.

Class `write` (writes, no confirmation needed). Scopes `write:sprint:jira-software`. Calls `POST /ex/jira/{{params.cloud_id}}/rest/agile/1.0/sprint/{{params.sprint_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `sprint_id` | integer | **yes** | Sprint id from list_board_sprints. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | integer |  |
| `state` | string |  |

Also retrieved by: "wrap up this sprint", "end the current sprint", "complete this sprint".

### `jira.delete_sprint`

Permanently delete a sprint (iteration). Use when the user wants to delete or remove a sprint. Its issues are not deleted; they return to the backlog. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). Scopes `delete:sprint:jira-software`. Calls `DELETE /ex/jira/{{params.cloud_id}}/rest/agile/1.0/sprint/{{params.sprint_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `sprint_id` | integer | **yes** | Sprint id to delete, from list_board_sprints. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this sprint entirely", "get rid of a sprint", "delete a sprint from the board".

### `jira.list_sprint_issues`

List the issues planned in one sprint (iteration), optionally filtered by JQL. Use when the user asks what's in a sprint, as opposed to a whole board's issues (use list_board_issues for that).

Class `read` (reads only). Scopes `read:sprint:jira-software`. Calls `GET /ex/jira/{{params.cloud_id}}/rest/agile/1.0/sprint/{{params.sprint_id}}/issue`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `jql` | string | no | Optional JQL filter over the sprint's issues. |
| `max_results` | integer | no | Page size, default 50. |
| `sprint_id` | integer | **yes** | Sprint id from list_board_sprints. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `issues` | array of object |  |
| `issues[].fields` | object |  |
| `issues[].fields.status` | object |  |
| `issues[].fields.summary` | string |  |
| `issues[].id` | string |  |
| `issues[].key` | string |  |
| `total` | integer |  |

Also retrieved by: "what's in this sprint", "show every ticket scheduled this sprint", "list the tickets for the current sprint", "what's planned for this iteration".

### `jira.move_issues_to_sprint`

Move one or more issues into a sprint. Use when the user wants to add issues to, schedule issues into, or pull issues into a sprint. Up to 50 issues per call.

Class `write` (writes, no confirmation needed). Scopes `write:sprint:jira-software`. Calls `POST /ex/jira/{{params.cloud_id}}/rest/agile/1.0/sprint/{{params.sprint_id}}/issue`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `issue_keys` | array of string | **yes** | Issue keys or ids to move in, e.g. ["ENG-42", "ENG-43"]. |
| `sprint_id` | integer | **yes** | Sprint id from list_board_sprints. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `moved` | boolean |  |

Also retrieved by: "pull these tickets into the sprint", "schedule these issues for this sprint", "add these tickets to the current sprint".

### `jira.link_issues`

Link two issues together, e.g. as blocking, duplicating, or relating to each other. Use when the user wants to connect, relate, or link one ticket to another. Not for parent/subtask; use parent on create_issue or update_issue for that.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /ex/jira/{{params.cloud_id}}/rest/api/3/issueLink`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cloud_id` | string | **yes** | Atlassian Cloud id of the connected Jira site. |
| `comment` | object | no | Optional comment to add alongside the link, e.g. {"body": {"type":"doc","version":1,"content":[...]}}. |
| `comment.body` | object | no |  |
| `inward_issue_key` | string | **yes** | Issue key on the inward side, e.g. the one being blocked for a "Blocks" link. |
| `link_type` | string | **yes** | Link type name, e.g. "Blocks", "Duplicate", "Relates". |
| `outward_issue_key` | string | **yes** | Issue key on the outward side, e.g. the one doing the blocking for a "Blocks" link. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `linked` | boolean |  |

Also retrieved by: "connect these two tickets", "mark one ticket as blocking another", "relate this bug to that one".
