Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). This integration supports both Confluence & Jira Cloud and Server/Data Center deployments.
Ask your AI assistant to:
MCP Atlassian supports three authentication methods:
A. API Token Authentication (Cloud) - RecommendedNote
OAuth 2.0 is more complex to set up but provides enhanced security features. For most users, API Token authentication (Method A) is simpler and sufficient.
http://localhost:8080/callback
)docker run --rm -i \ -p 8080:8080 \ -v "${HOME}/.mcp-atlassian:/home/app/.mcp-atlassian" \ ghcr.io/sooperset/mcp-atlassian:latest --oauth-setup -v
Client ID
, Secret
, URI
, and Scope
.env
or IDE config:
ATLASSIAN_OAUTH_CLOUD_ID
(from wizard)ATLASSIAN_OAUTH_CLIENT_ID
ATLASSIAN_OAUTH_CLIENT_SECRET
ATLASSIAN_OAUTH_REDIRECT_URI
ATLASSIAN_OAUTH_SCOPE
Important
For the standard OAuth flow described above, include offline_access
in your scope (e.g., read:jira-work write:jira-work offline_access
). This allows the server to refresh the access token automatically.
If you are running mcp-atlassian part of a larger system that manages Atlassian OAuth 2.0 access tokens externally (e.g., through a central identity provider or another application), you can provide an access token directly to this MCP server. This method bypasses the interactive setup wizard and the server's internal token management (including refresh capabilities).
Requirements:
ATLASSIAN_OAUTH_CLOUD_ID
for your Atlassian instance.Configuration: To use this method, set the following environment variables (or use the corresponding command-line flags when starting the server):
ATLASSIAN_OAUTH_CLOUD_ID
: Your Atlassian Cloud ID. (CLI: --oauth-cloud-id
)ATLASSIAN_OAUTH_ACCESS_TOKEN
: Your pre-existing OAuth 2.0 access token. (CLI: --oauth-access-token
)Important Considerations for BYOT:
ATLASSIAN_OAUTH_CLIENT_ID
, ATLASSIAN_OAUTH_CLIENT_SECRET
, ATLASSIAN_OAUTH_REDIRECT_URI
, ATLASSIAN_OAUTH_SCOPE
) are not used and can be omitted when configuring for BYOT.--oauth-setup
wizard is not applicable and should not be used for this approach.-v "${HOME}/.mcp-atlassian:/home/app/.mcp-atlassian"
) is also not necessary if you are exclusively using the BYOT method, as no tokens are stored or managed by this server.This option is useful in scenarios where OAuth credential management is centralized or handled by other infrastructure components.
Tip
Multi-Cloud OAuth Support: If you're building a multi-tenant application where users provide their own OAuth tokens, see the Multi-Cloud OAuth Support section for minimal configuration setup.
MCP Atlassian is distributed as a Docker image. This is the recommended way to run the server, especially for IDE integration. Ensure you have Docker installed.
# Pull Pre-built Image docker pull ghcr.io/sooperset/mcp-atlassian:latest
MCP Atlassian is designed to be used with AI assistants through IDE integration.
Tip
For Claude Desktop: Locate and edit the configuration file directly:
%APPDATA%\Claude\claude_desktop_config.json
~/Library/Application Support/Claude/claude_desktop_config.json
~/.config/Claude/claude_desktop_config.json
For Cursor: Open Settings → MCP → + Add new global MCP server
There are two main approaches to configure the Docker container:
--env-file
flag (shown in collapsible sections)Note
Common environment variables include:
CONFLUENCE_SPACES_FILTER
: Filter by space keys (e.g., "DEV,TEAM,DOC")JIRA_PROJECTS_FILTER
: Filter by project keys (e.g., "PROJ,DEV,SUPPORT")READ_ONLY_MODE
: Set to "true" to disable write operationsMCP_VERBOSE
: Set to "true" for more detailed loggingMCP_LOGGING_STDOUT
: Set to "true" to log to stdout instead of stderrENABLED_TOOLS
: Comma-separated list of tool names to enable (e.g., "confluence_search,jira_get_issue")See the .env.example file for all available options.
📝 Configuration ExamplesMethod 1 (Passing Variables Directly):
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "CONFLUENCE_URL", "-e", "CONFLUENCE_USERNAME", "-e", "CONFLUENCE_API_TOKEN", "-e", "JIRA_URL", "-e", "JIRA_USERNAME", "-e", "JIRA_API_TOKEN", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "CONFLUENCE_URL": "https://your-company.atlassian.net/wiki", "CONFLUENCE_USERNAME": "your.email@company.com", "CONFLUENCE_API_TOKEN": "your_confluence_api_token", "JIRA_URL": "https://your-company.atlassian.net", "JIRA_USERNAME": "your.email@company.com", "JIRA_API_TOKEN": "your_jira_api_token" } } } }Alternative: Using Environment File
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "--env-file", "/path/to/your/mcp-atlassian.env", "ghcr.io/sooperset/mcp-atlassian:latest" ] } } }Server/Data Center Configuration
For Server/Data Center deployments, use direct variable passing:
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "-e", "CONFLUENCE_URL", "-e", "CONFLUENCE_PERSONAL_TOKEN", "-e", "CONFLUENCE_SSL_VERIFY", "-e", "JIRA_URL", "-e", "JIRA_PERSONAL_TOKEN", "-e", "JIRA_SSL_VERIFY", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "CONFLUENCE_URL": "https://confluence.your-company.com", "CONFLUENCE_PERSONAL_TOKEN": "your_confluence_pat", "CONFLUENCE_SSL_VERIFY": "false", "JIRA_URL": "https://jira.your-company.com", "JIRA_PERSONAL_TOKEN": "your_jira_pat", "JIRA_SSL_VERIFY": "false" } } } }
OAuth 2.0 Configuration (Cloud Only)[!NOTE] Set
CONFLUENCE_SSL_VERIFY
andJIRA_SSL_VERIFY
to "false" only if you have self-signed certificates.
These examples show how to configure mcp-atlassian
in your IDE (like Cursor or Claude Desktop) when using OAuth 2.0 for Atlassian Cloud.
Example for Standard OAuth 2.0 Flow (using Setup Wizard):
This configuration is for when you use the server's built-in OAuth client and have completed the OAuth setup wizard.
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "-v", "<path_to_your_home>/.mcp-atlassian:/home/app/.mcp-atlassian", "-e", "JIRA_URL", "-e", "CONFLUENCE_URL", "-e", "ATLASSIAN_OAUTH_CLIENT_ID", "-e", "ATLASSIAN_OAUTH_CLIENT_SECRET", "-e", "ATLASSIAN_OAUTH_REDIRECT_URI", "-e", "ATLASSIAN_OAUTH_SCOPE", "-e", "ATLASSIAN_OAUTH_CLOUD_ID", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "JIRA_URL": "https://your-company.atlassian.net", "CONFLUENCE_URL": "https://your-company.atlassian.net/wiki", "ATLASSIAN_OAUTH_CLIENT_ID": "YOUR_OAUTH_APP_CLIENT_ID", "ATLASSIAN_OAUTH_CLIENT_SECRET": "YOUR_OAUTH_APP_CLIENT_SECRET", "ATLASSIAN_OAUTH_REDIRECT_URI": "http://localhost:8080/callback", "ATLASSIAN_OAUTH_SCOPE": "read:jira-work write:jira-work read:confluence-content.all write:confluence-content offline_access", "ATLASSIAN_OAUTH_CLOUD_ID": "YOUR_CLOUD_ID_FROM_SETUP_WIZARD" } } } }
[!NOTE]
- For the Standard Flow:
ATLASSIAN_OAUTH_CLOUD_ID
is obtained from the--oauth-setup
wizard output or is known for your instance.- Other
ATLASSIAN_OAUTH_*
client variables are from your OAuth app in the Atlassian Developer Console.JIRA_URL
andCONFLUENCE_URL
for your Cloud instances are always required.- The volume mount (
-v .../.mcp-atlassian:/home/app/.mcp-atlassian
) is crucial for persisting the OAuth tokens obtained by the wizard, enabling automatic refresh.
Example for Pre-existing Access Token (BYOT - Bring Your Own Token):
This configuration is for when you are providing your own externally managed OAuth 2.0 access token.
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "-e", "JIRA_URL", "-e", "CONFLUENCE_URL", "-e", "ATLASSIAN_OAUTH_CLOUD_ID", "-e", "ATLASSIAN_OAUTH_ACCESS_TOKEN", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "JIRA_URL": "https://your-company.atlassian.net", "CONFLUENCE_URL": "https://your-company.atlassian.net/wiki", "ATLASSIAN_OAUTH_CLOUD_ID": "YOUR_KNOWN_CLOUD_ID", "ATLASSIAN_OAUTH_ACCESS_TOKEN": "YOUR_PRE_EXISTING_OAUTH_ACCESS_TOKEN" } } } }
Proxy Configuration[!NOTE]
- For the BYOT Method:
- You primarily need
JIRA_URL
,CONFLUENCE_URL
,ATLASSIAN_OAUTH_CLOUD_ID
, andATLASSIAN_OAUTH_ACCESS_TOKEN
.- Standard OAuth client variables (
ATLASSIAN_OAUTH_CLIENT_ID
,CLIENT_SECRET
,REDIRECT_URI
,SCOPE
) are not used.- Token lifecycle (e.g., refreshing the token before it expires and restarting mcp-atlassian) is your responsibility, as the server will not refresh BYOT tokens.
MCP Atlassian supports routing API requests through standard HTTP/HTTPS/SOCKS proxies. Configure using environment variables:
HTTP_PROXY
, HTTPS_PROXY
, NO_PROXY
, SOCKS_PROXY
.JIRA_HTTPS_PROXY
, CONFLUENCE_NO_PROXY
).Add the relevant proxy variables to the args
(using -e
) and env
sections of your MCP configuration:
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "... existing Confluence/Jira vars", "-e", "HTTP_PROXY", "-e", "HTTPS_PROXY", "-e", "NO_PROXY", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "... existing Confluence/Jira vars": "...", "HTTP_PROXY": "http://proxy.internal:8080", "HTTPS_PROXY": "http://proxy.internal:8080", "NO_PROXY": "localhost,.your-company.com" } } } }
Credentials in proxy URLs are masked in logs. If you set NO_PROXY
, it will be respected for requests to matching hosts.
MCP Atlassian supports adding custom HTTP headers to all API requests. This feature is particularly useful in corporate environments where additional headers are required for security, authentication, or routing purposes.
Custom headers are configured using environment variables with comma-separated key=value pairs:
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "CONFLUENCE_URL", "-e", "CONFLUENCE_USERNAME", "-e", "CONFLUENCE_API_TOKEN", "-e", "CONFLUENCE_CUSTOM_HEADERS", "-e", "JIRA_URL", "-e", "JIRA_USERNAME", "-e", "JIRA_API_TOKEN", "-e", "JIRA_CUSTOM_HEADERS", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "CONFLUENCE_URL": "https://your-company.atlassian.net/wiki", "CONFLUENCE_USERNAME": "your.email@company.com", "CONFLUENCE_API_TOKEN": "your_confluence_api_token", "CONFLUENCE_CUSTOM_HEADERS": "X-Confluence-Service=mcp-integration,X-Custom-Auth=confluence-token,X-ALB-Token=secret-token", "JIRA_URL": "https://your-company.atlassian.net", "JIRA_USERNAME": "your.email@company.com", "JIRA_API_TOKEN": "your_jira_api_token", "JIRA_CUSTOM_HEADERS": "X-Forwarded-User=service-account,X-Company-Service=mcp-atlassian,X-Jira-Client=mcp-integration" } } } }
Security Considerations:
MCP Atlassian supports multi-cloud OAuth scenarios where each user connects to their own Atlassian cloud instance. This is useful for multi-tenant applications, chatbots, or services where users provide their own OAuth tokens.
Minimal OAuth Configuration:
Enable minimal OAuth mode (no client credentials required):
docker run -e ATLASSIAN_OAUTH_ENABLE=true -p 9000:9000 \ ghcr.io/sooperset/mcp-atlassian:latest \ --transport streamable-http --port 9000
Users provide authentication via HTTP headers:
Authorization: Bearer <user_oauth_token>
X-Atlassian-Cloud-Id: <user_cloud_id>
Example Integration (Python):
import asyncio from mcp.client.streamable_http import streamablehttp_client from mcp import ClientSession user_token = "user-specific-oauth-token" user_cloud_id = "user-specific-cloud-id" async def main(): # Connect to streamable HTTP server with custom headers async with streamablehttp_client( "http://localhost:9000/mcp", headers={ "Authorization": f"Bearer {user_token}", "X-Atlassian-Cloud-Id": user_cloud_id } ) as (read_stream, write_stream, _): # Create a session using the client streams async with ClientSession(read_stream, write_stream) as session: # Initialize the connection await session.initialize() # Example: Get a Jira issue result = await session.call_tool( "jira_get_issue", {"issue_key": "PROJ-123"} ) print(result) asyncio.run(main())
Configuration Notes:
X-Atlassian-Cloud-Id
headerATLASSIAN_OAUTH_CLOUD_ID
if header not providedFor Confluence Cloud only:
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "-e", "CONFLUENCE_URL", "-e", "CONFLUENCE_USERNAME", "-e", "CONFLUENCE_API_TOKEN", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "CONFLUENCE_URL": "https://your-company.atlassian.net/wiki", "CONFLUENCE_USERNAME": "your.email@company.com", "CONFLUENCE_API_TOKEN": "your_api_token" } } } }
For Confluence Server/DC, use:
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "-e", "CONFLUENCE_URL", "-e", "CONFLUENCE_PERSONAL_TOKEN", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "CONFLUENCE_URL": "https://confluence.your-company.com", "CONFLUENCE_PERSONAL_TOKEN": "your_personal_token" } } } }
For Jira Cloud only:
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "-e", "JIRA_URL", "-e", "JIRA_USERNAME", "-e", "JIRA_API_TOKEN", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "JIRA_URL": "https://your-company.atlassian.net", "JIRA_USERNAME": "your.email@company.com", "JIRA_API_TOKEN": "your_api_token" } } } }
For Jira Server/DC, use:
{ "mcpServers": { "mcp-atlassian": { "command": "docker", "args": [ "run", "--rm", "-i", "-e", "JIRA_URL", "-e", "JIRA_PERSONAL_TOKEN", "ghcr.io/sooperset/mcp-atlassian:latest" ], "env": { "JIRA_URL": "https://jira.your-company.com", "JIRA_PERSONAL_TOKEN": "your_personal_token" } } } }👥 HTTP Transport Configuration
Instead of using stdio
, you can run the server as a persistent HTTP service using either:
sse
(Server-Sent Events) transport at /sse
endpointstreamable-http
transport at /mcp
endpointBoth transport types support single-user and multi-user authentication:
Authentication Options:
Start the server with your chosen transport:
# For SSE transport docker run --rm -p 9000:9000 \ --env-file /path/to/your/.env \ ghcr.io/sooperset/mcp-atlassian:latest \ --transport sse --port 9000 -vv # OR for streamable-http transport docker run --rm -p 9000:9000 \ --env-file /path/to/your/.env \ ghcr.io/sooperset/mcp-atlassian:latest \ --transport streamable-http --port 9000 -vv
Configure your IDE (single-user example):
SSE Transport Example:
{ "mcpServers": { "mcp-atlassian-http": { "url": "http://localhost:9000/sse" } } }
Streamable-HTTP Transport Example:
{ "mcpServers": { "mcp-atlassian-service": { "url": "http://localhost:9000/mcp" } } }
Here's a complete example of setting up multi-user authentication with streamable-HTTP transport:
First, run the OAuth setup wizard to configure the server's OAuth credentials:
docker run --rm -i \ -p 8080:8080 \ -v "${HOME}/.mcp-atlassian:/home/app/.mcp-atlassian" \ ghcr.io/sooperset/mcp-atlassian:latest --oauth-setup -v
Start the server with streamable-HTTP transport:
docker run --rm -p 9000:9000 \ --env-file /path/to/your/.env \ ghcr.io/sooperset/mcp-atlassian:latest \ --transport streamable-http --port 9000 -vv
Configure your IDE's MCP settings:
Choose the appropriate Authorization method for your Atlassian deployment:
Cloud (OAuth 2.0) Example:
{ "mcpServers": { "mcp-atlassian-service": { "url": "http://localhost:9000/mcp", "headers": { "Authorization": "Bearer <USER_OAUTH_ACCESS_TOKEN>" } } } }
Server/Data Center (PAT) Example:
{ "mcpServers": { "mcp-atlassian-service": { "url": "http://localhost:9000/mcp", "headers": { "Authorization": "Token <USER_PERSONAL_ACCESS_TOKEN>" } } } }
.env
:
JIRA_URL=https://your-company.atlassian.net CONFLUENCE_URL=https://your-company.atlassian.net/wiki ATLASSIAN_OAUTH_CLIENT_ID=your_oauth_app_client_id ATLASSIAN_OAUTH_CLIENT_SECRET=your_oauth_app_client_secret ATLASSIAN_OAUTH_REDIRECT_URI=http://localhost:8080/callback ATLASSIAN_OAUTH_SCOPE=read:jira-work write:jira-work read:confluence-content.all write:confluence-content offline_access ATLASSIAN_OAUTH_CLOUD_ID=your_cloud_id_from_setup_wizard
[!NOTE]
- The server should have its own fallback authentication configured (e.g., via environment variables for API token, PAT, or its own OAuth setup using --oauth-setup). This is used if a request doesn't include user-specific authentication.
- OAuth: Each user needs their own OAuth access token from your Atlassian OAuth app.
- PAT: Each user provides their own Personal Access Token.
- Multi-Cloud: For OAuth users, optionally include
X-Atlassian-Cloud-Id
header to specify which Atlassian cloud instance to use- The server will use the user's token for API calls when provided, falling back to server auth if not
- User tokens should have appropriate scopes for their needed operations
jira_get_issue
: Get details of a specific issuejira_search
: Search issues using JQLjira_create_issue
: Create a new issuejira_update_issue
: Update an existing issuejira_transition_issue
: Transition an issue to a new statusjira_add_comment
: Add a comment to an issueconfluence_search
: Search Confluence content using CQLconfluence_get_page
: Get content of a specific pageconfluence_create_page
: Create a new pageconfluence_update_page
: Update an existing pagejira_search
confluence_search
jira_get_issue
confluence_get_page
jira_get_all_projects
confluence_get_page_children
jira_get_project_issues
confluence_get_comments
jira_get_worklog
confluence_get_labels
jira_get_transitions
confluence_search_user
jira_search_fields
jira_get_agile_boards
jira_get_board_issues
jira_get_sprints_from_board
jira_get_sprint_issues
jira_get_issue_link_types
jira_batch_get_changelogs
* jira_get_user_profile
jira_download_attachments
jira_get_project_versions
Write jira_create_issue
confluence_create_page
jira_update_issue
confluence_update_page
jira_delete_issue
confluence_delete_page
jira_batch_create_issues
confluence_add_label
jira_add_comment
confluence_add_comment
jira_transition_issue
jira_add_worklog
jira_link_to_epic
jira_create_sprint
jira_update_sprint
jira_create_issue_link
jira_remove_issue_link
jira_create_version
jira_batch_create_versions
*Tool only available on Jira Cloud
Tool Filtering and Access ControlThe server provides two ways to control tool access:
Tool Filtering: Use --enabled-tools
flag or ENABLED_TOOLS
environment variable to specify which tools should be available:
# Via environment variable ENABLED_TOOLS="confluence_search,jira_get_issue,jira_search" # Or via command line flag docker run ... --enabled-tools "confluence_search,jira_get_issue,jira_search" ...
Read/Write Control: Tools are categorized as read or write operations. When READ_ONLY_MODE
is enabled, only read operations are available regardless of ENABLED_TOOLS
setting.
CONFLUENCE_USERNAME
and CONFLUENCE_API_TOKEN
(where token is your password)CONFLUENCE_SSL_VERIFY=false
or JIRA_SSL_VERIFY=false
To verify custom headers are being applied correctly:
Enable Debug Logging: Set MCP_VERY_VERBOSE=true
to see detailed request logs
# In your .env file or environment MCP_VERY_VERBOSE=true MCP_LOGGING_STDOUT=true
Check Header Parsing: Custom headers appear in logs with masked values for security:
DEBUG Custom headers applied: {'X-Forwarded-User': '***', 'X-ALB-Token': '***'}
Verify Service-Specific Headers: Check logs to confirm the right headers are being used:
DEBUG Jira request headers: service-specific headers applied
DEBUG Confluence request headers: service-specific headers applied
Test Header Format: Ensure your header string format is correct:
# Correct format JIRA_CUSTOM_HEADERS=X-Custom=value1,X-Other=value2 CONFLUENCE_CUSTOM_HEADERS=X-Custom=value1,X-Other=value2 # Incorrect formats (will be ignored) JIRA_CUSTOM_HEADERS="X-Custom=value1,X-Other=value2" # Extra quotes JIRA_CUSTOM_HEADERS=X-Custom: value1,X-Other: value2 # Colon instead of equals JIRA_CUSTOM_HEADERS=X-Custom = value1 # Spaces around equals
Security Note: Header values containing sensitive information (tokens, passwords) are automatically masked in logs to prevent accidental exposure.
# Using MCP Inspector for testing npx @modelcontextprotocol/inspector uvx mcp-atlassian ... # For local development version npx @modelcontextprotocol/inspector uv --directory /path/to/your/mcp-atlassian run mcp-atlassian ... # View logs # macOS tail -n 20 -f ~/Library/Logs/Claude/mcp*.log # Windows type %APPDATA%\Claude\logs\mcp*.log | more
We welcome contributions to MCP Atlassian! If you'd like to contribute:
We use pre-commit hooks for code quality and follow semantic versioning for releases.
Licensed under MIT - see LICENSE file. This is not an official Atlassian product.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4