SafetyCard Request a review

MCP Atlassian

Python MCP server (FastMCP) exposing about 98 Jira and Confluence tools for Atlassian Cloud and Server/Data Center.

github.com/sooperset/mcp-atlassian · 2026-10-05 · 0a5d242

Defense-in-depth score

5.7 / 10

MCP Atlassian gives an AI assistant about 98 Jira and Confluence tools, and in the README setup it runs them all, writes included, with the user's own long-lived API token. It runs no code, keeps no memory and loads no plugins, and it labels every tool clearly as read-only or as a write, with a server-enforced read-only mode, but that mode is off by default. The dominant risk is prompt injection through issues, comments, pages or service-desk requests: a hijacked session can copy private data into pages or comments and delete issues with nothing in the server asking a human. There is also no audit record of the changes it makes.

Safest setup

MCP Atlassian runs no code, keeps no memory and labels every tool as read-only or as a write, but as shipped it loads every toolset, writes included, on the user's own full-access token, and records no successful calls. The safest setup narrows the account, turns on the read-only and toolset settings the server already includes, and bounds the work it can do.

SetupHowWhat it gives you
A dedicated, narrow accountCreate the API token or personal access token under an Atlassian account that can see only the projects and spaces the task needs, read-only where the task allowsJira and Confluence themselves refuse anything outside that account's access, and its changes show under its own name in Atlassian history C1
OAuth with read scopesOn Atlassian Cloud, run --oauth-setup with ATLASSIAN_OAUTH_SCOPE listing only read scopes such as read:jira-workA grant limited to the scopes you name in place of a long-lived full-access token, kept in the OS keyring C1
Read-only modeREAD_ONLY_MODE=true in the environment, or --read-onlyEvery write tool is removed from the listing and refused at call time, so content the model reads cannot lead to edits, comments or deletions C5
Only the toolsets neededSet TOOLSETS (or --toolsets) to the core default set or to just the toolsets the task usesThe model sees a smaller set of tools, with write tools only where you chose them C3
Result and rate ceilingsSet ATLASSIAN_MAX_PAGINATION_LIMIT and ATLASSIAN_REQUESTS_PER_SECOND to positive valuesSearches stop at a fixed number of results and calls to Atlassian run at a bounded rate C10
A clean working directoryHave the MCP host start the server from a directory holding only files you are happy to attach to Jira or ConfluenceThe attachment and page-from-file tools can reach only those files C3

Approving with confidence

  • Read each prompt and approve write calls one at a time; deleted issues and attachments cannot be restored, and comments notify people at once.
  • The server marks each tool as read-only or destructive, so a host that asks before non-read-only tools gives you a check on every write.

Handling data

  • Keep the default log level; MCP_VERY_VERBOSE and -vv turn on debug output from HTTP libraries that the server's masking does not cover.

Key gaps (1)

  1. In the default configuration a session that reads other people's issues, comments or pages can also write, comment, upload and delete across the user's whole Jira and Confluence access, with no server-enforced human step. C5 · Untrusted input blast radius

Criteria

C1 Identity & least privilege

0.40 / 1.00

In the scored setup the server signs every Jira and Confluence call with the one API token or personal access token the user puts in its environment. Atlassian API tokens carry the user's full access to both products, and the server does no per-tool or per-request authorization of its own, so whatever the user can read or change, the connected model can too. OAuth 2.0 is an opt-in alternative that asks for named scopes (by default read and write on Jira work plus Confluence space summaries), but read and write still share one grant. The opt-in HTTP transport supports per-user tokens supplied in request headers; that mode was not the scored default.

C2 Approval gates

0.63 / 1.00

As a tool server, this project leaves approval to the MCP host, and what it gives the host is good risk signalling: all 98 tools are split into separate read and write tools, every read tool is marked read-only and every write tool carries a destructive or non-destructive hint. A server-enforced read-only mode removes write tools both from the listing and at call time, and every write tool also checks it. There is no preview or dry-run for destructive operations except a validate-only option on batch issue creation, and the read-only mode is off by default. Deleted Jira issues and sent comments or notifications cannot be undone.

