lisa-setup-atlassian
Sets up and authenticates Atlassian Jira and Confluence access for project management tools.
Install
mkdir -p .claude/skills/lisa-setup-atlassian && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/13534" && unzip -o skill.zip -d .claude/skills/lisa-setup-atlassian && rm skill.zipInstalls to .claude/skills/lisa-setup-atlassian
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Set up Atlassian (cloudId + acli profile) for this project. Writes the `atlassian` section of `.lisa.config.json` and enables the Atlassian MCP and/or installs acli as needed. Prerequisite for /lisa:setup:jira and /lisa:setup:confluence.Key capabilities
- →Install `acli` if missing
- →Authenticate via OAuth or API token
- →Enable Atlassian MCP optionally
- →Resolve `cloudId` for the active site
- →Write `atlassian` section into `.lisa.config.json`
- →Store API tokens securely in OS keychain
How it works
The skill configures Atlassian access by installing `acli`, authenticating the user, resolving the `cloudId`, and writing the configuration to `.lisa.config.json`.
Inputs & outputs
When to use lisa-setup-atlassian
- →Connecting Jira to the project
- →Setting up Confluence integration
- →Configuring Atlassian cloud authentication
About this skill
Setup Atlassian: $ARGUMENTS
Resolve and persist Atlassian access for this project. After this skill, .lisa.config.json contains atlassian.cloudId (required) and optionally atlassian.site / atlassian.email for multi-account disambiguation.
Workflow
Step 0 — Pick a setup path
Ask via AskUserQuestion:
How do you want lisa to talk to Atlassian for this project?
- MCP-only (simplest) — authenticate the Atlassian MCP once via browser OAuth; lisa uses it for every operation. Best for: single-Atlassian-account developers on a personal laptop. New developers onboard with one OAuth flow, no token management. Skip the rest of this setup.
- acli (CLI) + MCP fallback — install acli, authenticate per-profile, MCP picks up anything acli can't do. Best for: developers who work across multiple Atlassian accounts and need profile switching. Continue with acli install.
- API-token path (headless / CI) — store a per-user API token in the OS keychain; lisa uses curl for everything. Best for: CI pipelines, headless dev containers, or any case where browser OAuth is impossible. Continue through token-create steps.
If the user picks (1) and the MCP is already authenticated to the right workspace (verify by calling getAccessibleAtlassianResources and checking atlassian.cloudId is in the result), write only atlassian.cloudId and atlassian.site into .lisa.config.json and skip to Step 6 (cloudId resolution). If the MCP isn't authed yet, instruct the user to run mcp__plugin_atlassian_atlassian__authenticate (or the claude.ai equivalent) and complete the OAuth flow in their browser, then re-verify.
If the user picks (2) or (3), continue through the rest of the steps; acli and/or the API token become available alongside the MCP.
Step 1 — Ensure acli is installed (preferred substrate)
if ! command -v acli >/dev/null 2>&1; then
if command -v brew >/dev/null 2>&1; then
brew tap atlassian/homebrew-acli
brew install acli
else
cat >&2 <<'EOF'
Error: Homebrew not found. Install acli manually:
https://developer.atlassian.com/cloud/acli/guides/install-macos/
or skip acli and rely on the Atlassian MCP only (CI/remote envs need acli).
EOF
# Continue — acli is preferred but MCP-only is acceptable.
fi
fi
If acli install fails or is skipped, the project will operate in MCP mode. Surface this clearly to the user.
Step 2 — Authenticate
If acli is installed: prefer acli auth login --web for interactive environments; for headless, instruct the user to obtain a Rovo MCP-scoped API token and pipe via:
echo "$ATLASSIAN_TOKEN" | acli jira auth login --site "<site>.atlassian.net" --email "<email>" --token
After login, verify with acli auth status.
Step 3 — Acquire an Atlassian API token (curl substrate)
acli covers most JIRA operations but no Confluence page writes (only space-level commands, and page view). The classic-vs-granular OAuth scope mismatch (see config-resolution rule) also blocks acli's bearer token from working against the v2 Confluence REST API. So lisa needs a second substrate — curl with Basic auth + API token — for everything Confluence-write-related.
Per-product tokens: Atlassian's scoped API token UI is per-product, so the easiest path is one Confluence-scoped token. JIRA operations remain on acli (no JIRA token needed). If a future lisa op turns out to need a JIRA-scoped token (e.g., reading transition metadata or remote links — neither is required by the current dispatch), make a second token then.
Security posture: the token is stored in the OS keychain when available (macOS/Linux/Windows native backends) so it never lives in plaintext on disk and never flows through chat history. Env-var fallback exists for headless / CI / Linux-without-libsecret.
3a. Check for existing token via the lookup ladder
Use the same ladder atlassian-access uses (env var → email-suffixed env var → keychain):
EMAIL=$(jq -r '.atlassian.email // empty' .lisa.config.local.json 2>/dev/null)
SITE=$(jq -r '.atlassian.site // empty' .lisa.config.json)
CLOUDID=$(jq -r '.atlassian.cloudId // empty' .lisa.config.json)
read_token() {
local email="$1"
[ -n "$ATLASSIAN_API_TOKEN" ] && { echo "$ATLASSIAN_API_TOKEN"; return; }
local slug=$(echo "$email" | tr '[:upper:]@.' '[:lower:]__')
local varname="ATLASSIAN_API_TOKEN_${slug}"
[ -n "${!varname}" ] && { echo "${!varname}"; return; }
case "$(uname -s)" in
Darwin) security find-generic-password -s lisa-atlassian -a "$email" -w 2>/dev/null ;;
Linux) command -v secret-tool >/dev/null && secret-tool lookup service lisa-atlassian account "$email" 2>/dev/null ;;
MINGW*|MSYS*|CYGWIN*)
# `cmdkey /generic ... /pass:` stores the secret in Windows Credential Manager, but
# `cmdkey /list` never prints stored passwords (by design). Read the CredentialBlob
# back via the Win32 CredRead API through PowerShell; pass the target name via an env
# var to dodge nested quoting, and strip the CRLF powershell.exe appends.
LISA_CRED_TARGET="lisa-atlassian-${email}" powershell.exe -NoProfile -NonInteractive -Command '
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public static class LisaCred {
[StructLayout(LayoutKind.Sequential)]
private struct CREDENTIAL {
public int Flags; public int Type; public IntPtr TargetName; public IntPtr Comment;
public System.Runtime.InteropServices.ComTypes.FILETIME LastWritten;
public int CredentialBlobSize; public IntPtr CredentialBlob; public int Persist;
public int AttributeCount; public IntPtr Attributes; public IntPtr TargetAlias; public IntPtr UserName;
}
[DllImport("advapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
private static extern bool CredRead(string target, int type, int flags, out IntPtr credential);
[DllImport("advapi32.dll")] private static extern void CredFree(IntPtr cred);
public static string Read(string target) {
IntPtr p;
if (!CredRead(target, 1, 0, out p)) { return null; }
try {
CREDENTIAL c = (CREDENTIAL)Marshal.PtrToStructure(p, typeof(CREDENTIAL));
if (c.CredentialBlobSize == 0) { return String.Empty; }
return Marshal.PtrToStringUni(c.CredentialBlob, c.CredentialBlobSize / 2);
} finally { CredFree(p); }
}
}
"@
[LisaCred]::Read($env:LISA_CRED_TARGET)' 2>/dev/null | tr -d '\r' ;;
esac
}
EXISTING=$(read_token "$EMAIL")
if [ -n "$EXISTING" ]; then
# Validate against Confluence.
AUTH=$(printf '%s:%s' "$EMAIL" "$EXISTING" | base64)
CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Basic $AUTH" \
"https://api.atlassian.com/ex/confluence/${CLOUDID}/wiki/rest/api/space?limit=1")
if [ "$CODE" = "200" ]; then
echo "Existing Atlassian API token validated. Skipping setup."
# proceed to Step 4
fi
fi
If validation fails or no token is found, continue.
3b. Prompt the user to generate a token
Open the token-creation page in their browser:
case "$(uname -s)" in
Darwin) open "https://id.atlassian.com/manage-profile/security/api-tokens" ;;
Linux) xdg-open "https://id.atlassian.com/manage-profile/security/api-tokens" 2>/dev/null ;;
MINGW*|MSYS*|CYGWIN*) start "https://id.atlassian.com/manage-profile/security/api-tokens" ;;
esac
Then print these instructions for the user:
1. Click "Create API token with scopes" (NOT the legacy unscoped form).
2. Label it: lisa-confluence-<machine-name> (anything; just for revocation traceability)
3. App: Confluence
4. Select EXACTLY these scopes:
Read: read:page:confluence
read:hierarchical-content:confluence
read:comment:confluence
read:space:confluence
Write: write:page:confluence
write:comment:confluence
write:label:confluence
Search: search:confluence
5. Set an expiry (1 year max).
6. Click "Create token" and copy the value.
3c. Have the user store the token via OS keychain (token never enters chat)
Critical: don't use the interactive prompt form of security / secret-tool / cmdkey. Atlassian scoped tokens end with =<CRC> (a checksum); terminal getpass-style prompts on macOS Terminal.app and iTerm have been observed to silently truncate the paste at the = sign, storing a 128-byte prefix instead of the full ~192-byte token. The result authenticates as 401 because the CRC fails. Symptom: the stored token validates against printf length checks (the prefix is well-formed) but every API call returns 401 with x-failure-category: FAILURE_CLIENT_AUTH.
Always pipe from the clipboard instead. Print platform-specific commands that take $(pbpaste) / $(xsel) / $(Get-Clipboard) directly into the -w / store arg:
case "$(uname -s)" in
Darwin)
cat <<EOF
1. Click "Copy" in the Atlassian token-create modal so the token is in your clipboard.
2. Run this single line in your terminal — leading space keeps it out of zsh history:
security delete-generic-password -s lisa-atlassian -a "$EMAIL" 2>/dev/null; TOK="\$(pbpaste)"; security add-generic-password -U -s lisa-atlassian -a "$EMAIL" -w "\$TOK"; unset TOK
The token is piped from clipboard straight to keychain — no prompt, no truncation.
EOF
;;
Linux)
if command -v secret-tool >/dev/null 2>&1; then
# Pick whichever clipboard tool is available.
if command -v wl-paste >/dev/null 2>&1; then CLIP=wl-paste
elif command -v xclip >/dev/null 2>&1; then CLIP="xclip -selection clipboard -o"
elif command -v xsel >/dev/null 2>&1; then CLIP="xsel --clipboard --output"
else CLIP="cat" # caller will have to paste; fallback path below
fi
cat <<EOF
1. Click "Copy" in the Atlassian token modal so the token is in your clipboard.
2. Run this single line in your terminal:
secret-tool clear service lisa-atlassian account "$EMAIL" 2>/dev/null; pr
---
*Content truncated.*
When not to use it
- →When writing secrets to `.lisa.config.json`
- →When editing `.claude/settings.json` by hand-concatenation
- →When defaulting `tracker` or `source` from this skill
Limitations
- →Never writes secrets to `.lisa.config.json`
- →Never edits `.claude/settings.json` by hand-concatenation
- →Never defaults `tracker` or `source` from this skill
How it compares
This skill automates the complex process of setting up Atlassian access, including CLI tool installation and secure token management, which would otherwise be a manual, multi-step configuration.
Compared to similar skills
lisa-setup-atlassian side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| lisa-setup-atlassian (this skill) | 0 | 2mo | No flags | Intermediate |
| flow-next-work | 1 | 2mo | Review | Advanced |
| twinmind-core-workflow-b | 1 | 29d | Review | Intermediate |
| linear-core-workflow-a | 0 | 29d | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by CodySwannGT
View all by CodySwannGT →You might also like
flow-next-work
gmickel
Execute a Flow epic or task systematically with git setup, task tracking, quality checks, and commit workflow. Use when implementing a plan or working through a spec. Triggers on /flow-next:work with Flow IDs (fn-1-add-oauth, fn-1-add-oauth.2, or legacy fn-1, fn-1.2, fn-1-xxx, fn-1-xxx.2).
twinmind-core-workflow-b
jeremylongshore
Execute TwinMind secondary workflow: Action item extraction and follow-up automation. Use when automating meeting follow-ups, extracting tasks, or integrating with project management tools. Trigger with phrases like "twinmind action items", "meeting follow-up automation", "extract tasks from meeting".
linear-core-workflow-a
jeremylongshore
Issue lifecycle management with Linear: create, update, and transition issues. Use when implementing issue CRUD operations, state transitions, or building issue management features. Trigger with phrases like "linear issue workflow", "linear issue lifecycle", "create linear issues", "update linear issue", "linear state transition".
cm-start
tody-agent
Start the CM Workflow to execute your objective from idea to production code.
skill-team-implement
benbrastmckie
Orchestrate multi-agent implementation with parallel phase execution. Spawns teammates for independent phases and coordinates dependent phases. Includes debugger teammate for error recovery.
bad
stephenleo
BMad Autonomous Development — orchestrates parallel story implementation pipelines. Builds a dependency graph, updates PR status from GitHub, picks stories from the backlog, and runs each through create → dev → review → PR in parallel — each story isolated in its own git worktree — using dedicated s