469 lines
12 KiB
Markdown
469 lines
12 KiB
Markdown
# MCP Reference
|
|
|
|
Complete reference for Atlassian Jira operations via MCP.
|
|
|
|
## MCP Tool Reference
|
|
|
|
### Search Operations
|
|
|
|
#### `mcp__atlassian__searchJiraIssuesUsingJql`
|
|
Search Jira using JQL (Jira Query Language).
|
|
|
|
**Parameters:**
|
|
- `jql` (required): JQL query string
|
|
- `maxResults`: Maximum results (default: 50)
|
|
- `startAt`: Pagination offset
|
|
- `fields`: Comma-separated fields to return
|
|
|
|
**Example:**
|
|
```
|
|
mcp__atlassian__searchJiraIssuesUsingJql(jql: "project = PROJ AND status = 'In Progress'")
|
|
```
|
|
|
|
### Issue Operations
|
|
|
|
#### `mcp__atlassian__getJiraIssue`
|
|
Retrieve full issue details by key.
|
|
|
|
**Parameters:**
|
|
- `issueKey` (required): Issue key (e.g., "PROJ-123")
|
|
- `expand`: Additional data (changelog, transitions, renderedFields)
|
|
|
|
**Example:**
|
|
```
|
|
mcp__atlassian__getJiraIssue(issueKey: "PROJ-123")
|
|
```
|
|
|
|
#### `mcp__atlassian__createJiraIssue`
|
|
Create a new issue.
|
|
|
|
**Parameters:**
|
|
- `projectKey` (required): Target project
|
|
- `issueType` (required): Issue type (Story, Bug, Task, Epic, etc.)
|
|
- `summary` (required): Issue title
|
|
- `description`: Detailed description
|
|
- `assignee`: Account ID (use lookupJiraAccountId first)
|
|
- `priority`: Priority name (Highest, High, Medium, Low, Lowest)
|
|
- `labels`: Array of labels
|
|
- `components`: Array of component names
|
|
- Custom fields as needed
|
|
|
|
**Example:**
|
|
```
|
|
mcp__atlassian__createJiraIssue(
|
|
projectKey: "PROJ",
|
|
issueType: "Story",
|
|
summary: "Implement user authentication",
|
|
description: "Add OAuth2 authentication flow...",
|
|
labels: ["backend", "security"]
|
|
)
|
|
```
|
|
|
|
#### `mcp__atlassian__editJiraIssue`
|
|
Update an existing issue.
|
|
|
|
**Parameters:**
|
|
- `issueKey` (required): Issue to update
|
|
- Any field to update (summary, description, assignee, etc.)
|
|
|
|
**Example:**
|
|
```
|
|
mcp__atlassian__editJiraIssue(
|
|
issueKey: "PROJ-123",
|
|
description: "Updated description with more details..."
|
|
)
|
|
```
|
|
|
|
### Transition Operations
|
|
|
|
#### `mcp__atlassian__getTransitionsForJiraIssue`
|
|
Get available status transitions for an issue.
|
|
|
|
**Parameters:**
|
|
- `issueKey` (required): Issue key
|
|
|
|
**Returns:** List of available transitions with IDs and names.
|
|
|
|
#### `mcp__atlassian__transitionJiraIssue`
|
|
Change issue status.
|
|
|
|
**Parameters:**
|
|
- `issueKey` (required): Issue key
|
|
- `transitionId` (required): Transition ID from getTransitions
|
|
- `comment`: Optional comment for the transition
|
|
|
|
**Workflow:**
|
|
1. Get transitions: `getTransitionsForJiraIssue("PROJ-123")`
|
|
2. Find desired transition ID from results
|
|
3. Execute: `transitionJiraIssue(issueKey: "PROJ-123", transitionId: "31")`
|
|
|
|
### Comment Operations
|
|
|
|
#### `mcp__atlassian__addCommentToJiraIssue`
|
|
Add a comment to an issue.
|
|
|
|
**Parameters:**
|
|
- `issueKey` (required): Issue key
|
|
- `body` (required): Comment text (supports Jira markdown)
|
|
|
|
### User Operations
|
|
|
|
#### `mcp__atlassian__lookupJiraAccountId`
|
|
Find user account ID for assignments.
|
|
|
|
**Parameters:**
|
|
- `query` (required): Search by display name, email, or username
|
|
|
|
**Example:**
|
|
```
|
|
mcp__atlassian__lookupJiraAccountId(query: "user@example.com")
|
|
```
|
|
|
|
**Usage:** Always look up account IDs before assigning issues.
|
|
|
|
### Project Operations
|
|
|
|
#### `mcp__atlassian__getVisibleJiraProjects`
|
|
List available Jira projects.
|
|
|
|
**Parameters:**
|
|
- `maxResults`: Maximum results
|
|
|
|
#### `mcp__atlassian__getJiraProjectIssueTypesMetadata`
|
|
Get issue types and required fields for a project.
|
|
|
|
**Parameters:**
|
|
- `projectKey` (required): Project key
|
|
|
|
**Usage:** Call before creating issues to understand required fields.
|
|
|
|
#### `mcp__atlassian__getJiraIssueTypeMetaWithFields`
|
|
Get detailed field metadata for an issue type.
|
|
|
|
**Parameters:**
|
|
- `projectKey` (required): Project key
|
|
- `issueTypeId` (required): Issue type ID
|
|
|
|
---
|
|
|
|
## JQL (Jira Query Language) Reference
|
|
|
|
### Basic Syntax
|
|
|
|
```
|
|
field operator value [AND|OR field operator value]
|
|
```
|
|
|
|
### Common Fields
|
|
|
|
| Field | Description | Example |
|
|
|-------|-------------|---------|
|
|
| `project` | Project key | `project = "PROJ"` |
|
|
| `issuetype` | Issue type | `issuetype = Bug` |
|
|
| `status` | Issue status | `status = "In Progress"` |
|
|
| `assignee` | Assigned user | `assignee = currentUser()` |
|
|
| `reporter` | Issue creator | `reporter = "jobarksdale"` |
|
|
| `priority` | Priority level | `priority = High` |
|
|
| `labels` | Issue labels | `labels = "backend"` |
|
|
| `component` | Components | `component = "API"` |
|
|
| `created` | Creation date | `created >= -30d` |
|
|
| `updated` | Last update | `updated >= -7d` |
|
|
| `resolved` | Resolution date | `resolved >= startOfMonth()` |
|
|
| `sprint` | Sprint name/ID | `sprint in openSprints()` |
|
|
| `epic` | Parent epic | `"Epic Link" = PROJ-100` |
|
|
| `parent` | Parent issue | `parent = PROJ-50` |
|
|
| `text` | Full-text search | `text ~ "authentication"` |
|
|
| `summary` | Title search | `summary ~ "login"` |
|
|
| `description` | Description search | `description ~ "OAuth"` |
|
|
|
|
### Operators
|
|
|
|
| Operator | Meaning | Example |
|
|
|----------|---------|---------|
|
|
| `=` | Exact match | `status = Done` |
|
|
| `!=` | Not equal | `status != Closed` |
|
|
| `~` | Contains (text) | `summary ~ "auth*"` |
|
|
| `!~` | Does not contain | `summary !~ "test"` |
|
|
| `>` `>=` `<` `<=` | Comparisons | `priority >= High` |
|
|
| `IN` | Multiple values | `status IN (Open, "In Progress")` |
|
|
| `NOT IN` | Exclude values | `status NOT IN (Done, Closed)` |
|
|
| `IS` | Null check | `assignee IS EMPTY` |
|
|
| `IS NOT` | Not null | `assignee IS NOT EMPTY` |
|
|
| `WAS` | Historical value | `status WAS "In Progress"` |
|
|
| `CHANGED` | Field changed | `status CHANGED` |
|
|
|
|
### Functions
|
|
|
|
| Function | Description | Example |
|
|
|----------|-------------|---------|
|
|
| `currentUser()` | Logged-in user | `assignee = currentUser()` |
|
|
| `now()` | Current timestamp | `created <= now()` |
|
|
| `startOfDay()` | Midnight today | `updated >= startOfDay()` |
|
|
| `startOfWeek()` | Start of week | `created >= startOfWeek()` |
|
|
| `startOfMonth()` | Start of month | `created >= startOfMonth()` |
|
|
| `endOfDay()` | End of today | `due <= endOfDay()` |
|
|
| `openSprints()` | Active sprints | `sprint in openSprints()` |
|
|
| `closedSprints()` | Completed sprints | `sprint in closedSprints()` |
|
|
| `linkedIssues()` | Linked issues | `issue in linkedIssues("PROJ-123")` |
|
|
|
|
### Relative Dates
|
|
|
|
```jql
|
|
# Days
|
|
created >= -7d # Last 7 days
|
|
updated >= -30d # Last 30 days
|
|
|
|
# Weeks
|
|
created >= -2w # Last 2 weeks
|
|
|
|
# Months
|
|
created >= -1M # Last month
|
|
|
|
# Specific date
|
|
created >= "2024-01-01"
|
|
```
|
|
|
|
### Ordering
|
|
|
|
```jql
|
|
# Order by priority, highest first
|
|
project = PROJ ORDER BY priority DESC
|
|
|
|
# Multiple sort fields
|
|
project = PROJ ORDER BY status ASC, created DESC
|
|
```
|
|
|
|
### Complex Query Examples
|
|
|
|
```jql
|
|
# My open issues, high priority
|
|
assignee = currentUser() AND status NOT IN (Done, Closed) AND priority >= High
|
|
|
|
# Bugs created this week
|
|
issuetype = Bug AND created >= startOfWeek() ORDER BY priority DESC
|
|
|
|
# Epics in progress with stories
|
|
issuetype = Epic AND status = "In Progress" AND issueFunction in hasLinks("is parent of")
|
|
|
|
# Issues updated by me recently
|
|
updatedBy = currentUser() AND updated >= -7d ORDER BY updated DESC
|
|
|
|
# Blocked issues
|
|
status = Blocked OR "Flagged" = "Impediment"
|
|
|
|
# Issues linked to specific epic
|
|
"Epic Link" = PROJ-100 AND status != Done
|
|
|
|
# Sprint backlog items
|
|
sprint in openSprints() AND status = "To Do" ORDER BY rank ASC
|
|
|
|
# Unassigned high-priority bugs
|
|
issuetype = Bug AND assignee IS EMPTY AND priority >= High
|
|
|
|
# Issues I'm watching
|
|
watcher = currentUser()
|
|
|
|
# Recently resolved by team
|
|
resolved >= -7d AND project = PROJ ORDER BY resolved DESC
|
|
```
|
|
|
|
---
|
|
|
|
## Issue Linking
|
|
|
|
### Limitation
|
|
The Atlassian MCP does not currently support creating issue links. Use the bundled `jira-link-issues` script instead.
|
|
|
|
### Link Types
|
|
|
|
| Link Type | Inward | Outward | Use Case |
|
|
|-----------|--------|---------|----------|
|
|
| Depends On | is dependency of | depends on | Task dependencies |
|
|
| Blocks | is blocked by | blocks | Blocking relationships |
|
|
| Relates To | relates to | relates to | General relationships |
|
|
| Clones | is cloned by | clones | Cloned issues |
|
|
| Duplicates | is duplicated by | duplicates | Duplicate issues |
|
|
|
|
### Script Usage
|
|
|
|
```bash
|
|
# Link PROJ-123 depends on PROJ-456
|
|
~/.claude/skills/jira/jira-link-issues PROJ-123 PROJ-456 "Depends On"
|
|
|
|
# PROJ-100 blocks PROJ-200
|
|
~/.claude/skills/jira/jira-link-issues PROJ-100 PROJ-200 "Blocks"
|
|
|
|
# General relationship
|
|
~/.claude/skills/jira/jira-link-issues PROJ-50 PROJ-75 "Relates To"
|
|
```
|
|
|
|
### Finding Link Types
|
|
Query the Jira API to get available link types:
|
|
```bash
|
|
curl -s -u "$JIRA_USER:$JIRA_API_TOKEN" \
|
|
"$JIRA_BASE_URL/rest/api/3/issueLinkType" | jq '.issueLinkTypes[].name'
|
|
```
|
|
|
|
Required environment variables:
|
|
- `JIRA_BASE_URL`: Your Atlassian instance (e.g., `https://yourcompany.atlassian.net`)
|
|
- `JIRA_USER`: Your email address
|
|
- `JIRA_API_TOKEN`: API token from Atlassian account settings
|
|
|
|
---
|
|
|
|
## Description Formatting
|
|
|
|
### Jira Markup (Wiki Style)
|
|
|
|
```
|
|
h1. Heading 1
|
|
h2. Heading 2
|
|
h3. Heading 3
|
|
|
|
*bold text*
|
|
_italic text_
|
|
-strikethrough-
|
|
+underline+
|
|
|
|
{code:java}
|
|
public class Example {
|
|
// code here
|
|
}
|
|
{code}
|
|
|
|
{quote}
|
|
Quoted text here
|
|
{quote}
|
|
|
|
* Bullet list
|
|
** Nested bullet
|
|
# Numbered list
|
|
## Nested number
|
|
|
|
[Link text|https://example.com]
|
|
[Issue link|PROJ-123]
|
|
|
|
||Header 1||Header 2||
|
|
|Cell 1|Cell 2|
|
|
|
|
{panel:title=Panel Title}
|
|
Panel content here
|
|
{panel}
|
|
```
|
|
|
|
### Atlassian Document Format (ADF)
|
|
|
|
For createJiraIssue, descriptions may use ADF format:
|
|
```json
|
|
{
|
|
"type": "doc",
|
|
"version": 1,
|
|
"content": [
|
|
{
|
|
"type": "paragraph",
|
|
"content": [
|
|
{"type": "text", "text": "Description text"}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
### Common Errors
|
|
|
|
| HTTP Code | Error | Cause | Resolution |
|
|
|-----------|-------|-------|------------|
|
|
| 400 | Bad Request | Invalid field values | Check required fields for issue type |
|
|
| 401 | Unauthorized | Invalid credentials | Run `/mcp` to reconnect |
|
|
| 403 | Forbidden | Insufficient permissions | Check project permissions |
|
|
| 404 | Not Found | Issue/project doesn't exist | Verify key is correct |
|
|
| 422 | Unprocessable | Validation failed | Check field constraints |
|
|
|
|
### Authentication Issues
|
|
|
|
If MCP tools return authentication errors:
|
|
1. Run `/mcp` to check connection status
|
|
2. Reconnect the Atlassian MCP service if disconnected
|
|
3. Verify API token permissions in Atlassian settings
|
|
|
|
### Field Validation
|
|
|
|
Before creating issues:
|
|
1. Get project metadata: `getJiraProjectIssueTypesMetadata`
|
|
2. Check required fields for the issue type
|
|
3. Look up user account IDs for assignee fields
|
|
4. Verify custom field IDs and valid values
|
|
|
|
---
|
|
|
|
## Common Workflows
|
|
|
|
### Move Ticket to Done
|
|
|
|
```
|
|
1. Get available transitions:
|
|
mcp__atlassian__getTransitionsForJiraIssue(issueKey: "PROJ-123")
|
|
→ Returns list with transition IDs
|
|
|
|
2. Find "Done" transition ID from response
|
|
|
|
3. Execute transition:
|
|
mcp__atlassian__transitionJiraIssue(
|
|
issueKey: "PROJ-123",
|
|
transitionId: "done_id"
|
|
)
|
|
|
|
4. Add comment:
|
|
mcp__atlassian__addCommentToJiraIssue(
|
|
issueKey: "PROJ-123",
|
|
body: "Completed and deployed"
|
|
)
|
|
```
|
|
|
|
### Create and Assign Issue
|
|
|
|
```
|
|
1. Look up user account ID:
|
|
mcp__atlassian__lookupJiraAccountId(query: "john@example.com")
|
|
→ Returns account ID
|
|
|
|
2. Create issue with assignment:
|
|
mcp__atlassian__createJiraIssue(
|
|
projectKey: "PROJ",
|
|
issueType: "Task",
|
|
summary: "Implement feature X",
|
|
description: "Details here...",
|
|
assignee: "account_id_from_step_1"
|
|
)
|
|
```
|
|
|
|
### List My In-Progress Issues
|
|
|
|
```
|
|
mcp__atlassian__searchJiraIssuesUsingJql(
|
|
jql: "assignee = currentUser() AND status = 'In Progress' ORDER BY updated DESC"
|
|
)
|
|
```
|
|
|
|
### Get Project Info Before Creating
|
|
|
|
```
|
|
1. List available projects:
|
|
mcp__atlassian__getVisibleJiraProjects()
|
|
|
|
2. Get issue types for project:
|
|
mcp__atlassian__getJiraProjectIssueTypesMetadata(projectKey: "PROJ")
|
|
|
|
3. Create issue with correct type:
|
|
mcp__atlassian__createJiraIssue(
|
|
projectKey: "PROJ",
|
|
issueType: "Story",
|
|
summary: "...",
|
|
description: "..."
|
|
)
|
|
```
|