ima-claude 2.18.0 → 2.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +7 -0
  2. package/dist/cli.js +5 -1
  3. package/package.json +1 -1
  4. package/plugins/ima-claude/.claude-plugin/plugin.json +2 -2
  5. package/plugins/ima-claude/skills/agentic-workflows/SKILL.md +133 -0
  6. package/plugins/ima-claude/skills/agentic-workflows/references/phases/deliver.md +181 -0
  7. package/plugins/ima-claude/skills/agentic-workflows/references/phases/draft.md +99 -0
  8. package/plugins/ima-claude/skills/agentic-workflows/references/phases/gather.md +130 -0
  9. package/plugins/ima-claude/skills/agentic-workflows/references/phases/outline.md +106 -0
  10. package/plugins/ima-claude/skills/agentic-workflows/references/phases/review.md +137 -0
  11. package/plugins/ima-claude/skills/agentic-workflows/references/standards/draft-format.md +159 -0
  12. package/plugins/ima-claude/skills/agentic-workflows/references/standards/editorial-standards.md +160 -0
  13. package/plugins/ima-claude/skills/agentic-workflows/references/standards/outline-format.md +110 -0
  14. package/plugins/ima-claude/skills/agentic-workflows/references/templates/avada-construction-guide.md +263 -0
  15. package/plugins/ima-claude/skills/agentic-workflows/references/templates/avada-webinar-example.txt +275 -0
  16. package/plugins/ima-claude/skills/agentic-workflows/references/templates/cta-block-catalog.md +169 -0
  17. package/plugins/ima-claude/skills/agentic-workflows/references/templates/espo-email-preparation.md +241 -0
  18. package/plugins/ima-claude/skills/agentic-workflows/references/templates/webinar-recap-email-espo.html +339 -0
  19. package/plugins/ima-claude/skills/agentic-workflows/references/templates/webinar-reminder-email-espo.html +458 -0
  20. package/plugins/ima-claude/skills/agentic-workflows/references/workflows/editorial/webinar-summary.md +81 -0
  21. package/plugins/ima-claude/skills/design-to-code/SKILL.md +126 -0
  22. package/plugins/ima-claude/skills/design-to-code/references/guardrails.md +46 -0
  23. package/plugins/ima-claude/skills/design-to-code/references/phase-a-design-to-prompt.md +141 -0
  24. package/plugins/ima-claude/skills/design-to-code/references/phase-b-prompt-to-code.md +155 -0
  25. package/plugins/ima-claude/skills/design-to-code/references/prompt-template.md +95 -0
  26. package/plugins/ima-claude/skills/mcp-atlassian/SKILL.md +94 -14
  27. package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-attachments.md +115 -0
  28. package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-auth.md +103 -0
  29. package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-bulk.md +149 -0
  30. package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-misc.md +195 -0
  31. package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-sprints.md +158 -0
  32. package/plugins/ima-claude/skills/prompt-starter/SKILL.md +9 -6
@@ -1,19 +1,20 @@
1
1
  ---
2
2
  name: mcp-atlassian
3
3
  description: >-
