← All integrations

Jira

Let an agent triage and move work in Jira without your login. It searches with JQL and reads issues, creates, renames, labels, prioritises, assigns and transitions them, and deleting an issue or a comment can wait for a person.

Jirasecret · JIRA
host
{site}.atlassian.net
connect
API key, per user
  • Create issue

    jira-create-issue

  • Rename issue

    jira-rename-issue

  • Add issue label

    jira-add-issue-label

  • Set issue priority

    jira-set-issue-priority

writes are off until switched on

Reads and writes in Jira. Writes are off until you switch them on.

Each one is a named operation from the pack. Reads change nothing.

Writes

  • Create issue

    read back

    jira-create-issue

    Create one issue in a project with a summary, a plain-text description and optional labels. Take the issue type id from list-issue-types; a subtask type is refused, because this action sets no parent. The description becomes one Atlassian Document Format paragraph; headings, lists and formatting are not offered. Set the priority and assignee afterwards with set-issue-priority and assign-issue. Returns the new issue's id and key.

  • Rename issue

    read back

    jira-rename-issue

    Change one issue's summary.

  • Add issue label

    read back

    jira-add-issue-label

    Add one label to an issue, keeping its other labels. A label has no spaces; Jira creates a label that does not exist yet.

  • Set issue priority

    read back

    jira-set-issue-priority

    Set one issue's priority. Take the priority id from list-priorities; a priority outside the project's priority scheme is refused.

  • Assign issue

    read back

    jira-assign-issue

    Assign one issue to a user by Atlassian account id. Use get-myself for the connected user's own id, or an assignee or reporter accountId from get-issue. The user must be assignable in the project. Unassigning and the project's default assignee are not offered. Jira can email the new assignee, as its notification scheme says.

  • Transition issue

    read back

    jira-transition-issue

    Move one issue through its workflow, for example to In Progress or Done. Take transition_id and to_status_id from the same entry of list-transitions (its id and to.id). A transition whose screen asks for fields (hasScreen) can be refused, because this action sets none.

  • Add comment

    read back

    jira-add-comment

    Add one comment to an issue, visible to everyone who can see the issue. The text is sent as one Atlassian Document Format paragraph; formatting, mentions and restricted visibility are not offered. Jira can email the issue's watchers, as its notification scheme says. Returns the comment with its id.

  • Delete comment

    read back

    jira-delete-comment

    Delete one comment from an issue. Treat it as final.

  • Delete issue

    read back

    jira-delete-issue

    Delete one issue with its comments and history. Treat it as final. An issue with subtasks is refused; delete its subtasks before, or keep the issue.

Reads

  • Get myself

    jira-get-myself

    Get the Jira user the connection acts as: account id, display name, email (when the user's privacy settings show it), time zone and whether the account is active. Use its accountId to assign an issue to that user.

  • List projects

    jira-list-projects

    List the projects the user can see, 50 a page, optionally filtered by text in the key or name. Each project has its id, key, name and type. The response has startAt, maxResults, total and isLast; when isLast is false, pass startAt plus 50 as start_at for the next page.

  • List issue types

    jira-list-issue-types

    List the issue types a project can create, 50 a page: id, name, description and whether it is a subtask type. Use an id with create-issue; a subtask type needs a parent, which create-issue does not set. The response has startAt, maxResults and total.

  • List priorities

    jira-list-priorities

    List the issue priorities, 50 a page: id, name, description and whether it is the default. Use an id with set-issue-priority. The response has startAt, maxResults, total and isLast.

  • Search issues

    jira-search-issues

    Search issues with JQL, 25 a page. Each issue has its id and key, and the summary, status, assignee, priority, issue type, project, labels and dates. Jira refuses an unbounded query: include a restriction, for example project = OPS AND statusCategory != Done ORDER BY updated DESC. Recent changes can take a moment to show in search; read one issue with get-issue for its current state. When nextPageToken is in the response, pass it as next_page_token for the next page; the last page has none. No total count is returned.

  • Get issue

    jira-get-issue

    Get one issue: summary, status, assignee, reporter, priority, issue type, project, labels, description, parent, due date, resolution and dates. The description is Atlassian Document Format (a JSON document), not plain text. Comments are read with list-comments and the moves an issue can make with list-transitions.

  • List transitions

    jira-list-transitions

    List the transitions the user can make on an issue from its current status. Each has an id, a name and to, the status it moves the issue to (to.id, to.name). Pass the id and to.id to transition-issue. An empty list means the user may not transition the issue.

  • List comments

    jira-list-comments

    List an issue's comments, 20 a page, from the oldest unless order is -created. Each comment has its id, author, body (Atlassian Document Format), and created and updated times. The response has startAt, maxResults and total; pass startAt plus 20 as start_at for the next page.

  • Get comment

    jira-get-comment

    Get one comment on an issue: author, body (Atlassian Document Format), and created and updated times.

How do users connect? Each one brings their own Jira.

  1. 1.Call for the userYour server invokes the action for the signed-in user. Without a Jira connection, the SDK throws EndUserNotConnectedError with a connect link.
  2. 2.The user pastes a keyThe link opens a form that shows where in Jira's settings to create the key. The link lasts 10 minutes and works once.
  3. 3.Anlyon checks itThe key is checked with Jira before it is kept, and bound to {site}.atlassian.net. It is never shown back.
  4. 4.Your server confirmsYour server confirms the connection for the user who is signed in, and the call goes through.

Guardrails. Suggested limits and approvals, for you to review.

Suggested limits

  • 50 issues created a day
  • 100 issues renamed a day
  • 200 labels added a day
  • 100 priorities set a day
  • 100 issues assigned a day
  • 200 issues transitioned a day
  • 200 comments added a day
  • 20 comments deleted a day
  • 10 issues deleted a day

Suggested approvals

  • A person approves deleting an issue
  • A person approves deleting a comment
  • A person approves adding a comment

What the key must allow

  • An API token without scopes, from your Atlassian account
  • Your Jira site and the email the token belongs to
  • It acts as you, so its reach is your project permissions

Good to know

  • The credential reaches only the one site you name.
  • Jira has no idempotency key for a create. Anlyon sends it once and never repeats it.

For your own account

  1. 1.In Atlassian, open id.atlassian.com, Security, API tokens, and create an API token.
  2. 2.In Anlyon, open Actions, then Integrations, and choose Jira.
  3. 3.Enter your site (acme for acme.atlassian.net), your email and the token.
  4. 4.Anlyon checks them with Jira before storing them. They become a secret named JIRA, bound to your site's host.

Jira in your code. For one of your users, or for your own account.

Act for one of your users from your server, or connect your company's own Jira with the CLI.

jira.ts
import { Client, EndUserNotConnectedError } from "@anlyonhq/sdk";const anlyon = new Client({ apiKey: process.env.ANLYON_API_KEY! });try {  const { data } = await anlyon    .forUser(session.userId)    .actions.invoke("jira-create-issue", {      project_key: "OPS",      issue_type_id: "10001",      summary: "Checkout fails for saved cards",      description: "Reported by three customers this morning."    });  return { status: "done", grade: data.grade };} catch (error) {  if (error instanceof EndUserNotConnectedError) {    // The user connects their own Jira, then you call again.    return { status: "connect_required", url: error.connectUrl };  }  throw error;}

Let your agent act for your users, safely.

A few lines of server code, then send a user a connect link. Nothing to host.

$ claude mcp add --transport http anlyon https://api.anlyon.com/mcp