C3 Tool & action scoping

0.40 / 1.00

Tools are narrow, purpose-built Jira and Confluence operations (create issue, add comment, update page) with typed arguments, issue-key patterns and bounded page sizes on most list tools, rather than a generic HTTP or query passthrough for writes. The few tools that read local files (attachment upload and page content from a file) resolve the path, following symlinks, and refuse anything outside the server's working directory. Search tools pass the model's JQL or CQL to Atlassian unchanged, and the issue search accepts any result limit. In the scored setup every toolset is enabled, including all write tools, and optional project and space filters are off, so a misused tool can act anywhere the user's account reaches.

C4 Code-execution isolation

N/A · full credit 1.00 / 1.00

The server has no code-execution path: it makes HTTP calls to Atlassian and converts content between Markdown and Atlassian formats, and nothing in the source runs a shell, spawns a process, or evaluates model-supplied code. JQL and CQL strings are sent to Atlassian's search APIs, which interpret them server-side as read-only queries.

C5 Untrusted input blast radius

0.25 / 1.00

Issue descriptions, comments, Confluence pages and service-desk requests are written by many people, including external customers, and the server returns them to the model as JSON fields alongside metadata, with no marker saying which text is untrusted. Tool descriptions and server instructions are plain and contain no directives aimed at the model. In the scored setup the same session can read that content, read private data across the user's Jira and Confluence, and write, comment, delete or upload local files, and nothing in the server breaks that combination; the read-only mode that would remove the write leg is off by default. A successful injection can therefore leak private data into a page or comment and take irreversible actions without any human step the server enforces.

C6 Memory, context & configuration integrity

N/A · full credit 1.00 / 1.00

The server keeps no memory between calls and loads no instruction files. Its only auto-loaded configuration is a .env file, which python-dotenv looks for starting from the installed package's own directory (for the README's uvx install, a user cache path) rather than the current project, and the server's tools cannot write local files (attachment downloads are returned inline). Nothing the model reads can therefore persist into later sessions through the server.

C7 Third-party extensions

N/A · full credit 1.00 / 1.00

The server loads no plugins, MCP servers, downloaded tools or model files at runtime. The only dynamic import is an opt-in OAuth-proxy storage backend whose module path the operator sets in an environment variable, which is operator configuration rather than an extension the model or content can add.

C8 Secrets & sensitive-data protection

0.45 / 1.00

Credentials come from environment variables (or the MCP host's config file), OAuth tokens are kept in the OS keyring with a 0600 file fallback, and the code masks tokens and authorization headers wherever it logs them. There is no telemetry or crash reporting. Credentials never enter tool results, but Jira and Confluence content returned to the model is not scanned for secrets, and error text from failed calls is passed back to the model as is. The default API token is long-lived and covers the user's whole Jira and Confluence access.

C9 Audit & traceability

0.13 / 1.00

The server keeps no audit record of what it did. Logs go to standard error at WARNING level by default, so successful tool calls (creates, updates, deletes) are not recorded at all; only failed calls and warnings appear, as unstructured text. Raising verbosity adds informational lines for some operations, but there is no structured per-call record, no actor attribution and no durable storage; the MCP host's own logs are not credited.

C10 Limits & kill switch

0.40 / 1.00

The server bounds some of its own work: every Atlassian HTTP call has a 75-second timeout by default, inline attachments are capped at 50 MB, and most list tools cap page size at 50. Retries, a concurrency cap, an outbound rate limit, a circuit breaker and a pagination ceiling all exist but are off by default. The issue search accepts any limit and pages until it is reached, and attachments are read fully into memory before the size check. When the host process exits, the stdio server notices and cancels its main task, though synchronous HTTP calls already in flight run to their timeout.