Back to skills
SkillHub ClubRun DevOpsDevOpsBackendFull Stack

jira

This skill provides shell-based automation for Jira using the Atlassian MCP server. It covers common operations like searching issues, getting details, transitioning statuses, and adding comments. The documentation clearly explains the required function-call syntax and includes helper scripts for setup.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
43
Hot score
90
Updated
March 20, 2026
Overall rating
A8.3
Composite score
6.4
Best-practice grade
A88.4

Install command

npx @skill-hub/cli install zenobi-us-dotfiles-jira
jira-automationcli-integrationworkflow-automationissue-tracking

Repository

zenobi-us/dotfiles

Skill path: ai/files/skills/jira

This skill provides shell-based automation for Jira using the Atlassian MCP server. It covers common operations like searching issues, getting details, transitioning statuses, and adding comments. The documentation clearly explains the required function-call syntax and includes helper scripts for setup.

Open repository

Best for

Primary workflow: Run DevOps.

Technical facets: DevOps, Backend, Full Stack, Integration.

Target audience: Developers and DevOps engineers who manage Jira tickets from the command line and want to automate repetitive workflows.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: zenobi-us.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install jira into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/zenobi-us/dotfiles before adding jira to shared team environments
  • Use jira for devops workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
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:
>
> ```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 Current User Info

```bash
mise x node@20 -- ./scripts/get_current_user.sh
```

Returns: `accountId`, `displayName`, `email`

**Or get specific fields:**

```bash
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)

```bash
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

```bash
mise x node@20 -- mcporter call 'atlassian.searchJiraIssuesUsingJql(cloudId: "'$JIRA_CLOUD_ID'", jql: "assignee = currentUser() AND status = Open")'
```

**With specific fields:**

```bash
mise x node@20 -- mcporter call 'atlassian.searchJiraIssuesUsingJql(cloudId: "'$JIRA_CLOUD_ID'", jql: "assignee = currentUser()", fields: ["key", "summary", "status", "assignee"])'
```

**With pagination:**

```bash
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 you
- `status = Open` - Filter by status
- `project = PROJ` - Specific project
- `updated >= -7d` - Updated in last 7 days
- `issuetype = Bug` - Specific issue type

### Get Issue Details

```bash
mise x node@20 -- mcporter call 'atlassian.getJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123")'
```

**With specific fields:**

```bash
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:**

```bash
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

```bash
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

```bash
mise x node@20 -- mcporter call 'atlassian.transitionJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", transition: {id: "11"})'
```

**With field updates:**

```bash
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

```bash
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

```bash
mise x node@20 -- mcporter call 'atlassian.addCommentToJiraIssue(cloudId: "'$JIRA_CLOUD_ID'", issueIdOrKey: "PROJ-123", commentBody: "Your comment here")'
```

**With GitHub permalink:**

```bash
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

```bash
mise x node@20 -- mcporter call 'atlassian.getJiraIssueTypeMetaWithFields(cloudId: "'$JIRA_CLOUD_ID'", projectIdOrKey: "PROJ", issueTypeId: "10001")'
```

### Get Related Links (PRs, Confluence, etc)

```bash
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:**

```bash
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

```bash
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

```bash
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 descriptions
- `inputSchema.required` - Which parameters are mandatory
- `options` - CLI-specific metadata for each parameter

**Filter for just required parameters:**

```bash
mise x node@20 -- mcporter list atlassian --json | \
  jq '.tools[] | select(.name == "addCommentToJiraIssue") | .inputSchema.required[]'
```

**Get parameter descriptions:**

```bash
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:**

  ```bash
  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 `getTransitionsForJiraIssue` before transitioning** - transition IDs vary by project workflow
- **Interpolate env vars outside the quotes**: `mcporter call 'func(cloudId: "'$VAR'")'` works, but `mcporter call 'func(cloudId: "$VAR")'` does not
- **Use `jq` for JSON parsing** in shell scripts
- **Use schema introspection** when unsure about parameters - `mcporter list atlassian --json | jq` is your friend
- See `examples/` directory for full workflow examples
jira | SkillHub