MCP server for Atlassian Cloud (Confluence & Jira) with seamless OAuth 2.0 authentication. This server enables AI agents to help users document work in Confluence, manage Jira issues, and understand project context.
- Seamless OAuth 2.0 Flow: Automatic browser-based authentication with PKCE security
- Modular Architecture: Specialized client classes for Jira, Confluence, and Service Desk operations
- Selective Module Loading: Configure which modules to load using environment variables
- Jira Integration: Search, create, and update issues; add comments; manage work
- Confluence Integration: Search and read content for context understanding
- Service Management: Access support tickets and requests
- Automatic Token Management: Handles token refresh automatically
- Minimal Permissions: Follows least privilege principle with only required scopes
The server uses a modular architecture with specialized client classes:
- BaseAtlassianClient: Core OAuth 2.0 authentication and HTTP request handling
- JiraClient: Jira-specific operations (issues, projects, comments)
- ConfluenceClient: Confluence-specific operations (pages, spaces, search)
- ServiceDeskClient: Service Management operations (requests, approvals, Assets CMDB)
Each module can be independently enabled/disabled for optimal performance and security.
This MCP server is designed to help AI agents assist users with:
- Work Documentation: Help document work progress and decisions in Confluence
- Issue Management: Create, update, and track Jira issues based on conversations
- Context Understanding: Read Confluence pages to understand project background
- Time & Activity Logging: Track work activities and time spent on tasks
- Service Requests: Access service management tickets for support context
- Project Coordination: Search across Jira and Confluence for project information
- Go to Atlassian Developer Console
- Click Create → OAuth 2.0 integration
- Enter your app name and accept the terms
- Set Callback URL to:
http://localhost:8080/callback
IMPORTANT: You must add these exact scopes to your OAuth app before the MCP server can function properly.
Navigate to Permissions → Jira API and add:
read:jira-work- Read issues, projects, and searchread:jira-user- Read user informationwrite:jira-work- Create and update issues
Navigate to Permissions → Confluence API and add:
read:page:confluence- Read page content (granular scope for v2 API)read:space:confluence- Read space information (granular scope for v2 API)write:page:confluence- Create and update pages (granular scope for v2 API)
Navigate to Permissions → Jira Service Management API and add:
read:servicedesk-request- Read service management requestswrite:servicedesk-request- Create and update service management requestsmanage:servicedesk-customer- Manage service desk customers and participantsread:knowledgebase:jira-service-management- Search knowledge base articles
Navigate to Permissions → User identity API and add:
read:me- User profile information
These are typically available by default:
offline_access- Token refresh capability
After configuring scopes, you need to install the app to your Atlassian site:
- In your OAuth app, go to Authorization tab
- Use the Authorization URL generator to create an installation URL:
- Select your configured scopes
- Choose your Atlassian site from the dropdown
- Click Generate URL
- Visit the generated URL in your browser to install the app to your site
- Grant permissions when prompted by Atlassian
Note: This step is required before the MCP server can access your Atlassian data. The app must be installed and authorized for your specific site.
After installing the app:
- Go to Settings tab in your OAuth app
- Copy your Client ID and Client Secret
- Set the environment variables (see Configuration section below)
Minimal Required (12 scopes):
read:jira-work
read:jira-user
write:jira-work
read:page:confluence
read:space:confluence
write:page:confluence
read:servicedesk-request
write:servicedesk-request
manage:servicedesk-customer
read:knowledgebase:jira-service-management
read:me
offline_access
Optional (add only if needed):
write:servicedesk-request # Only if creating service tickets
manage:* scopes # Only for administrative operations
If you get scope-related errors:
- "scope does not match": The scope isn't added to your OAuth app in Developer Console
- "Current user not permitted": User lacks product-level permissions (contact your Atlassian admin)
- "Unauthorized": Check that all required scopes are properly configured
Note: After adding new scopes to your OAuth app, you must re-authenticate using the authenticate_atlassian tool to get fresh tokens with the new permissions.
- Python 3.8 or higher
- pip3 package manager
- Access to an Atlassian Cloud site
- OAuth app configured (see OAuth App Setup above)
pip3 install atlassian-mcp-server# Install directly from GitHub repository
pip3 install git+https://github.com/rorymcmahon/atlassian-mcp-server.git# Clone the repository
git clone https://github.com/rorymcmahon/atlassian-mcp-server.git
cd atlassian-mcp-server
# Install in development mode
pip3 install -e .# Check that the command is available
atlassian-mcp-server --help
# Or check the Python module
python -m atlassian_mcp_server --helpSet the following environment variables:
export ATLASSIAN_SITE_URL="https://your-domain.atlassian.net"
export ATLASSIAN_CLIENT_ID="your-oauth-client-id"
export ATLASSIAN_CLIENT_SECRET="your-oauth-client-secret"Module Selection: Control which modules are loaded (default: all modules enabled):
export ATLASSIAN_MODULES="jira,confluence,service_desk" # Enable specific modules
export ATLASSIAN_MODULES="jira,confluence" # Enable only Jira and Confluence
export ATLASSIAN_MODULES="jira" # Enable only JiraAvailable modules:
jira- Jira issue management and project operationsconfluence- Confluence page and space operationsservice_desk- Service Management and Assets CMDB operations
Note: Disabling unused modules reduces memory usage and improves startup time.
# Start the MCP server
python -m atlassian_mcp_server
# Or run directly
python src/atlassian_mcp_server/server.pyNote: All configuration examples below show the required environment variables. You can optionally add "ATLASSIAN_MODULES": "jira,confluence,service_desk" to any env section to control which modules are loaded.
Add to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"atlassian": {
"command": "atlassian-mcp-server",
"env": {
"ATLASSIAN_SITE_URL": "https://your-domain.atlassian.net",
"ATLASSIAN_CLIENT_ID": "your-oauth-client-id",
"ATLASSIAN_CLIENT_SECRET": "your-oauth-client-secret"
}
}
}
}Create an agent configuration file:
File: ~/.aws/amazonq/cli-agents/atlassian.json
{
"$schema": "https://raw.githubusercontent.com/aws/amazon-q-developer-cli/refs/heads/main/schemas/agent-v1.json",
"name": "atlassian",
"description": "Atlassian Jira and Confluence integration agent",
"prompt": "You are an AI assistant with access to Atlassian Jira and Confluence. Help users manage issues, search content, and document their work.",
"mcpServers": {
"atlassian-mcp-server": {
"command": "atlassian-mcp-server",
"args": [],
"env": {
"ATLASSIAN_SITE_URL": "https://your-domain.atlassian.net",
"ATLASSIAN_CLIENT_ID": "your-oauth-client-id",
"ATLASSIAN_CLIENT_SECRET": "your-oauth-client-secret"
},
"autoApprove": ["*"],
"disabled": false,
"timeout": 60000,
"initTimeout": 120000
}
},
"tools": [
"@atlassian-mcp-server/*"
],
"allowedTools": [
"@atlassian-mcp-server/*"
]
}Then use: q chat --agent atlassian
Add to your Continue configuration:
File: ~/.continue/config.json
{
"models": [...],
"mcpServers": {
"atlassian": {
"command": "atlassian-mcp-server",
"env": {
"ATLASSIAN_SITE_URL": "https://your-domain.atlassian.net",
"ATLASSIAN_CLIENT_ID": "your-oauth-client-id",
"ATLASSIAN_CLIENT_SECRET": "your-oauth-client-secret"
}
}
}
}For GitHub Copilot Chat with MCP support, add to workspace settings:
File: .vscode/settings.json
{
"github.copilot.chat.mcp.servers": {
"atlassian": {
"command": "atlassian-mcp-server",
"env": {
"ATLASSIAN_SITE_URL": "https://your-domain.atlassian.net",
"ATLASSIAN_CLIENT_ID": "your-oauth-client-id",
"ATLASSIAN_CLIENT_SECRET": "your-oauth-client-secret"
}
}
}
}Add to Cline's MCP configuration:
File: ~/.cline/mcp_servers.json
{
"atlassian": {
"command": "atlassian-mcp-server",
"env": {
"ATLASSIAN_SITE_URL": "https://your-domain.atlassian.net",
"ATLASSIAN_CLIENT_ID": "your-oauth-client-id",
"ATLASSIAN_CLIENT_SECRET": "your-oauth-client-secret"
}
}
}For security, set environment variables instead of hardcoding in config files:
# Add to your shell profile (.bashrc, .zshrc, etc.)
export ATLASSIAN_SITE_URL="https://your-domain.atlassian.net"
export ATLASSIAN_CLIENT_ID="your-oauth-client-id"
export ATLASSIAN_CLIENT_SECRET="your-oauth-client-secret"Then use in configurations:
{
"env": {
"ATLASSIAN_SITE_URL": "${ATLASSIAN_SITE_URL}",
"ATLASSIAN_CLIENT_ID": "${ATLASSIAN_CLIENT_ID}",
"ATLASSIAN_CLIENT_SECRET": "${ATLASSIAN_CLIENT_SECRET}"
}
}- Start the MCP server
- Use the
authenticate_atlassiantool to begin OAuth flow - Browser opens automatically to Atlassian login
- After authorization, authentication completes automatically
- Credentials are saved locally for future use
authenticate_atlassian()- Start seamless OAuth authentication flow
jira_search(jql, max_results=50)- Search issues with JQLjira_get_issue(issue_key)- Get specific issue detailsjira_create_issue(project_key, summary, description, issue_type="Task")- Create new issuejira_update_issue(issue_key, summary=None, description=None)- Update existing issuejira_add_comment(issue_key, comment)- Add comment to issue
confluence_search(query, limit=10)- Search Confluence contentconfluence_get_page(page_id)- Get specific page contentconfluence_create_page(space_key, title, content, parent_id=None)- Create new Confluence pageconfluence_update_page(page_id, title, content, version)- Update existing Confluence page
confluence_list_spaces(limit=25, space_type=None, status="current")- List available spacesconfluence_get_space(space_id, include_icon=False)- Get detailed space informationconfluence_get_space_pages(space_id, limit=25, status="current")- Get pages in a space
confluence_search_content(query, limit=25, space_id=None)- Advanced content searchconfluence_get_page_children(page_id, limit=25)- Get child pages
confluence_get_page_comments(page_id, limit=25)- Get page commentsconfluence_add_comment(page_id, comment, parent_comment_id=None)- Add comment to pageconfluence_get_comment(comment_id)- Get specific comment details
confluence_get_page_labels(page_id, limit=25)- Get labels for a pageconfluence_search_by_label(label_id, limit=25)- Find pages with specific labelconfluence_list_labels(limit=25, prefix=None)- List all available labels
confluence_get_page_attachments(page_id, limit=25)- Get page attachmentsconfluence_get_attachment(attachment_id)- Get attachment details
confluence_get_page_versions(page_id, limit=25)- Get page version historyconfluence_get_page_version(page_id, version_number)- Get specific page version
servicedesk_check_availability()- Check if Jira Service Management is configuredservicedesk_list_service_desks(limit=50)- List available service desks for creating requestsservicedesk_get_service_desk(service_desk_id)- Get detailed service desk informationservicedesk_list_request_types(service_desk_id=None, limit=50)- List available request typesservicedesk_get_request_type(service_desk_id, request_type_id)- Get detailed request type informationservicedesk_get_request_type_fields(service_desk_id, request_type_id)- Get required/optional fields for request type
servicedesk_get_requests(service_desk_id=None, limit=50)- Get service desk requestsservicedesk_get_request(issue_key)- Get specific service desk request detailsservicedesk_create_request(service_desk_id, request_type_id, summary, description)- Create new service requestservicedesk_add_comment(issue_key, comment, public=True)- Add comment to service requestservicedesk_get_request_comments(issue_key, limit=50)- Get comments for a service requestservicedesk_get_request_status(issue_key)- Get service request statusservicedesk_get_request_transitions(issue_key)- Get available status transitions for requestservicedesk_transition_request(issue_key, transition_id, comment=None)- Transition request to new status
servicedesk_get_approvals(issue_key)- Get approval information for requestservicedesk_approve_request(issue_key, approval_id, decision)- Approve or decline request approvalservicedesk_get_participants(issue_key)- Get participants for requestservicedesk_add_participants(issue_key, usernames)- Add participants to request (with confirmation prompts)servicedesk_manage_notifications(issue_key, subscribe)- Subscribe/unsubscribe from request notifications
- Ensure redirect URI matches exactly:
http://localhost:8080/callback - Check that all required scopes are configured in Atlassian Developer Console
- Verify environment variables are set correctly
- Ensure your user has appropriate Jira and Confluence access
- Check that OAuth app has all required scopes enabled
- Verify user is in correct groups (e.g., confluence-users)
- Check that your Atlassian site URL is correct
- Ensure you have proper permissions for the resources you're accessing
- Run the test scripts to verify functionality
This MCP server uses minimal required scopes following the principle of least privilege:
- Jira:
read:jira-work,read:jira-user,write:jira-work - Confluence:
read:page:confluence,read:space:confluence,write:page:confluence,read:comment:confluence,write:comment:confluence,read:label:confluence,read:attachment:confluence - Service Management:
read:servicedesk-request,write:servicedesk-request,manage:servicedesk-customer,read:knowledgebase:jira-service-management - Core:
read:me,offline_access
manage:*scopes - Only for administrative operations
This MCP server uses granular scopes for Confluence operations to ensure compatibility with Confluence v2 API endpoints. The v2 API provides better performance and future-proofing compared to the deprecated v1 REST API.
Granular vs Classic Scopes:
- Granular (recommended):
read:page:confluence,write:page:confluence- Works with v2 API - Classic (deprecated):
read:confluence-content.all,write:confluence-content- Only works with v1 API
If you previously configured classic scopes, you'll need to update your OAuth app to use granular scopes and re-authenticate to get fresh tokens.
This project implements comprehensive supply chain security measures:
- Pinned Versions: All dependencies use exact version pins to prevent unexpected updates
- Security Scanning: Automated vulnerability scanning with Safety and pip-audit
- Dependency Tracking: Complete dependency documentation in
docs/DEPENDENCIES.md - Regular Updates: Weekly automated security checks via GitHub Actions
# Generate dependency report
python3 scripts/generate_dependency_report.py
# Check for vulnerabilities
pip3 install safety pip-audit
safety check
pip-audit
# Update dependencies safely
python3 scripts/update_dependencies.pyrequirements.txt- Pinned production dependenciesdocs/DEPENDENCIES.md- Human-readable dependency reportdocs/dependency-report.json- Machine-readable dependency dataSECURITY.md- Security policy and vulnerability response.github/workflows/dependency-security.yml- Automated security checks
The server is built using:
- FastMCP: Modern MCP server framework
- httpx: Async HTTP client
- Pydantic: Data validation and settings management
MIT License - see LICENSE file for details.