JIRA Skill
Master Jira automation and integration using the atlassian MCP server. This skill enables programmatic access to Jira issues, projects, and metadata.
[!CRITICAL] ⚠️ IMPORTANT - Parameter Passing: Use function-call syntax (NOT flag syntax). Parameters go inside the function call, not as flags: ``bash mcporter call 'atlassian.functionName(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", fields: ["key", "summary"])'`**Key Rules:** - Parameters are camelCase inside the function call - String values use double quotes:"value"- Array values use bracket notation:["item1", "item2"]- Object values use object notation:{key: "value"}- Environment variables are interpolated outside quotes:"'$VAR'"- NO--flag` syntax, NO JSON string escaping needed
Quick Setup
Get Ticket Summary (One-Shot)
The fastest way to get ticket information:
mise x node@20 -- ./scripts/get_ticket_summary.sh TICKET-123Returns human-readable summary with:
- Key, summary, type, status, priority, assignee
- Created/updated timestamps
- Full description
- Linked resources (PRs, etc.)
- Direct link to Jira
JSON output for parsing:
mise x node@20 -- ./scripts/get_ticket_summary.sh TICKET-123 --jsonReturns structured JSON with ticket and remoteLinks objects.
Get Current User Info
mise x node@20 -- ./scripts/get_current_user.shReturns: accountId, displayName, email
Or get specific fields:
mise x node@20 -- ./scripts/get_current_user.sh --account-id
mise x node@20 -- ./scripts/get_current_user.sh --email
mise x node@20 -- ./scripts/get_current_user.sh --display-nameGet Cloud ID (Required for all operations)
export JIRA_CLOUD_ID=$(mise x node@20 -- ./scripts/get_cloud_id.sh)
export JIRA_URL=$(mise x node@20 -- ./scripts/get_cloud_id.sh --url)This sets up environment variables for all subsequent mcporter calls.
Core Operations
Search Issues
mise x node@20 -- mcporter call 'atlassian.searchJiraIssuesUsingJql(cloudId: "'$JIRA_CLOUD_ID'", jql: "assignee = currentUser() AND status = Open")'With specific fields:
mise x node@20 -- mcporter call 'atlassian.searchJiraIssuesUsingJql(cloudId: "'$JIRA_CLOUD_ID'", jql: "assignee = currentUser()", fields: ["key", "summary", "status", "assignee"])'With pagination:
mise x node@20 -- mcporter call 'atlassian.searchJiraIssuesUsingJql(cloudId: "'$JIRA_CLOUD_ID'", jql: "assignee = currentUser()", maxResults: 50)'Returns: issues[] array with key, fields.summary, fields.status.name
Common JQL:
assignee = currentUser()- Issues assigned to youstatus = Open- Filter by statusproject = PROJ- Specific projectupdated >= -7d- Updated in last 7 daysissuetype = Bug- Specific issue type
Get Issue Details
mise x node@20 -- mcporter call 'atlassian.getJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123")'With specific fields:
mise x node@20 -- mcporter call 'atlassian.getJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", fields: ["key", "summary", "status", "assignee", "description"])'With expand for additional details:
mise x node@20 -- mcporter call 'atlassian.getJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", expand: ["changelog", "editmeta"])'Returns: Full issue object with key, fields (summary, status, assignee, description, etc)
Get Issue Transitions
mise x node@20 -- mcporter call 'atlassian.getTransitionsForJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123")'Returns: List of available transitions with IDs and names for workflow state changes
Transition Issue to New Status
mise x node@20 -- mcporter call 'atlassian.transitionJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", transition: {id: "11"})'With field updates:
mise x node@20 -- mcporter call 'atlassian.transitionJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", transition: {id: "11"}, fields: {assignee: {id: "USER_ID"}})'Get Project Metadata
mise x node@20 -- mcporter call 'atlassian.getJiraProjectIssueTypesMetadata(cloudId: "'$JIRA_CLOUD_ID'", projectIdOrKey: "PROJ")'Edit Jira Issue Fields
TODO: Add example for updating fields on an issue
Add Comment to Issue
mise x node@20 -- mcporter call 'atlassian.addCommentToJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", commentBody: "Your comment here")'With GitHub permalink:
mise x node@20 -- mcporter call 'atlassian.addCommentToJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", commentBody: "See implementation details:\n\nhttps://github.com/owner/repo/blob/commit-hash/path/to/file.ts#L123")'Returns: Comment object with id, body, author, created, updated
Create New Issue
TODO: Add example for creating a new issue
Get Issue Type Metadata
mise x node@20 -- mcporter call 'atlassian.getJiraIssueTypeMetaWithFields(cloudId: "'$JIRA_CLOUD_ID'", projectIdOrKey: "PROJ", issueTypeId: "10001")'Get Related Links (PRs, Confluence, etc)
mise x node@20 -- mcporter call 'atlassian.getJiraIssueRemoteIssueLinks(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123")'Returns: remoteIssueLinks[] array with linked resources
Filter for GitHub PRs:
mise x node@20 -- mcporter call 'atlassian.getJiraIssueRemoteIssueLinks(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123")' | \
jq '.[]? | select(.type.name == "GitHub" or (.globalId | contains("github"))) | .object.url'Helper Scripts
| Script | Purpose |
|---|---|
./scripts/get_ticket_summary.sh | One-shot ticket summary - Get all ticket info in one call (human or JSON format) |
./scripts/get_current_user.sh | Get authenticated user info (accountId, displayName, email) |
./scripts/get_cloud_id.sh | Get Jira Cloud ID and URL |
Common Issues & Solutions
| Problem | Solution |
|---|---|
| No cloud ID available | Run ./scripts/get_cloud_id.sh to fetch and export it |
| Need current user info | Use ./scripts/get_current_user.sh to fetch accountId, displayName, email |
| Search returns 0 results | Verify JQL syntax. Try status = Open instead of status = "To Do". Test queries in Jira UI first. |
PR link not found in remoteIssueLinks | Not all PRs auto-link. Check if "Link" was created in GitHub/Jira. |
| Transition fails with "Cannot transition" | Wrong transition ID. Always run getTransitionsForJiraIssue first to see valid transitions for current status. |
| "Invalid arguments" or command fails | Use function-call syntax, NOT flag syntax. Parameters go inside functionName(param: value) not --param value |
| Arrays not working | Use bracket notation inside function call: fields: ["key", "summary"] NOT --fields '["key","summary"]' |
| Objects not working | Use object notation inside function call: transition: {id: "11"} NOT --transition '{"id":"11"}' |
Discovering Function Parameters with Schema Introspection
The mcporter CLI can introspect the MCP server schema to discover correct parameters and their types.
List All Available Tools
mise x node@20 -- mcporter list atlassian --json | jq -r ".tools[].name"Returns:
atlassianUserInfo
getAccessibleAtlassianResources
getConfluenceSpaces
getConfluencePage
getPagesInConfluenceSpace
getConfluencePageFooterComments
getConfluencePageInlineComments
getConfluencePageDescendants
createConfluencePage
updateConfluencePage
createConfluenceFooterComment
createConfluenceInlineComment
searchConfluenceUsingCql
getJiraIssue
editJiraIssue
createJiraIssue
getTransitionsForJiraIssue
transitionJiraIssue
lookupJiraAccountId
searchJiraIssuesUsingJql
addCommentToJiraIssue
addWorklogToJiraIssue
getJiraIssueRemoteIssueLinks
getVisibleJiraProjects
getJiraProjectIssueTypesMetadata
getJiraIssueTypeMetaWithFields
search
fetchInspect a Specific Tool Schema
mise x node@20 -- mcporter list atlassian --json | jq '.tools[] | select(.name == "addCommentToJiraIssue")'This returns the full JSON schema including:
inputSchema.properties- All available parameters with types and descriptionsinputSchema.required- Which parameters are mandatoryoptions- CLI-specific metadata for each parameter
Filter for just required parameters:
mise x node@20 -- mcporter list atlassian --json | \
jq '.tools[] | select(.name == "addCommentToJiraIssue") | .inputSchema.required[]'Get parameter descriptions:
mise x node@20 -- mcporter list atlassian --json | \
jq '.tools[] | select(.name == "addCommentToJiraIssue") | .inputSchema.properties | to_entries[] | "\(.key): \(.value.description)"'This introspection approach works for any tool - just change the tool name in the select() filter.
Tips
- Setup once per session:
export JIRA_CLOUD_ID=$(mise x node@20 --./scripts/get_cloud_id.sh) export JIRA_URL=$(mise x node@20 --./scripts/get_cloud_id.sh --url) - Function-call syntax is the mcporter standard - use
mcporter call 'func(param: value)'not flags - Always use
getTransitionsForJiraIssuebefore transitioning - transition IDs vary by project workflow - Interpolate env vars outside the quotes:
mcporter call 'func(cloudId: "'$VAR'")'works, butmcporter call 'func(cloudId: "$VAR")'does not - Use
jqfor JSON parsing in shell scripts - Use schema introspection when unsure about parameters -
mcporter list atlassian --json | jqis your friend - See
examples/directory for full workflow examples