ima-claude 2.16.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 +16 -1
- package/dist/cli.js +9 -1
- package/package.json +1 -1
- package/plugins/ima-claude/.claude-plugin/plugin.json +2 -2
- package/plugins/ima-claude/agents/wp-developer.md +2 -1
- package/plugins/ima-claude/hooks/prompt_coach_digest.md +1 -1
- 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/espocrm/SKILL.md +79 -0
- package/plugins/ima-claude/skills/espocrm-api/SKILL.md +360 -0
- package/plugins/ima-claude/skills/espocrm-api/references/where-operators.md +84 -0
- package/plugins/ima-claude/skills/functional-programmer/SKILL.md +15 -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
- package/plugins/ima-claude/skills/wp-ddev/SKILL.md +264 -0
- package/plugins/ima-claude/skills/wp-ddev/references/ddev-commands.md +232 -0
- package/plugins/ima-claude/skills/wp-ddev/references/wp-cli-reference.md +406 -0
|
@@ -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
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Atlassian Direct API — Miscellaneous Operations
|
|
2
|
+
|
|
3
|
+
MCP gaps: comment edit/delete, watchers, components, versions, page deletion.
|
|
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
|
+
## Comments
|
|
12
|
+
|
|
13
|
+
### Edit a Jira Comment
|
|
14
|
+
|
|
15
|
+
**API:** `PUT /rest/api/3/issue/{issueKey}/comment/{commentId}`
|
|
16
|
+
**When:** Correcting or updating an existing comment.
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
curl -s -X PUT \
|
|
20
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
21
|
+
-H "Content-Type: application/json" \
|
|
22
|
+
-d '{
|
|
23
|
+
"body": {
|
|
24
|
+
"type": "doc",
|
|
25
|
+
"version": 1,
|
|
26
|
+
"content": [
|
|
27
|
+
{
|
|
28
|
+
"type": "paragraph",
|
|
29
|
+
"content": [{"type": "text", "text": "Updated comment text"}]
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
}' \
|
|
34
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123/comment/10042"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
#### Notes
|
|
38
|
+
- Comment body must be ADF (not Markdown) for the v3 API
|
|
39
|
+
- Get comment IDs from `getJiraIssue` with `fields: ["comment"]`
|
|
40
|
+
- Only the comment author or an admin can edit
|
|
41
|
+
|
|
42
|
+
### Delete a Jira Comment
|
|
43
|
+
|
|
44
|
+
**API:** `DELETE /rest/api/3/issue/{issueKey}/comment/{commentId}`
|
|
45
|
+
**When:** Removing erroneous or sensitive comments.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
curl -s -X DELETE \
|
|
49
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
50
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123/comment/10042"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
#### Notes
|
|
54
|
+
- Returns HTTP 204 on success (no body)
|
|
55
|
+
- Only the comment author or an admin can delete
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Watchers
|
|
60
|
+
|
|
61
|
+
### Get Watchers
|
|
62
|
+
|
|
63
|
+
**API:** `GET /rest/api/3/issue/{issueKey}/watchers`
|
|
64
|
+
**When:** Checking who is watching an issue.
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
curl -s \
|
|
68
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
69
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123/watchers" \
|
|
70
|
+
| jq '.watchers[] | {accountId, displayName}'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Add a Watcher
|
|
74
|
+
|
|
75
|
+
**API:** `POST /rest/api/3/issue/{issueKey}/watchers`
|
|
76
|
+
**When:** Subscribing someone to issue notifications.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
curl -s -X POST \
|
|
80
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
81
|
+
-H "Content-Type: application/json" \
|
|
82
|
+
-d '"5b10a2844c20165700ede21g"' \
|
|
83
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123/watchers"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
#### Notes
|
|
87
|
+
- Body is a **raw JSON string** (the accountId in quotes), not an object
|
|
88
|
+
- Get `accountId` from MCP `lookupJiraAccountId`
|
|
89
|
+
|
|
90
|
+
### Remove a Watcher
|
|
91
|
+
|
|
92
|
+
**API:** `DELETE /rest/api/3/issue/{issueKey}/watchers?accountId={accountId}`
|
|
93
|
+
**When:** Unsubscribing someone from issue notifications.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
curl -s -X DELETE \
|
|
97
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
98
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/issue/PROJ-123/watchers?accountId=5b10a2844c20165700ede21g"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Components
|
|
104
|
+
|
|
105
|
+
### List Project Components
|
|
106
|
+
|
|
107
|
+
**API:** `GET /rest/api/3/project/{projectKey}/components`
|
|
108
|
+
**When:** Finding component IDs for issue creation or filtering.
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
curl -s \
|
|
112
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
113
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/project/PROJ/components" \
|
|
114
|
+
| jq '.[] | {id, name, lead: .lead.displayName}'
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Create a Component
|
|
118
|
+
|
|
119
|
+
**API:** `POST /rest/api/3/component`
|
|
120
|
+
**When:** Adding a new component to a project.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
curl -s -X POST \
|
|
124
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
125
|
+
-H "Content-Type: application/json" \
|
|
126
|
+
-d '{
|
|
127
|
+
"name": "Authentication",
|
|
128
|
+
"project": "PROJ",
|
|
129
|
+
"description": "Auth and identity management",
|
|
130
|
+
"leadAccountId": "5b10a2844c20165700ede21g"
|
|
131
|
+
}' \
|
|
132
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/component" \
|
|
133
|
+
| jq '{id, name}'
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Versions (Releases)
|
|
139
|
+
|
|
140
|
+
### List Project Versions
|
|
141
|
+
|
|
142
|
+
**API:** `GET /rest/api/3/project/{projectKey}/versions`
|
|
143
|
+
**When:** Finding version IDs for fix-version assignment.
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
curl -s \
|
|
147
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
148
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/project/PROJ/versions" \
|
|
149
|
+
| jq '.[] | {id, name, released, releaseDate}'
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Create a Version
|
|
153
|
+
|
|
154
|
+
**API:** `POST /rest/api/3/version`
|
|
155
|
+
**When:** Setting up a new release version.
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
curl -s -X POST \
|
|
159
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
160
|
+
-H "Content-Type: application/json" \
|
|
161
|
+
-d '{
|
|
162
|
+
"name": "v2.1.0",
|
|
163
|
+
"projectId": 10001,
|
|
164
|
+
"description": "Q2 release",
|
|
165
|
+
"releaseDate": "2026-06-30",
|
|
166
|
+
"released": false
|
|
167
|
+
}' \
|
|
168
|
+
"https://api.atlassian.com/ex/jira/$ATLASSIAN_CLOUD_ID/rest/api/3/version" \
|
|
169
|
+
| jq '{id, name}'
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
#### Notes
|
|
173
|
+
- Uses numeric `projectId`, not project key — get it from `getVisibleJiraProjects`
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Confluence Page Deletion
|
|
178
|
+
|
|
179
|
+
### Delete a Confluence Page
|
|
180
|
+
|
|
181
|
+
**API:** `DELETE /wiki/api/v2/pages/{pageId}`
|
|
182
|
+
**When:** Removing outdated or draft Confluence pages.
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
curl -s -X DELETE \
|
|
186
|
+
-H "Authorization: Bearer $ATLASSIAN_BEARER_TOKEN" \
|
|
187
|
+
"https://api.atlassian.com/ex/confluence/$ATLASSIAN_CLOUD_ID/wiki/api/v2/pages/12345"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### Notes
|
|
191
|
+
- Uses Confluence **v2 API** (not v1)
|
|
192
|
+
- Returns HTTP 204 on success
|
|
193
|
+
- Page is moved to trash first (recoverable for 30 days)
|
|
194
|
+
- Get page ID from MCP `getConfluencePage` or `searchConfluenceUsingCql`
|
|
195
|
+
- Child pages become orphans — reassign or delete them first
|