jira
Use when needing to search Jira issues, retrieve issue details, get pull request links, or manage issue workflows programmatically - provides complete workflows and examples for common Jira automation tasks using the atlassian CLI
$ 安裝
git clone https://github.com/zenobi-us/dotfiles /tmp/dotfiles && cp -r /tmp/dotfiles/ai/files/skills/jira ~/.claude/skills/dotfiles// tip: Run this command in your terminal to install the skill
name: jira description: Use when needing to search Jira issues, retrieve issue details, get pull request links, or manage issue workflows programmatically - provides complete workflows and examples for common Jira automation tasks using the atlassian CLI
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:
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
--flagsyntax, NO JSON string escaping needed
Quick Setup
Get Current User Info
mise x node@20 -- ./scripts/get_current_user.sh
Returns: 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-name
Get 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_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
fetch
Inspect 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
Repository
