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.
- package/README.md +7 -0
- package/dist/cli.js +5 -1
- package/package.json +1 -1
- package/plugins/ima-claude/.claude-plugin/plugin.json +2 -2
- package/plugins/ima-claude/skills/agentic-workflows/SKILL.md +133 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/phases/deliver.md +181 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/phases/draft.md +99 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/phases/gather.md +130 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/phases/outline.md +106 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/phases/review.md +137 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/standards/draft-format.md +159 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/standards/editorial-standards.md +160 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/standards/outline-format.md +110 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/templates/avada-construction-guide.md +263 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/templates/avada-webinar-example.txt +275 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/templates/cta-block-catalog.md +169 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/templates/espo-email-preparation.md +241 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/templates/webinar-recap-email-espo.html +339 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/templates/webinar-reminder-email-espo.html +458 -0
- package/plugins/ima-claude/skills/agentic-workflows/references/workflows/editorial/webinar-summary.md +81 -0
- package/plugins/ima-claude/skills/design-to-code/SKILL.md +126 -0
- package/plugins/ima-claude/skills/design-to-code/references/guardrails.md +46 -0
- package/plugins/ima-claude/skills/design-to-code/references/phase-a-design-to-prompt.md +141 -0
- package/plugins/ima-claude/skills/design-to-code/references/phase-b-prompt-to-code.md +155 -0
- package/plugins/ima-claude/skills/design-to-code/references/prompt-template.md +95 -0
- package/plugins/ima-claude/skills/mcp-atlassian/SKILL.md +94 -14
- package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-attachments.md +115 -0
- package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-auth.md +103 -0
- package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-bulk.md +149 -0
- package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-misc.md +195 -0
- package/plugins/ima-claude/skills/mcp-atlassian/references/direct-api-sprints.md +158 -0
- 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
|
|
5
|
-
|
|
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,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
14
|
+
# Atlassian Integration — Hybrid MCP + Direct API
|
|
15
15
|
|
|
16
|
-
|
|
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
|
-
##
|
|
399
|
+
## Limitations
|
|
400
|
+
|
|
401
|
+
### Not Supported (no MCP or direct API recipe)
|
|
332
402
|
|
|
333
|
-
- Direct Atlassian storage format (XML)
|
|
403
|
+
- Direct Atlassian storage format (XML) — MCP uses Markdown or ADF only
|
|
334
404
|
- Confluence page permissions management
|
|
335
|
-
- Jira
|
|
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
|