4
- Atlassian MCP for Jira and Confluence operations (Claude's bundled integration).
5
- Token-efficient workflows for issue management, page creation, search, and user mentions.
4
+ Hybrid Atlassian integration — MCP-first for Jira/Confluence operations,
5
+ direct REST API (curl) for gaps the MCP doesn't cover.
6
6
  Use when: creating/editing Jira issues, searching with JQL/CQL, creating/updating Confluence
7
7
  pages, adding comments, transitioning issue status, looking up users, mentioning/tagging
8
- users in Jira or Confluence content, or any Atlassian Cloud operation. Triggers on: Jira,
9
- Confluence, JQL, CQL, sprint, epic, story, issue, wiki page, Atlassian, @mention in
10
- Jira/Confluence context. Provides 50-80% token savings over naive API usage through
11
- field filtering, pagination control, and format selection.
8
+ users in Jira or Confluence content, downloading/uploading attachments, sprint/board
9
+ management, bulk operations, or any Atlassian Cloud operation. Triggers on: Jira,
10
+ Confluence, JQL, CQL, sprint, epic, story, issue, wiki page, Atlassian, attachment,
11
+ board, backlog, @mention in Jira/Confluence context.
12
12
  ---
13
13
 
14
- # Atlassian MCP - Jira & Confluence Integration
14
+ # Atlassian Integration Hybrid MCP + Direct API
15
15
 
16
- Claude's bundled Atlassian MCP. All tools prefixed `mcp__claude_ai_Atlassian__`.
16
+ MCP-first: use bundled tools (prefixed `mcp__claude_ai_Atlassian__`) for covered operations.
17
+ Direct REST API (curl via Bash) for gaps. See [Decision Logic](#decision-logic) to pick the right approach.
17
18
 
18
19
  ## Bootstrap (Required First Call)
19
20
 
@@ -90,6 +91,51 @@ getAccessibleAtlassianResources → returns cloudId (UUID or site URL)
90
91
  | `search` | Rovo natural language search across Jira + Confluence |
91
92
  | `fetch` | Get detail by ARI (Atlassian Resource Identifier). Read-only |
92
93
 
94
+ ## Direct API — Gap Operations
95
+
96
+ When the MCP tools don't cover an operation, use `curl` via Bash with direct REST API calls.
97
+
98
+ ### When to Use Direct API
99
+
100
+ The MCP handles issue CRUD, transitions, comments, Confluence pages, and search well.
101
+ Use direct API **only** for operations not in the Tool Catalog above.
102
+
103
+ ### Auth Setup
104
+
105
+ Set ENV variables for direct API access. Two auth methods supported:
106
+
107
+ - **Gateway (Bearer)** — preferred for service accounts: `ATLASSIAN_CLOUD_ID` + `ATLASSIAN_BEARER_TOKEN`
108
+ - **Direct (Basic)** — fallback for personal tokens: `ATLASSIAN_DOMAIN` + `ATLASSIAN_EMAIL` + `ATLASSIAN_API_TOKEN`
109
+
110
+ Before first direct API call, verify auth works:
111
+ ```bash
112
+ curl -s -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
113
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/myself" | jq '.displayName'
114
+ ```
115
+
116
+ Full setup guide: [references/direct-api-auth.md](references/direct-api-auth.md)
117
+
118
+ ### Available Recipes
119
+
120
+ | Operation | Reference | Priority |
121
+ |-----------|-----------|----------|
122
+ | Attachment download/upload (Jira + Confluence) | [direct-api-attachments.md](references/direct-api-attachments.md) | P0 |
123
+ | Sprint/board management (Agile API) | [direct-api-sprints.md](references/direct-api-sprints.md) | P1 |
124
+ | Bulk operations (batch edit, bulk transition) | [direct-api-bulk.md](references/direct-api-bulk.md) | P1 |
125
+ | Comment edit/delete, watchers, components, versions, page deletion | [direct-api-misc.md](references/direct-api-misc.md) | P2 |
126
+
127
+ ### MCP vs Direct API Decision
128
+
129
+ ```
130
+ Can an MCP tool handle it? → Use the MCP tool (always preferred)
131
+ Attachment download/upload? → Direct API (references/direct-api-attachments.md)
132
+ Sprint or board operation? → Direct API (references/direct-api-sprints.md)
133
+ Bulk operation (5+ issues)? → Direct API (references/direct-api-bulk.md)
134
+ Edit/delete comment? → Direct API (references/direct-api-misc.md)
135
+ Watchers, components, versions? → Direct API (references/direct-api-misc.md)
136
+ Delete Confluence page? → Direct API (references/direct-api-misc.md)
137
+ ```
138
+
93
139
  ## User Mentions (@tagging)
94
140
 
95
141
  **This is the most error-prone area.** Follow these patterns exactly.
@@ -300,6 +346,28 @@ createConfluenceInlineComment(
300
346
  )
301
347
  ```
302
348
 
349
+ ### Download Attachments from an Issue (Hybrid)
350
+
351
+ ```
352
+ 1. getJiraIssue(issueIdOrKey: "PROJ-123", fields: ["attachment"])
353
+ → get attachment metadata (filename, content URL)
354
+ 2. curl -s -L -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
355
+ -o "mockup.png" "<content-url-from-step-1>"
356
+ ```
357
+
358
+ Full recipes: [references/direct-api-attachments.md](references/direct-api-attachments.md)
359
+
360
+ ### Move Issues to a Sprint (Direct API)
361
+
362
+ ```
363
+ 1. curl: GET /rest/agile/1.0/board?projectKeyOrId=PROJ → boardId
364
+ 2. curl: GET /rest/agile/1.0/board/{boardId}/sprint?state=active → sprintId
365
+ 3. curl: POST /rest/agile/1.0/sprint/{sprintId}/issue
366
+ body: {"issues": ["PROJ-101", "PROJ-102"]}
367
+ ```
368
+
369
+ Full recipes: [references/direct-api-sprints.md](references/direct-api-sprints.md)
370
+
303
371
  ## Decision Logic
304
372
 
305
373
  ```
@@ -328,12 +396,24 @@ Creating a Confluence page?
328
396
  → Need spaceId (NOT space key). Get from getConfluenceSpaces
329
397
  ```
330
398
 
331
- ## What This MCP Does NOT Support
399
+ ## Limitations
400
+
401
+ ### Not Supported (no MCP or direct API recipe)
332
402
 
333
- - Direct Atlassian storage format (XML) - uses Markdown or ADF only
403
+ - Direct Atlassian storage format (XML) MCP uses Markdown or ADF only
334
404
  - Confluence page permissions management
335
- - Jira board/sprint management
336
- - Jira custom field creation
337
- - Attachment uploads
338
- - Bulk operations
405
+ - Jira custom field creation (reading custom fields via `editJiraIssue` may work)
339
406
  - Confluence page templates
407
+ - Jira automation rules / webhooks
408
+
409
+ ### Covered by Direct API (not in MCP, but recipes available)
410
+
411
+ | Gap | Recipe |
412
+ |-----|--------|
413
+ | Attachment download/upload | [direct-api-attachments.md](references/direct-api-attachments.md) |
414
+ | Sprint/board management | [direct-api-sprints.md](references/direct-api-sprints.md) |
415
+ | Bulk operations | [direct-api-bulk.md](references/direct-api-bulk.md) |
416
+ | Comment edit/delete | [direct-api-misc.md](references/direct-api-misc.md) |
417
+ | Watchers | [direct-api-misc.md](references/direct-api-misc.md) |
418
+ | Components & versions | [direct-api-misc.md](references/direct-api-misc.md) |
419
+ | Confluence page deletion | [direct-api-misc.md](references/direct-api-misc.md) |
@@ -0,0 +1,115 @@
1
+ # Atlassian Direct API — Attachments
2
+
3
+ MCP gap: no attachment download or upload. Use these curl recipes.
4
+
5
+ See [direct-api-auth.md](direct-api-auth.md) for auth setup.
6
+
7
+ All examples use Gateway (Bearer) auth. Substitute Basic auth headers if needed.
8
+
9
+ ---
10
+
11
+ ### List Attachments on a Jira Issue
12
+
13
+ **API:** `GET /rest/api/3/issue/{issueKey}?fields=attachment`
14
+ **When:** Need to see what files are attached before downloading.
15
+
16
+ ```bash
17
+ curl -s \
18
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
19
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123?fields=attachment" \
20
+ | jq '.fields.attachment[] | {id, filename, mimeType, size, content}'
21
+ ```
22
+
23
+ **Tip:** You can also use MCP `getJiraIssue` with `fields: ["attachment"]` — the `content` URL in the response is what you need for download.
24
+
25
+ #### Response Shape
26
+
27
+ ```json
28
+ {
29
+ "id": "10001",
30
+ "filename": "mockup.png",
31
+ "mimeType": "image/png",
32
+ "size": 245678,
33
+ "content": "https://yoursite.atlassian.net/rest/api/3/attachment/content/10001"
34
+ }
35
+ ```
36
+
37
+ ---
38
+
39
+ ### Download a Single Attachment
40
+
41
+ **API:** `GET` the `content` URL from the attachment metadata
42
+ **When:** Need the actual binary file (image, PDF, document).
43
+
44
+ ```bash
45
+ # Get the download URL from attachment metadata
46
+ ATTACHMENT_URL=$(curl -s \
47
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
48
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123?fields=attachment" \
49
+ | jq -r '.fields.attachment[] | select(.filename == "mockup.png") | .content')
50
+
51
+ # Download the file
52
+ curl -s -L \
53
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
54
+ -o "mockup.png" \
55
+ "$ATTACHMENT_URL"
56
+ ```
57
+
58
+ #### Notes
59
+ - The `-L` flag follows redirects — Atlassian may redirect to a CDN URL
60
+ - For Gateway auth, the `content` URL may use the direct domain. The Bearer token works with both
61
+ - To download ALL attachments from an issue, pipe through a loop:
62
+
63
+ ```bash
64
+ curl -s \
65
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
66
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123?fields=attachment" \
67
+ | jq -r '.fields.attachment[] | "\(.content)\t\(.filename)"' \
68
+ | while IFS=$'\t' read -r url fname; do
69
+ curl -s -L -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" -o "$fname" "$url"
70
+ echo "Downloaded: $fname"
71
+ done
72
+ ```
73
+
74
+ ---
75
+
76
+ ### Upload Attachment to a Jira Issue
77
+
78
+ **API:** `POST /rest/api/3/issue/{issueKey}/attachments`
79
+ **When:** Attaching generated files, screenshots, or documents to an issue.
80
+
81
+ ```bash
82
+ curl -s -X POST \
83
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
84
+ -H "X-Atlassian-Token: no-check" \
85
+ -F "file=@/path/to/file.pdf" \
86
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123/attachments" \
87
+ | jq '.[0] | {id, filename, size}'
88
+ ```
89
+
90
+ #### Notes
91
+ - **Do NOT set `Content-Type: application/json`** — this is `multipart/form-data` (curl sets it automatically with `-F`)
92
+ - `X-Atlassian-Token: no-check` is required (XSRF protection bypass for attachments)
93
+ - Response is an array of attachment objects (one per file)
94
+ - Multiple files: use multiple `-F "file=@path"` flags
95
+
96
+ ---
97
+
98
+ ### Upload Attachment to a Confluence Page
99
+
100
+ **API:** `POST /wiki/rest/api/content/{pageId}/child/attachment`
101
+ **When:** Attaching files to Confluence pages.
102
+
103
+ ```bash
104
+ curl -s -X POST \
105
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
106
+ -H "X-Atlassian-Token: no-check" \
107
+ -F "file=@/path/to/diagram.png" \
108
+ "https://api.atlassian.com/ex/confluence/$ATLASSIAN_CLOUD_ID/wiki/rest/api/content/12345/child/attachment" \
109
+ | jq '.results[0] | {id: .id, title: .title}'
110
+ ```
111
+
112
+ #### Notes
113
+ - Use the **Confluence v1 API** (not v2) for attachment uploads
114
+ - Page ID is numeric — get it from MCP `getConfluencePage` or `searchConfluenceUsingCql`
115
+ - To update an existing attachment, use `PUT` with the same endpoint and filename
@@ -0,0 +1,103 @@
1
+ # Atlassian Direct REST API — Authentication
2
+
3
+ When the bundled MCP tools don't cover an operation, use `curl` via Bash with these auth patterns.
4
+
5
+ ## ENV Variables
6
+
7
+ | Variable | Required | Purpose | Example |
8
+ |----------|----------|---------|---------|
9
+ | `ATLASSIAN_CLOUD_ID` | Yes (gateway) | Cloud instance ID | `a1b2c3d4-e5f6-...` |
10
+ | `ATLASSIAN_BEARER_TOKEN` | Yes (gateway) | Service account token (`ATSTT...`) | `ATSTT...` |
11
+ | `ATLASSIAN_DOMAIN` | Yes (basic) | Site domain | `yoursite.atlassian.net` |
12
+ | `ATLASSIAN_EMAIL` | Yes (basic) | Account email | `you@company.com` |
13
+ | `ATLASSIAN_API_TOKEN` | Yes (basic) | Personal API token | `abc123...` |
14
+
15
+ **Choose one auth method.** Gateway (Bearer) is preferred for service accounts. Basic is the fallback for personal tokens.
16
+
17
+ ## Base URLs
18
+
19
+ ### Jira REST API v3
20
+
21
+ | Auth Method | Base URL |
22
+ |-------------|----------|
23
+ | Gateway (Bearer) | `https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3` |
24
+ | Direct (Basic) | `https://$ATLASSIAN_DOMAIN/rest/api/3` |
25
+
26
+ ### Jira Agile API v1
27
+
28
+ | Auth Method | Base URL |
29
+ |-------------|----------|
30
+ | Gateway (Bearer) | `https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/agile/1.0` |
31
+ | Direct (Basic) | `https://$ATLASSIAN_DOMAIN/rest/agile/1.0` |
32
+
33
+ ### Confluence REST API
34
+
35
+ | Auth Method | Base URL |
36
+ |-------------|----------|
37
+ | Gateway (Bearer) | `https://api.atlassian.com/ex/confluence/$ATLASSIAN_CLOUD_ID/wiki/rest/api` |
38
+ | Direct (Basic) | `https://$ATLASSIAN_DOMAIN/wiki/rest/api` |
39
+
40
+ ### Confluence v2 API
41
+
42
+ | Auth Method | Base URL |
43
+ |-------------|----------|
44
+ | Gateway (Bearer) | `https://api.atlassian.com/ex/confluence/$ATLASSIAN_CLOUD_ID/wiki/api/v2` |
45
+ | Direct (Basic) | `https://$ATLASSIAN_DOMAIN/wiki/api/v2` |
46
+
47
+ ## Reusable Header Blocks
48
+
49
+ ### Gateway (Bearer) — copy into any curl
50
+
51
+ ```bash
52
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
53
+ -H "Content-Type: application/json" \
54
+ -H "Accept: application/json"
55
+ ```
56
+
57
+ ### Direct (Basic) — copy into any curl
58
+
59
+ ```bash
60
+ -H "Authorization: Basic $(echo -n "$ATLASSIAN_EMAIL:$ATLASSIAN_API_TOKEN" | base64)" \
61
+ -H "Content-Type: application/json" \
62
+ -H "Accept: application/json"
63
+ ```
64
+
65
+ ## Verify Your Setup
66
+
67
+ Run this before any direct API session. Should return your display name.
68
+
69
+ ```bash
70
+ # Gateway auth
71
+ curl -s \
72
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
73
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/myself" \
74
+ | jq '.displayName'
75
+
76
+ # Basic auth
77
+ curl -s \
78
+ -H "Authorization: Basic $(echo -n "$ATLASSIAN_EMAIL:$ATLASSIAN_API_TOKEN" | base64)" \
79
+ "https://$ATLASSIAN_DOMAIN/rest/api/3/myself" \
80
+ | jq '.displayName'
81
+ ```
82
+
83
+ ## Getting the Cloud ID
84
+
85
+ The MCP's `getAccessibleAtlassianResources` returns the `cloudId`. You can also get it via:
86
+
87
+ ```bash
88
+ curl -s \
89
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
90
+ "https://api.atlassian.com/oauth/token/accessible-resources" \
91
+ | jq '.[0].id'
92
+ ```
93
+
94
+ Store it: `export ATLASSIAN_CLOUD_ID="<value>"`
95
+
96
+ ## Error Patterns
97
+
98
+ | Status | Meaning | Fix |
99
+ |--------|---------|-----|
100
+ | 401 | Bad credentials | Check token/email/apiToken values |
101
+ | 403 | Missing scope or permission | Token needs the right OAuth scopes or project access |
102
+ | 404 | Wrong base URL or resource not found | Check gateway vs direct URL, verify resource exists |
103
+ | 429 | Rate limited | Wait and retry; Jira Cloud allows ~100 req/min |
@@ -0,0 +1,149 @@
1
+ # Atlassian Direct API — Bulk Operations
2
+
3
+ MCP gap: no batch/bulk endpoints. Use these patterns for multi-issue operations.
4
+
5
+ See [direct-api-auth.md](direct-api-auth.md) for auth setup.
6
+
7
+ All examples use Gateway (Bearer) auth.
8
+
9
+ ---
10
+
11
+ ### Bulk Edit Issues (Jira v3)
12
+
13
+ **API:** `POST /rest/api/3/issue/bulk`
14
+ **When:** Updating the same fields on many issues at once.
15
+
16
+ ```bash
17
+ curl -s -X POST \
18
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
19
+ -H "Content-Type: application/json" \
20
+ -d '{
21
+ "issueUpdates": [
22
+ {
23
+ "issueIdOrKey": "PROJ-101",
24
+ "fields": {"priority": {"name": "High"}, "labels": ["urgent"]}
25
+ },
26
+ {
27
+ "issueIdOrKey": "PROJ-102",
28
+ "fields": {"priority": {"name": "High"}, "labels": ["urgent"]}
29
+ }
30
+ ]
31
+ }' \
32
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/bulk" \
33
+ | jq '.errors'
34
+ ```
35
+
36
+ #### Notes
37
+ - Max ~50 issues per request (Atlassian soft limit)
38
+ - Response includes per-issue errors — check `.errors` for partial failures
39
+ - Each issue can have different field updates
40
+ - This endpoint may not be available on all Jira Cloud plans
41
+
42
+ ---
43
+
44
+ ### Bulk Transition (Loop Pattern)
45
+
46
+ **When:** Moving many issues through a workflow step (e.g., close all done issues).
47
+
48
+ This uses the MCP `transitionJiraIssue` in a loop. No direct bulk transition API exists.
49
+
50
+ **Pattern:**
51
+ 1. Find issues with JQL via MCP `searchJiraIssuesUsingJql`
52
+ 2. Get transitions for one representative issue via MCP `getTransitionsForJiraIssue`
53
+ 3. Loop `transitionJiraIssue` for each issue
54
+
55
+ ```
56
+ # Step 1: Find issues
57
+ searchJiraIssuesUsingJql
58
+ cloudId: "<cloudId>"
59
+ jql: "project = PROJ AND status = 'In Review'"
60
+ maxResults: 50
61
+ fields: ["summary", "status"]
62
+
63
+ # Step 2: Get transition ID (same for all issues in the same workflow)
64
+ getTransitionsForJiraIssue
65
+ cloudId: "<cloudId>"
66
+ issueIdOrKey: "PROJ-101" # any issue from the results
67
+
68
+ # Step 3: Transition each issue
69
+ # Repeat for each issue key from Step 1:
70
+ transitionJiraIssue
71
+ cloudId: "<cloudId>"
72
+ issueIdOrKey: "PROJ-101"
73
+ transition: {"id": "<transitionId>"}
74
+ ```
75
+
76
+ #### Notes
77
+ - Rate limit: ~100 requests/minute for Jira Cloud
78
+ - For large batches (50+ issues), add a brief delay between calls
79
+ - If issues span different workflows, group by issue type and get transitions per group
80
+
81
+ ---
82
+
83
+ ### Paginated JQL Fetch
84
+
85
+ **When:** Fetching more results than the default page size (50).
86
+
87
+ Use MCP `searchJiraIssuesUsingJql` with pagination:
88
+
89
+ ```
90
+ # Page 1
91
+ searchJiraIssuesUsingJql
92
+ cloudId: "<cloudId>"
93
+ jql: "project = PROJ AND status != Done"
94
+ maxResults: 50
95
+ startAt: 0
96
+ fields: ["summary", "status"]
97
+
98
+ # Page 2
99
+ searchJiraIssuesUsingJql
100
+ cloudId: "<cloudId>"
101
+ jql: "project = PROJ AND status != Done"
102
+ maxResults: 50
103
+ startAt: 50
104
+ fields: ["summary", "status"]
105
+ ```
106
+
107
+ Or via direct API for more control:
108
+
109
+ ```bash
110
+ curl -s \
111
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
112
+ -H "Content-Type: application/json" \
113
+ -d '{
114
+ "jql": "project = PROJ AND status != Done ORDER BY created DESC",
115
+ "maxResults": 100,
116
+ "startAt": 0,
117
+ "fields": ["summary", "status", "assignee"]
118
+ }' \
119
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/search" \
120
+ | jq '{total: .total, count: (.issues | length), issues: [.issues[] | {key, summary: .fields.summary, status: .fields.status.name}]}'
121
+ ```
122
+
123
+ #### Notes
124
+ - MCP `searchJiraIssuesUsingJql` max is typically 50 per page
125
+ - Direct API `POST /search` supports up to 100 per page
126
+ - Check `.total` in response to know when to stop paginating
127
+ - Use `POST` (not `GET`) for the search endpoint — JQL strings can exceed URL length limits
128
+
129
+ ---
130
+
131
+ ### Bulk Add Labels
132
+
133
+ **When:** Tagging many issues with the same label.
134
+
135
+ ```bash
136
+ # For each issue, use the update operations syntax
137
+ for KEY in PROJ-101 PROJ-102 PROJ-103; do
138
+ curl -s -X PUT \
139
+ -H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
140
+ -H "Content-Type: application/json" \
141
+ -d '{"update": {"labels": [{"add": "reviewed"}]}}' \
142
+ "https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/$KEY"
143
+ echo "Labeled: $KEY"
144
+ done
145
+ ```
146
+
147
+ #### Notes
148
+ - Uses Jira's `update` operations (add/remove/set) — more precise than replacing the entire `fields.labels` array
149
+ - Same pattern works for `components`, `fixVersions`, and other array fields