Observed since 20 Oct, 16:30 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Agent-to-Atlassian — CLI and MCP server for AI agents to work with Jira & Confluence.
Agent-to-Atlassian
Give AI agents access to Jira and Confluence. Save credentials once, work from anywhere.
Jira + Confluence · read-only by default · pre-configured connections · compact TSV output
Quick Start · MCP Tools · Security · Comparison · Setup
Agent: "What's the status of PROJ-42? Add a comment with the progress update."
↓
a2atlassian → get issue, add comment, transition to In Progress
↓
Agent: "Done — PROJ-42 updated and moved to In Progress."
Existing Atlassian MCP servers (Rovo, sooperset) require Docker, .env files, and mcp-remote bridges. They dump 72 tools into agent context and have known quirks that silently fail. a2atlassian fixes all of that:
pip install a2atlassian and you're done.mcp.json with --register, agent works immediately--scope limits which projects an agent can see${ATLASSIAN_TOKEN} in configs, expanded only at runtimeScope today: a2atlassian ships Jira and Confluence tools. Confluence support shipped in v0.4.0.
# Recommended — installs globally as a CLI tool
uv tool install a2atlassian
# Or with pip
pip install a2atlassian
Claude Code (with pre-configured connection):
claude mcp add -s user a2atlassian -- uvx --from a2atlassian a2atlassian-mcp \
--register myproject https://mysite.atlassian.net user@company.com '${ATLASSIAN_TOKEN}'
Claude Code (minimal — agent calls login on demand):
claude mcp add -s user a2atlassian -- uvx --from a2atlassian a2atlassian-mcp
Claude Desktop / Cursor / any MCP client (.mcp.json):
{
"mcpServers": {
"a2atlassian": {
"command": "uvx",
"args": [
"--from", "a2atlassian", "a2atlassian-mcp",
"--register", "myproject", "https://mysite.atlassian.net",
"user@company.com", "${ATLASSIAN_TOKEN}"
],
"env": {
"ATLASSIAN_TOKEN": "your-api-token-here"
}
}
}
}
Multiple projects:
{
"args": [
"--from", "a2atlassian", "a2atlassian-mcp",
"--register", "myproject", "https://mysite.atlassian.net", "user@a.com", "${TOKEN_A}",
"--register", "personal", "https://personal.atlassian.net", "user@b.com", "${TOKEN_B}"
]
}
Scoped connections (limit agent to specific saved projects):
{
"args": ["--from", "a2atlassian", "a2atlassian-mcp", "--scope", "myproject"]
}
--register creates ephemeral in-memory connections (process lifetime, no files written). --scope filters which saved connections are visible. Both limit blast radius.
# Save a connection (validates by calling /myself)
a2atlassian login -p myproject \
--url https://mysite.atlassian.net \
--email user@company.com \
--token "$ATLASSIAN_TOKEN"
# Enable writes
a2atlassian login -p myproject \
--url https://mysite.atlassian.net \
--email user@company.com \
--token "$ATLASSIAN_TOKEN" \
--no-read-only
# List / remove connections
a2atlassian connections
a2atlassian logout -p myproject
| Tool | Description |
|---|---|
login | Save a connection — validates by calling /myself first |
logout | Remove a saved connection |
list_connections | List connections (no secrets exposed) |
| Tool | Description |
|---|---|
jira_get_issue | Get issue by key — full fields, status, assignee |
jira_search | Search by JQL with pagination — compact TSV output by default |
jira_get_comments | Get all comments for an issue |
jira_get_transitions | Discover available status transitions |
| Tool | Description |
|---|---|
jira_add_comment | Add comment (wiki markup, API v2) |
jira_edit_comment | Update existing comment |
jira_transition_issue | Move issue to new status |
| Tool | Purpose |
|---|---|
| confluence_get_page | Fetch a page by id (body storage, version, space) |
| confluence_get_page_children | List direct children of a page (paginated) |
| confluence_search | CQL search; minimal per-match rows |
| confluence_upsert_pages | Batch create-or-update with per-page status + partial-failure shape |
All tools accept a format parameter:
| Format | Default for | Description |
|---|---|---|
toon | Lists (search, comments) | TSV with header — shape once, data many. 30-60% fewer tokens than JSON |
json | Single entities (get_issue) | Standard JSON with metadata envelope |
List responses use a compact TSV-style format (header row + tab-separated values) inspired by TOON. This is the same approach a2db uses — column names appear once, then just values. For a 50-issue search result, this typically saves 40-60% of tokens compared to JSON.
TSV example (search results):
# search (23 results, 50ms, truncated: False)
key summary assignee status
PROJ-142 Fix auth timeout Alice Smith In Progress
PROJ-141 Add search filters Bob Jones To Do
JSON example (single issue):
{
"data": {"key": "PROJ-142", "fields": {"summary": "Fix auth timeout", ...}},
"count": 1,
"truncated": false,
"time_ms": 85
}
When something fails, a2atlassian tells the agent what to do:
Field 'asignee' does not exist
Did you mean: assignee?
Connection 'myproject' is read-only.
Run: a2atlassian login -p myproject --read-only false
Quirks handled automatically:
712020: account IDs) — auto-detected with hint{"key": "PROJ-14"} normalized to "PROJ-14" silentlyEvery connection starts read-only. Write tools check the connection flag before executing:
Connection 'myproject' is read-only.
Re-run 'a2atlassian login -p myproject --read-only false' to enable writes.
The human operator controls write access — not the agent.
Connections saved via login go to ~/.config/a2atlassian/connections/ as TOML files:
0600 (owner read/write only)${ATLASSIAN_TOKEN} syntax — env var references stored literally, expanded at runtimelist_connections shows project name, URL, and mode — never tokens--register keeps credentials in memory only, never written to diskUse --scope to limit which saved connections a specific MCP instance can access:
# Project config — only myproject visible, even if other connections are saved
uvx --from a2atlassian a2atlassian-mcp --scope myproject
Project-level MCP configs (.claude/mcp.json) override global configs — each repo sees only its own connections.
Built-in retry with exponential backoff for Atlassian's rate limits (429) and transient server errors (500). Two retries at 1s and 3s intervals before surfacing the error.
| Feature | a2atlassian | Rovo (official) | sooperset/mcp-atlassian |
|---|---|---|---|
| Setup | pip install | OAuth + Docker | Docker + .env + mcp-remote |
| Tools in context | 10 (Phase 1) | ~72 | ~72 |
| Connection management | TOML + --register + --scope | Per-session OAuth | .env file |
| Multi-project | Yes (scoped) | No | One .env per setup |
| Read-only default | Yes (per-connection) | No | No |
| Output format | TSV + JSON | JSON | JSON |
| Error enrichment | Field suggestions, quirk fixes | Generic errors | Generic errors |
| Quirk handling | Auto-fix (assignee, parent) | Documented workarounds | Documented workarounds |
| Rate limiting | Built-in retry | No | No |
| CLI | Yes | No | No |
| License | Apache 2.0 | Proprietary | MIT |
Phase 1 (current): Jira core — get/search issues, comments (CRUD), transitions. The secondary critical path.
Phase 2: Full Jira surface — sprints, boards, links, projects, fields, worklogs, attachments, watchers.
Phase 3: Confluence — pages, comments, attachments, labels, search.
# Recommended
uv tool install a2atlassian
# Or with pip
pip install a2atlassian
# CLI
a2atlassian login -p myproject --url https://mysite.atlassian.net --email me@co.com --token "$TOKEN"
# Or add as MCP server (see Quick Start)
uv tool install a2atlassian
# Pre-configured — no login needed
uvx --from a2atlassian a2atlassian-mcp --register ci https://mysite.atlassian.net ci-user@co.com "${CI_ATLASSIAN_TOKEN}"
make bootstrap # Install deps + hooks
make check # Lint + test + security (full gate)
make test # Tests with coverage
make lint # Lint only (never modifies files)
make fix # Auto-fix + lint
Apache 2.0
🏢 Agent-first Atlassian access since 2025.
Built by Denis Tomilin
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.5.1 | 23 Apr 2026 | 7 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 16:30 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:d5a60a415bb7cb907398f3663362f285c71d8a1b4585e999424f4a8773fef6eb