Automated summary
Documents how to use the Jira Cloud REST API v3 to manage projects, issues, workflows, agile boards, and automations.
Strengths
- Provides concrete TypeScript snippets for authentication, issue CRUD, bulk creation, and workflow transitions
- Covers a broad surface: JQL, webhooks, sprints, permissions, CI/CD, and Forge apps
- Clear step-by-step progression from authentication to project and issue-type configuration
Limitations
- Focused on Jira Cloud; Jira Server/Data Center APIs differ
- Custom field IDs and workflow schemes vary per instance and must be discovered
- Several operations (issue types, schemes, permissions) require admin rights and a valid API token
Use it when you need to script, automate, or administer Jira Cloud through its REST API instead of the UI.
Avoid it for Jira Server/Data Center or for purely manual Jira usage with no technical integration.
Security analysis
SafeThe skill is a documentation/reference guide for Jira Cloud REST API v3. It contains only illustrative TypeScript client code that calls the user's own Jira instance. Credentials are correctly sourced from an environment variable (process.env.JIRA_API_TOKEN) rather than being hardcoded or exfiltrated, URLs are placeholders, and there are no destructive commands (no rm, no curl|sh), no obfuscation, and no attempts to disable safety controls or redirect the agent. The network/API access described is scoped to the stated legitimate purpose of Jira automation.
No concerns found
How this analysis is madeExamples
Using the Jira REST API v3, create a software project with key ENG and add 15 backlog stories with labels and story points.Write a script that finds all Jira issues in the To Do status with the label 'ready' and transitions them to In Progress.Create a JQL query for all open bugs assigned to me in the current sprint, and fetch them via the Jira API.name: jira description: >- Manage projects, issues, and workflows with Jira Cloud. Use when a user asks to set up Jira projects, create and manage issues, configure workflows, build Jira integrations, automate issue transitions, set up boards (Scrum/Kanban), manage sprints, use Jira REST API v3, create webhooks, build custom JQL queries, configure permissions and schemes, set up automation rules, or integrate Jira with CI/CD pipelines. Covers project administration, issue tracking, agile boards, API automation, and Atlassian Connect/Forge apps. license: Apache-2.0 compatibility: Node.js 18+ or any HTTP client (REST API v3) metadata: author: terminal-skills version: 1.0.0 category: productivity tags: - jira - atlassian - project-management - issue-tracker - agile
Jira
Overview
Automate and extend Jira Cloud — the most widely used issue tracker and project management tool. This skill covers project setup, issue CRUD, workflow configuration, Scrum and Kanban boards, sprint management, JQL (Jira Query Language) for advanced searches, REST API v3 for automation, webhooks, and building Atlassian Forge apps.
Instructions
Step 1: Authentication
// Basic auth with API token — simplest for scripts and integrations.
// Generate token at: https://id.atlassian.com/manage-profile/security/api-tokens
const JIRA_BASE = "https://your-domain.atlassian.net";
const AUTH = Buffer.from(`your-email@company.com:${process.env.JIRA_API_TOKEN}`).toString("base64");
async function jira(method: string, path: string, body?: any) {
const res = await fetch(`${JIRA_BASE}/rest/api/3${path}`, {
method,
headers: { Authorization: `Basic ${AUTH}`, "Content-Type": "application/json" },
body: body ? JSON.stringify(body) : undefined,
});
if (!res.ok) throw new Error(`Jira ${method} ${path}: ${res.status} ${await res.text()}`);
return res.status === 204 ? null : res.json();
}
// For Marketplace apps, use OAuth 2.0 (3LO) — register at developer.atlassian.com
Step 2: Projects & Issue Types
// Create a project: projectTypeKey = "software" | "business" | "service_desk"
const project = await jira("POST", "/project", {
key: "ENG", // 2-10 char uppercase key (ENG-1, ENG-2)
name: "Engineering",
projectTypeKey: "software",
leadAccountId: "5f1234abc...",
description: "Core product engineering",
});
// Default software issue types: Epic, Story, Task, Bug, Sub-task
// Custom issue type (requires admin)
const customType = await jira("POST", "/issuetype", {
name: "Tech Debt", type: "standard", hierarchyLevel: 0,
});
Step 3: Issues — CRUD & Bulk Operations
// Create an issue (descriptions use Atlassian Document Format, not plain text)
const issue = await jira("POST", "/issue", {
fields: {
project: { key: "ENG" },
issuetype: { name: "Story" },
summary: "Implement user authentication flow",
description: {
type: "doc", version: 1,
content: [{ type: "paragraph", content: [{ type: "text", text: "Build OAuth2 login with MFA support." }] }],
},
priority: { name: "High" }, // Highest, High, Medium, Low, Lowest
labels: ["auth", "security"],
assignee: { accountId: "5f1234abc..." },
customfield_10016: 8, // Story points (custom field ID varies)
components: [{ name: "Backend" }],
},
});
// Transition through workflow (e.g., To Do → In Progress)
const transitions = await jira("GET", `/issue/${issue.key}/transitions`);
const target = transitions.transitions.find((t: any) => t.name === "In Progress");
await jira("POST", `/issue/${issue.key}/transitions`, {
transition: { id: target.id },
});
// Bulk create (up to 50 per request)
const bulkResult = await jira("POST", "/issue/bulk", {
issueUpdates: [
{ fields: { project: { key: "ENG" }, issuetype: { name: "Task" }, summary: "Set up CI pipeline" } },
{ fields: { project: { key: "ENG" }, issuetype: { name: "Bug" }, summary: "Fix login timeout", priority: { name: "High" } } },
],
});
Step 4: JQL — Jira Query Language
// JQL search — paginated via startAt/maxResults
const myBugs = await jira("POST", "/search", {
jql: `project = ENG AND issuetype = Bug AND priority in (High, Highest)
AND assignee = currentUser() AND sprint in openSprints()
ORDER BY priority DESC`,
maxResults: 50, fields: ["summary", "status", "priority", "assignee"],
});
// Stale work detection
const staleIssues = await jira("POST", "/search", {
jql: `project = ENG AND status != Done AND updated <= -14d ORDER BY updated ASC`,
maxResults: 100, fields: ["summary", "status", "assignee", "updated"],
});
// Key JQL functions: currentUser(), membersOf("team"), openSprints(),
// futureSprints(), startOfDay(), endOfWeek(), startOfMonth(-1)
Step 5: Boards & Sprints (Agile API)
// Agile API uses a separate base path: /rest/agile/1.0
async function agile(method: string, path: string, body?: any) {
const res = await fetch(`${JIRA_BASE}/rest/agile/1.0${path}`, {
method,
headers: { Authorization: `Basic ${AUTH}`, "Content-Type": "application/json" },
body: body ? JSON.stringify(body) : undefined,
});
if (!res.ok) throw new Error(`Agile ${method} ${path}: ${res.status}`);
return res.json();
}
// Boards, sprints, sprint issues
const boards = await agile("GET", "/board?type=scrum");
const sprints = await agile("GET", `/board/${boardId}/sprint?state=active`);
const sprintIssues = await agile("GET", `/sprint/${sprints.values[0].id}/issue?fields=summary,status,assignee`);
// Create sprint, move issues, close sprint
const newSprint = await agile("POST", "/sprint", {
name: "Sprint 24", startDate: "2026-02-24T09:00:00.000Z",
endDate: "2026-03-07T17:00:00.000Z", originBoardId: boardId,
goal: "Complete auth module and API v2 migration",
});
await agile("POST", `/sprint/${newSprint.id}/issue`, { issues: ["ENG-142", "ENG-143"] });
await agile("POST", `/sprint/${newSprint.id}`, { state: "closed", completeDate: new Date().toISOString() });
Step 6: Webhooks & Automation
// Register a webhook for issue events
const webhook = await jira("POST", "/webhook", {
name: "Epic completion handler",
url: "https://your-app.com/webhook/jira",
events: ["jira:issue_updated"],
filters: { "issue-related-events-section": `project = ENG AND issuetype = Epic` },
});
// Webhook handler: auto-transition Epic children when Epic is marked Done
app.post("/webhook/jira", async (req, res) => {
res.sendStatus(200);
const { issue, changelog } = req.body;
const statusChange = changelog?.items?.find((i: any) => i.field === "status" && i.toString === "Done");
if (!statusChange || issue.fields.issuetype.name !== "Epic") return;
const children = await jira("POST", "/search", {
jql: `"Epic Link" = ${issue.key} AND status != Done`, fields: ["status"],
});
for (const child of children.issues) {
const tr = await jira("GET", `/issue/${child.key}/transitions`);
const done = tr.transitions.find((t: any) => t.name === "Done");
if (done) await jira("POST", `/issue/${child.key}/transitions`, { transition: { id: done.id } });
}
});
Step 7: Dashboards & Reporting
// Calculate velocity from closed sprints
async function getVelocity(boardId: number, sprintCount = 5) {
const closedSprints = await agile("GET", `/board/${boardId}/sprint?state=closed&maxResults=${sprintCount}`);
return Promise.all(closedSprints.values.map(async (sprint: any) => {
const issues = await agile("GET", `/sprint/${sprint.id}/issue?fields=customfield_10016,status`);
const points = issues.issues
.filter((i: any) => i.fields.status.statusCategory.key === "done")
.reduce((sum: number, i: any) => sum + (i.fields.customfield_10016 || 0), 0);
return { sprint: sprint.name, points };
}));
}
// Create a shared filter (saved JQL query)
const filter = await jira("POST", "/filter", {
name: "Sprint Burndown - ENG",
jql: "project = ENG AND sprint in openSprints() ORDER BY rank ASC",
sharePermissions: [{ type: "project", project: { id: project.id } }],
});
Step 8: Permissions
// Check permissions and add users to project roles
const permission = await jira("GET", `/mypermissions?projectKey=ENG&permissions=EDIT_ISSUES,ASSIGN_ISSUES`);
await jira("POST", `/project/${projectKey}/role/${roleId}`, {
user: ["accountId1", "accountId2"],
});
// Common roles: 10002=Administrators, 10001=Developers, 10000=Users
Examples
Example 1: Set up a new Scrum project with sprint and initial backlog
User prompt: "Create a Jira project called 'Payments' with key PAY. Set up a two-week sprint starting next Monday. Create 5 stories for building a Stripe integration: webhook handler, checkout flow, subscription management, refund processing, and payment dashboard. Assign them all to the new sprint with story points."
The agent will:
- Create the project via
POST /projectwithprojectTypeKey: "software"and keyPAY. - Find the board ID for the new project using the Agile API.
- Create a sprint with a two-week window starting from next Monday.
- Bulk-create 5 Story issues with descriptive summaries, appropriate story point estimates (3, 5, 8, 5, 3), and labels like
paymentsandstripe. - Move all 5 issues into the new sprint using
POST /sprint/{id}/issue.
Example 2: Generate a weekly stale issues report
User prompt: "Find all unresolved ENG issues that haven't been updated in over 14 days. Group them by assignee and tell me who has the most stale work."
The agent will:
- Run a JQL search:
project = ENG AND status != Done AND updated <= -14d ORDER BY assignee ASC, updated ASCwith fields for summary, status, assignee, and updated date. - Group the results by assignee account ID.
- Output a summary showing each assignee, their count of stale issues, and the oldest one by last update date.
- Highlight any issues not updated in over 30 days as critical.
Guidelines
- Use API tokens (basic auth) for scripts and personal integrations; OAuth 2.0 (3LO) is only needed for Marketplace apps that act on behalf of multiple users.
- Jira Cloud uses Atlassian Document Format (ADF) for descriptions and comments, not plain text; always construct the
{ type: "doc", version: 1, content: [...] }structure. - Custom field IDs (like
customfield_10016for story points) vary between Jira instances; useGET /issue/createmetato discover the correct field IDs for your project. - The Agile API (
/rest/agile/1.0) is separate from the core API (/rest/api/3); use it for boards, sprints, backlog, and ranking operations. - JQL search results are paginated with a default limit of 50; use
startAtandmaxResultsto iterate through large result sets. - When transitioning issues, always fetch available transitions first with
GET /issue/{key}/transitions; transition IDs are not stable across different workflow configurations.
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/jira-cloud-project-issue-management-mvda8809' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/jira-cloud-project-issue-management-mvda8809/download' --output '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md.part' && mv '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md.part' '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
Environment declared by the author: Node.js 18+ or any HTTP client (REST API v3)
No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md' && test -s '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/jira' && cp -R '.skill-downloads/jira-cloud-project-issue-management-mvda8809' '.claude/skills/jira'Cursor
test -f '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md' && test -s '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md' && mkdir -p '.cursor/skills' && test ! -e '.cursor/skills/jira' && cp -R '.skill-downloads/jira-cloud-project-issue-management-mvda8809' '.cursor/skills/jira'Codex
test -f '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md' && test -s '.skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md' && mkdir -p '.agents/skills' && test ! -e '.agents/skills/jira' && cp -R '.skill-downloads/jira-cloud-project-issue-management-mvda8809' '.agents/skills/jira'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/jira-cloud-project-issue-management-mvda8809'openskills read 'jira-cloud-project-issue-management-mvda8809'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/jira-cloud-project-issue-management-mvda8809/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
PDF Reader
Productivity
Read and extract text from PDF files, including documents, reports, contracts, and spreadsheets. Works with local files, URLs, and WhatsApp attachments. Use whenever PDF content is needed, even if not explicitly requested.
Discord Messaging Workflows
Productivity
Use the message tool to send, edit, and moderate Discord messages with interactive components.
Interactive Verdict Preview
Productivity
Generate an interactive HTML preview of keep/drop verdicts for maintainer review, then process the pasted feedback JSON.