Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to Jira

Scalekit connector
Open markdown

The Jira connector lets your AI agent act in each user's Jira account. Each user signs in to Jira once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 374 tools.

Tools
374
What they doRead · write · destructive
189 · 130 · 55189 read130 write55 destructive
Users sign in with
OAuth app
Scalekit's or your own

What you can do

  • Read issues: fetch issue details, comments, attachments, and linked items
  • Create and update issues: file bugs, stories, and tasks; update status and assignees
  • Manage projects: list projects, sprints, and boards
  • Search with JQL: execute Jira Query Language searches for advanced filtering

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Jira connection

    In AgentKit > Connections, create a Jira connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Jira, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.

    Use your own OAuth app

    Register your Scalekit environment with the Jira connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically. Then complete the configuration in your application as follows:

    1. Set up auth redirects

      • In Scalekit dashboard, go to AgentKit > Connections > Create Connection. Find Jira and click Create. Copy the redirect URI. It looks like https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback.

        Copy redirect URI from Scalekit dashboard

      • In the Atlassian Developer Console, open your app and go to Authorization → OAuth 2.0 (3LO) → Configure.

      • Paste the copied URI into the Callback URL field and click Save changes.

        Add callback URL in Atlassian Developer Console for Jira

    2. Get client credentials

      In the Atlassian Developer Console, open your app and go to Settings:

      • Client ID — listed under Client ID
      • Client Secret — listed under Secret
    3. Add credentials in Scalekit

      • In Scalekit dashboard, go to AgentKit > Connections and open the connection you created.

      • Enter your credentials:

        Add credentials for Jira in Scalekit dashboard

      • Click Save.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'jira'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Jira:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'jira_myself_get',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • jira_agile_issue_estimation_getRetrieve the estimation value of an issue for a specific board, along with the fieldId of the field used for estimation on that board (e.g.Read-only

    Get Issue Estimation for Board

    Retrieve the estimation value of an issue for a specific board, along with the fieldId of the field used for estimation on that board (e.g. story points or original time estimate). The boardId is required to determine which field is used for estimation.

    Inputs

    boardIdintegerrequired
    The ID of the board required to determine which field is used for estimation. Returns 400 if not provided.
    issueIdOrKeystringrequired
    The ID or key of the requested issue
  • jira_agile_issue_getRetrieve details of a Jira issue by its ID or key using the Jira Software Agile API.Read-only

    Get Agile Issue

    Retrieve details of a Jira issue by its ID or key using the Jira Software Agile API. Returns fields, status, assignee, priority, and other navigable and Agile-specific metadata (e.g. sprint, epic, estimation). Use the fields parameter to limit the response to specific fields, and expand to include additional data such as changelog.

    Inputs

    issueIdOrKeystringrequired
    The issue ID (e.g. 10001) or key (e.g. PROJ-123) to retrieve
    expandstring
    Comma-separated list of additional data to include (e.g. renderedFields,names,changelog,transitions,operations,editmeta,versionedRepresentations)
    fieldsstring
    Comma-separated list of fields to return (use * for all navigable fields, or -field to exclude a field). By default all navigable and Agile fields are returned.
    updateHistoryboolean
    A boolean indicating whether the issue retrieved by this method should be added to the current user's issue history
  • jira_all_users_default_listReturns a paginated list of all users, including active, inactive, and previously deleted users that have an Atlassian account.Read-only

    List All Users (Default)

    Returns a paginated list of all users, including active, inactive, and previously deleted users that have an Atlassian account. Privacy controls may hide fields like email address depending on user preferences. This is the default users listing endpoint (/rest/api/3/users); prefer this or the Get All Users tool interchangeably.

    Inputs

    expandstring
    Additional data to include in the response for each user (implementation-specific expand options).
    maxResultsinteger
    The maximum number of items to return per page. Limited to 1000.default 50
    startAtinteger
    The index of the first item to return in a page of results (page offset), default 0.default 0
  • jira_all_users_listReturns a paginated list of all users, including active, inactive, and previously deleted users that have an Atlassian account.Read-only

    List All Users

    Returns a paginated list of all users, including active, inactive, and previously deleted users that have an Atlassian account. Privacy controls may hide fields like email address depending on user preferences. Uses the /rest/api/3/users/search endpoint.

    Inputs

    expandstring
    Additional data to include in the response for each user (implementation-specific expand options).
    maxResultsinteger
    The maximum number of items to return per page. Limited to 1000.default 50
    startAtinteger
    The index of the first item to return in a page of results (page offset), default 0.default 0
  • jira_attachment_content_getDownload the binary contents of a Jira attachment by its ID.Read-only

    Get Attachment Content

    Download the binary contents of a Jira attachment by its ID. Optionally scope the download to a byte range using the Range header, or disable the redirect Jira normally issues to the actual file location. Use Get Attachment for metadata only, or Get Attachment Thumbnail for a scaled preview image.

    Inputs

    idstringrequired
    The ID of the attachment whose content should be downloaded.
    redirectboolean
    Whether a redirect is provided for the attachment download. Set to false if your client does not automatically follow redirects, to avoid multiple requests.default true
  • jira_attachment_expand_human_getGet the metadata for an attachment's contents when the attachment is an archive (currently only ZIP is supported), along with metadata for the attachment itself such as its ID and name.Read-only

    Get Expanded Attachment (Human-Readable)

    Get the metadata for an attachment's contents when the attachment is an archive (currently only ZIP is supported), along with metadata for the attachment itself such as its ID and name. Use this to present attachment archive contents to a user. To process the archive contents programmatically without the attachment's own metadata, use Get Expanded Attachment (Raw) instead.

    Inputs

    idstringrequired
    The ID of the attachment to expand.
  • jira_attachment_expand_raw_getGet the metadata for the contents of an attachment when it is an archive (currently only ZIP is supported).Read-only

    Get Expanded Attachment (Raw)

    Get the metadata for the contents of an attachment when it is an archive (currently only ZIP is supported). Returns only the metadata for the contents of the archive, not the attachment's own metadata. Use this when processing archive contents programmatically. To retrieve data intended for display to a user, use Get Expanded Attachment (Human-Readable) instead.

    Inputs

    idstringrequired
    The ID of the attachment to expand.
  • jira_attachment_getGet metadata for a Jira issue attachment by its ID.Read-only

    Get Attachment

    Get metadata for a Jira issue attachment by its ID. Returns the filename, MIME type, size, creation date, author, and download URL.

    Inputs

    idstringrequired
    The attachment ID to retrieve metadata for

Workflows

Don’t worry about the Jira cloud ID in the path. Scalekit resolves {{cloud_id}} from the connected account configuration automatically. A request with path="/rest/api/3/myself" is routed to the correct Atlassian instance without any extra setup.

Proxy API call
// Fetch the authenticated user's Jira profile
const me = await actions.request({
connectionName: 'jira',
identifier: 'user_123',
path: '/rest/api/3/myself',
method: 'GET',
});
console.log(me);
Get the current user
const me = await actions.executeTool({
connector: 'jira',
identifier: 'user_123',
toolName: 'jira_myself_get',
toolInput: {},
});
console.log(me.accountId, me.displayName);
Advanced enrichment workflow

This example shows a complete Jira issue triage pipeline: search open bugs assigned to the current user, log triage time, transition issues to “In Progress”, create follow-up tasks, and link them — all in one automated flow.

const opts = { connector: 'jira', identifier: 'user_123' };
async function triageMyBugs(projectKey: string) {
// 1. Get the current user's account ID
const me = await actions.executeTool({
toolName: 'jira_myself_get',
...opts,
toolInput: {},
});
console.log(`Triaging bugs for: ${me.displayName}`);
// 2. Search for open bugs assigned to the current user
const searchResult = await actions.executeTool({
toolName: 'jira_issues_search',
...opts,
toolInput: {
jql: `project = ${projectKey} AND issuetype = Bug AND assignee = currentUser() AND status = "To Do" ORDER BY priority DESC`,
maxResults: 10,
fields: 'summary,status,priority,issuetype',
},
});
const bugs = searchResult.issues ?? [];
console.log(`Found ${bugs.length} open bugs`);
for (const bug of bugs) {
const issueKey = bug.key;
console.log(`
Processing ${issueKey}: ${bug.fields.summary}`);
// 3. Add a triage comment
await actions.executeTool({
toolName: 'jira_issue_comment_add',
...opts,
toolInput: {
issueIdOrKey: issueKey,
body: `Automated triage: picking up for sprint. Moving to In Progress.`,
},
});
// 4. Log 30 minutes of triage work
await actions.executeTool({
toolName: 'jira_issue_worklog_add',
...opts,
toolInput: {
issueIdOrKey: issueKey,
timeSpent: '30m',
comment: 'Initial triage and review',
},
});
// 5. Get available transitions and move to "In Progress"
const transitions = await actions.executeTool({
toolName: 'jira_issue_transitions_list',
...opts,
toolInput: { issueIdOrKey: issueKey },
});
const inProgress = transitions.transitions?.find(
(t: any) => t.name.toLowerCase().includes('progress')
);
if (inProgress) {
await actions.executeTool({
toolName: 'jira_issue_transition',
...opts,
toolInput: {
issueIdOrKey: issueKey,
transitionId: inProgress.id,
comment: 'Starting work on this bug.',
},
});
console.log(` → Transitioned to "${inProgress.name}"`);
}
// 6. Create a linked follow-up task for the fix
const followUp = await actions.executeTool({
toolName: 'jira_issue_create',
...opts,
toolInput: {
project_key: projectKey,
summary: `[Fix] ${bug.fields.summary}`,
issue_type: 'Task',
description: `Follow-up fix task for bug ${issueKey}.`,
assignee_account_id: me.accountId,
priority_name: bug.fields.priority?.name ?? 'Medium',
},
});
console.log(` → Created follow-up: ${followUp.key}`);
// 7. Link the bug to its follow-up task
await actions.executeTool({
toolName: 'jira_issue_link_create',
...opts,
toolInput: {
link_type_name: 'Relates',
inward_issue_key: issueKey,
outward_issue_key: followUp.key,
},
});
}
console.log('\nTriage complete.');
}
triageMyBugs('MYPROJECT').catch(console.error);