Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

atlassian

CI Release Coverage Go Reference Go version License: MIT Ask DeepWiki Built with cliwright

Jira, Confluence, Jira Service Management and Jira Software from the command line — all 1,143 documented operations, on Cloud and Data Center.

Documentation · Command reference


Install

curl -fsSL https://raw.githubusercontent.com/jjuanrivvera/atlassian-cli/main/install.sh | sh
Other methods
# Homebrew
brew install jjuanrivvera/atlassian-cli/atlassian-cli

# Scoop (Windows)
scoop bucket add atlassian-cli https://github.com/jjuanrivvera/scoop-atlassian-cli
scoop install atlassian-cli

# Go
go install github.com/jjuanrivvera/atlassian-cli/cmd/atlassian@latest

deb, rpm and apk packages are attached to each release.

Quickstart

atlassian init          # site URL + credentials, verified before they are saved
atlassian doctor        # config, credentials, connectivity, per-product licensing
# Jira
atlassian issues list --jql 'project = PP AND status = "In Progress"'
atlassian issues new --project PP --type Task --summary 'Rotate the signing key'
atlassian issues transition PP-1065 --to Done --resolution Fixed
atlassian issues comment PP-1065 --body 'Deployed. See the **runbook**.'

# Confluence
atlassian pages list --space-id 65537
atlassian pages new --space ENG --title Runbook --body @runbook.md
atlassian pages edit 123456 --body @runbook.md --message 'Add rollback steps'

# Jira Software
atlassian sprints list --board 42 --state active
atlassian sprints move 1234 --issue PP-1 --issue PP-2

# Jira Service Management
atlassian servicedesks queues 1
atlassian requests list --status OPEN_REQUESTS

# Both products at once
atlassian search 'signing key rotation'

What makes it different

The whole API, not a slice of it. The binary embeds a catalog generated from Atlassian's own OpenAPI documents — 1,143 operations across Jira (616), Confluence v2 (218), Confluence v1 (130), Jira Software (105) and Jira Service Management (74). Everyday work has ergonomic commands; everything else is one op call away, with parameters validated locally first:

$ atlassian op search sprint
ID                         PRODUCT  METHOD  PATH                                    TAG     SUMMARY
getAllSprints              agile    GET     /rest/agile/1.0/board/{boardId}/sprint  Board   Get all sprints
createSprint               agile    POST    /rest/agile/1.0/sprint                  Sprint  Create sprint
swapSprint                 agile    POST    /rest/agile/1.0/sprint/{sprintId}/swap  Sprint  Swap sprint


$ atlassian op call getIssue
error: getIssue requires "issueIdOrKey"

try: atlassian op describe getIssue

That validation happens before anything is sent, from the embedded schema — no round trip, no guessing at a 400.

Markdown instead of ADF. Jira REST v3 models rich text as Atlassian Document Format and rejects a plain string, which makes the raw API close to unusable from a shell. Pass text or Markdown and it is converted; pass --body-adf when you need exact control. Reading goes the other way, so a comment renders as text rather than 400 characters of nested JSON.

Versioning handled. Confluence rejects an update whose version number is not exactly current+1. atlassian pages edit reads the current version and increments it, and resends the existing body when only the title changes — otherwise the page is silently emptied.

Names instead of accountIds. Jira's write endpoints only accept opaque accountIds. --assignee 'Juan Rivera', --assignee juan@example.com and --assignee me all resolve.

Data Center works. Personal access tokens, the v2 identity endpoint, self-hosted base URLs.

Built for agents. atlassian mcp serves the whole command tree as annotated MCP tools over the same client, keyring and --dry-run. atlassian agent guard reads the live tree and emits host safety config — irreversible operations blocked, writes gated, reads free. See the comparison with Atlassian's own MCP server.

Output

Every command speaks table (default), json, yaml, csv and id:

atlassian issues list --jql 'project = PP' -o csv > issues.csv
atlassian issues list --jql 'project = PP' -o id | xargs -n1 atlassian issues get
atlassian projects list --jq '.[] | select(.projectTypeKey == "software") | .key'

CSV cells are neutralized against spreadsheet formula injection, and terminal escape sequences are stripped from API-supplied text before it reaches your terminal.

Multiple sites

A profile is a site, so the flag is --site:

atlassian init --name work    --base-url https://acme.atlassian.net
atlassian init --name onprem  --base-url https://jira.internal --deployment datacenter
atlassian issues list --site onprem --jql 'project = OPS'
atlassian config use work

Credentials go to the OS keyring — never to the config file. On a box without a usable keyring (a headless server, a machine reached over SSH), drop a keyring-password file in the config dir and the CLI uses an AES-256-GCM encrypted-file store instead:

# One-time headless setup — works in every execution context:
umask 077
mkdir -p ~/.atlassian-cli
openssl rand -base64 33 | tr -d '\n' > ~/.atlassian-cli/keyring-password
atlassian init --name work --base-url https://acme.atlassian.net --email me@acme.com

The password file is the durable choice, not the env var. Its presence selects the file store, so a credential written on that box is read back from the same place — even where a keyring also exists. And because the CLI reads the file itself, it needs no shell setup: it works under a non-interactive ssh host 'atlassian …' or cron, where .bashrc/.zshrc are never sourced and an exported ATLASSIAN_KEYRING_PASSWORD would be absent. The file must be mode 600 — a looser one is refused, not silently used. ATLASSIAN_KEYRING_PASSWORD_FILE points at an alternate path; ATLASSIAN_KEYRING_BACKEND=file still forces the store explicitly.

Safety

  • --dry-run prints the equivalent curl, credential redacted, and sends nothing.
  • Deletes prompt, and refuse outright when stdin is not a terminal — pass --yes to script them.
  • Only idempotent methods are ever retried; a POST is never re-sent, so a timeout cannot create a second issue.
  • Retry-After is honoured, and the rate limiter adapts to the quota headers Atlassian sends.
  • Ctrl-C cancels in-flight pagination and retry backoff.

Documentation

Command reference Every command, generated from the binary
Comparison Against Atlassian's Rovo MCP server, acli and jira-cli
OAuth setup Registering a developer app, if you want --method oauth2
Privacy · Terms What it stores locally, and what it contacts
DECISIONS.md Why the CLI behaves the way it does
AGENTS.md Contributing, and the build gate

License

MIT. Not affiliated with or endorsed by Atlassian.

About

Jira, Confluence, Jira Service Management and Jira Software from the command line — all 1,143 documented operations, on Cloud and Data Center

Resources

Code of conduct

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages