mcp atlassian
Model Context Protocol (MCP) server for Atlassian Cloud products (Confluence and Jira). This integration is designed specifically for Atlassian Cloud instances and does not support Atlassian Server or Data Center deployments.
Model Context Protocol (MCP) server for Atlassian Cloud products (Confluence and Jira). This integration is designed specifically for Atlassian Cloud instances and does not support Atlassian Server or Data Center deployments.
Model Context Protocol (MCP) server for Atlassian products (Confluence and Jira). This integration supports both Confluence & Jira Cloud and Server/Data Center deployments.
Product | Deployment Type | Support Status |
---|---|---|
Confluence | Cloud | ✅ Fully supported |
Confluence | Server/Data Center | ✅ Supported (version 7.9+) |
Jira | Cloud | ✅ Fully supported |
Jira | Server/Data Center | ✅ Supported (version 8.14+) |
First, generate the necessary authentication tokens for Confluence & Jira:
Choose one of these installation methods:
# Using uv (recommended)
brew install uv
uvx mcp-atlassian
# Using pip
pip install mcp-atlassian
# Using Docker
git clone https://github.com/sooperset/mcp-atlassian.git
cd mcp-atlassian
docker build -t mcp/atlassian .
You can configure the MCP server using command line arguments. The server supports using either Confluence, Jira, or both services - include only the arguments needed for your use case.
For Cloud:
uvx mcp-atlassian n --confluence-url https://your-company.atlassian.net/wiki n --confluence-username [email protected] n --confluence-token your_api_token n --jira-url https://your-company.atlassian.net n --jira-username [email protected] n --jira-token your_api_token
For Server/Data Center:
uvx mcp-atlassian n --confluence-url https://confluence.your-company.com n --confluence-personal-token your_token n --jira-url https://jira.your-company.com n --jira-personal-token your_token
Note: You can configure just Confluence, just Jira, or both services. Simply include only the arguments for the service(s) you want to use. For example, to use only Confluence Cloud, you would only need
--confluence-url
,--confluence-username
, and--confluence-token
.
--transport
: Choose transport type (stdio
[default] or sse
)--port
: Port number for SSE transport (default: 8000)--[no-]confluence-ssl-verify
: Toggle SSL verification for Confluence Server/DC--[no-]jira-ssl-verify
: Toggle SSL verification for Jira Server/DC--confluence-spaces-filter
: Comma-separated list of space keys to filter Confluence search results (e.g., "DEV,TEAM,DOC")--jira-projects-filter
: Comma-separated list of project keys to filter Jira search results (e.g., "PROJ,DEV,SUPPORT")--read-only
: Run in read-only mode (disables all write operations)--verbose
: Increase logging verbosity (can be used multiple times, default is WARNING level)-v
or --verbose
: Set logging to INFO level-vv
or --verbose --verbose
: Set logging to DEBUG levelNote: All configuration options can also be set via environment variables. See the
.env.example
file in the repository for the full list of available environment variables.
Using uvx (recommended) - Cloud:
{
"mcpServers": {
"mcp-atlassian": {
"command": "uvx",
"args": [
"mcp-atlassian",
"--confluence-url=https://your-company.atlassian.net/wiki",
"[email protected]",
"--confluence-token=your_api_token",
"--jira-url=https://your-company.atlassian.net",
"[email protected]",
"--jira-token=your_api_token"
]
}
}
}
{
"mcpServers": {
"mcp-atlassian": {
"command": "uvx",
"args": [
"mcp-atlassian",
"--confluence-url=https://confluence.your-company.com",
"--confluence-personal-token=your_token",
"--jira-url=https://jira.your-company.com",
"--jira-personal-token=your_token"
]
}
}
}
{
"mcpServers": {
"mcp-atlassian": {
"command": "python",
"args": [
"-m",
"mcp-atlassian",
"--confluence-url=https://your-company.atlassian.net/wiki",
"[email protected]",
"--confluence-token=your_api_token",
"--jira-url=https://your-company.atlassian.net",
"[email protected]",
"--jira-token=your_api_token"
]
}
}
}
{
"mcpServers": {
"mcp-atlassian": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"mcp/atlassian",
"--confluence-url=https://your-company.atlassian.net/wiki",
"[email protected]",
"--confluence-token=your_api_token",
"--jira-url=https://your-company.atlassian.net",
"[email protected]",
"--jira-token=your_api_token"
]
}
}
}
2. Using an environment file:
{
"mcpServers": {
"mcp-atlassian": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"--env-file",
"/path/to/your/.env",
"mcp/atlassian"
]
}
}
}
Features
> MCP Servers
(or directly to MCP
)+ Add new global MCP server
This will create or edit the ~/.cursor/mcp.json
file with your MCP server configuration.
For Cloud:
{
"mcpServers": {
"mcp-atlassian": {
"command": "uvx",
"args": [
"mcp-atlassian",
"--confluence-url=https://your-company.atlassian.net/wiki",
"[email protected]",
"--confluence-token=your_api_token",
"--jira-url=https://your-company.atlassian.net",
"[email protected]",
"--jira-token=your_api_token"
]
}
}
}
{
"mcpServers": {
"mcp-atlassian": {
"command": "uvx",
"args": [
"mcp-atlassian",
"--confluence-url=https://confluence.your-company.com",
"--confluence-personal-token=your_token",
"--jira-url=https://jira.your-company.com",
"--jira-personal-token=your_token"
]
}
}
}
For SSE transport, first start the server:
uvx mcp-atlassian --transport sse --port 9000
Then configure in Cursor:
{
"mcpServers": {
"mcp-atlassian-sse": {
"url": "http://localhost:9000/sse",
"env": {
"CONFLUENCE_URL": "https://your-company.atlassian.net/wiki",
"CONFLUENCE_USERNAME": "[email protected]",
"CONFLUENCE_API_TOKEN": "your_api_token",
"JIRA_URL": "https://your-company.atlassian.net",
"JIRA_USERNAME": "[email protected]",
"JIRA_API_TOKEN": "your_api_token"
}
}
}
}
Note: The MCP server filters resources to only show Confluence spaces and Jira projects that the user is actively interacting with, based on their contributions and assignments.
confluence://{space_key}
: Access Confluence spacesjira://{project_key}
: Access Jira projectsTool | Description |
---|---|
confluence_search |
Search Confluence content using CQL |
confluence_get_page |
Get content of a specific Confluence page |
confluence_get_page_children |
Get child pages of a specific Confluence page |
confluence_get_page_ancestors |
Get parent pages of a specific Confluence page |
confluence_get_comments |
Get comments for a specific Confluence page |
confluence_create_page |
Create a new Confluence page |
confluence_update_page |
Update an existing Confluence page |
confluence_delete_page |
Delete an existing Confluence page |
jira_get_issue |
Get details of a specific Jira issue |
jira_search |
Search Jira issues using JQL |
jira_get_project_issues |
Get all issues for a specific Jira project |
jira_create_issue |
Create a new issue in Jira |
jira_update_issue |
Update an existing Jira issue |
jira_delete_issue |
Delete an existing Jira issue |
jira_get_transitions |
Get available status transitions for a Jira issue |
jira_transition_issue |
Transition a Jira issue to a new status |
jira_add_worklog |
Add a worklog entry to a Jira issue |
jira_get_worklog |
Get worklog entries for a Jira issue |
jira_link_to_epic |
Link an issue to an Epic |
jira_get_epic_issues |
Get all issues linked to a specific Epic |
If you've cloned the repository and want to run a local version:
For Cloud:
{
"mcpServers": {
"mcp-atlassian": {
"command": "uv",
"args": [
"--directory", "/path/to/your/mcp-atlassian",
"run", "mcp-atlassian",
"--confluence-url=https://your-domain.atlassian.net/wiki",
"[email protected]",
"--confluence-token=your_api_token",
"--jira-url=https://your-domain.atlassian.net",
"[email protected]",
"--jira-token=your_api_token"
]
}
}
}
# Using MCP Inspector
# For installed package
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
tail -n 20 -f ~/Library/Logs/Claude/mcp*.log
Licensed under MIT - see LICENSE file. This is not an official Atlassian product.
[
{
"description": "Search Confluence content using CQL",
"inputSchema": {
"properties": {
"limit": {
"default": 10,
"description": "Maximum number of results (1-50)",
"maximum": 50,
"minimum": 1,
"type": "number"
},
"query": {
"description": "CQL query string (e.g. 'type=page AND space=DEV')",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "confluence_search"
},
{
"description": "Get content of a specific Confluence page by ID",
"inputSchema": {
"properties": {
"include_metadata": {
"default": true,
"description": "Whether to include page metadata",
"type": "boolean"
},
"page_id": {
"description": "Confluence page ID (numeric ID, can be parsed from URL, e.g. from 'https://example.atlassian.net/wiki/spaces/TEAM/pages/123456789/Page+Title' -> '123456789')",
"type": "string"
}
},
"required": [
"page_id"
],
"type": "object"
},
"name": "confluence_get_page"
},
{
"description": "Get comments for a specific Confluence page",
"inputSchema": {
"properties": {
"page_id": {
"description": "Confluence page ID (numeric ID, can be parsed from URL, e.g. from 'https://example.atlassian.net/wiki/spaces/TEAM/pages/123456789/Page+Title' -> '123456789')",
"type": "string"
}
},
"required": [
"page_id"
],
"type": "object"
},
"name": "confluence_get_comments"
},
{
"description": "Create a new Confluence page",
"inputSchema": {
"properties": {
"content": {
"description": "The content of the page in Markdown format",
"type": "string"
},
"parent_id": {
"description": "Optional parent page ID",
"type": "string"
},
"space_key": {
"description": "The key of the space to create the page in",
"type": "string"
},
"title": {
"description": "The title of the page",
"type": "string"
}
},
"required": [
"space_key",
"title",
"content"
],
"type": "object"
},
"name": "confluence_create_page"
},
{
"description": "Update an existing Confluence page",
"inputSchema": {
"properties": {
"content": {
"description": "The new content of the page in Markdown format",
"type": "string"
},
"minor_edit": {
"default": false,
"description": "Whether this is a minor edit",
"type": "boolean"
},
"page_id": {
"description": "The ID of the page to update",
"type": "string"
},
"title": {
"description": "The new title of the page",
"type": "string"
},
"version_comment": {
"default": "",
"description": "Optional comment for this version",
"type": "string"
}
},
"required": [
"page_id",
"title",
"content"
],
"type": "object"
},
"name": "confluence_update_page"
},
{
"description": "Get details of a specific Jira issue including its Epic links and relationship information",
"inputSchema": {
"properties": {
"comment_limit": {
"default": {
"path": "uv.lock",
"type": "blob"
},
"description": "Maximum number of comments to include (0 or null for no comments)",
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"expand": {
"default": {
"path": "uv.lock",
"type": "blob"
},
"description": "Optional fields to expand. Examples: 'renderedFields' (for rendered content), 'transitions' (for available status transitions), 'changelog' (for history)",
"type": "string"
},
"issue_key": {
"description": "Jira issue key (e.g., 'PROJ-123')",
"type": "string"
}
},
"required": [
"issue_key"
],
"type": "object"
},
"name": "jira_get_issue"
},
{
"description": "Search Jira issues using JQL (Jira Query Language)",
"inputSchema": {
"properties": {
"fields": {
"default": "*all",
"description": "Comma-separated fields to return",
"type": "string"
},
"jql": {
"description": "JQL query string. Examples:n- Find Epics: "issuetype = Epic AND project = PROJ"n- Find issues in Epic: "parent = PROJ-123"n- Find by status: "status = 'In Progress' AND project = PROJ"n- Find by assignee: "assignee = currentUser()"n- Find recently updated: "updated >= -7d AND project = PROJ"n- Find by label: "labels = frontend AND project = PROJ"",
"type": "string"
},
"limit": {
"default": 10,
"description": "Maximum number of results (1-50)",
"maximum": 50,
"minimum": 1,
"type": "number"
}
},
"required": [
"jql"
],
"type": "object"
},
"name": "jira_search"
},
{
"description": "Get all issues for a specific Jira project",
"inputSchema": {
"properties": {
"limit": {
"default": 10,
"description": "Maximum number of results (1-50)",
"maximum": 50,
"minimum": 1,
"type": "number"
},
"project_key": {
"description": "The project key",
"type": "string"
}
},
"required": [
"project_key"
],
"type": "object"
},
"name": "jira_get_project_issues"
},
{
"description": "Create a new Jira issue with optional Epic link",
"inputSchema": {
"properties": {
"additional_fields": {
"default": "{}",
"description": "Optional JSON string of additional fields to set. Examples:n- Link to Epic: {"parent": {"key": "PROJ-123"}} - For linking to an Epic after creation, prefer using the jira_link_to_epic tool insteadn- Set priority: {"priority": {"name": "High"}} or {"priority": null} for no priority (common values: High, Medium, Low, None)n- Add labels: {"labels": ["label1", "label2"]}n- Set due date: {"duedate": "2023-12-31"}n- Custom fields: {"customfield_10XXX": "value"}",
"type": "string"
},
"assignee": {
"description": "Assignee of the ticket (accountID, full name or e-mail)",
"type": "string"
},
"description": {
"default": "",
"description": "Issue description",
"type": "string"
},
"issue_type": {
"description": "Issue type (e.g. 'Task', 'Bug', 'Story')",
"type": "string"
},
"project_key": {
"description": "The JIRA project key (e.g. 'PROJ'). Never assume what it might be, always ask the user.",
"type": "string"
},
"summary": {
"description": "Summary/title of the issue",
"type": "string"
}
},
"required": [
"project_key",
"summary",
"issue_type"
],
"type": "object"
},
"name": "jira_create_issue"
},
{
"description": "Update an existing Jira issue including changing status, adding Epic links, updating fields, etc.",
"inputSchema": {
"properties": {
"additional_fields": {
"default": "{}",
"description": "Optional JSON string of additional fields to update",
"type": "string"
},
"fields": {
"description": "A valid JSON object of fields to update. Examples:n- Add to Epic: {"parent": {"key": "PROJ-456"}} - Prefer using the dedicated jira_link_to_epic tool insteadn- Change assignee: {"assignee": "[email protected]"} or {"assignee": null} to unassignn- Update summary: {"summary": "New title"}n- Update description: {"description": "New description"}n- Change status: requires transition IDs - use jira_get_transitions and jira_transition_issue insteadn- Add labels: {"labels": ["label1", "label2"]}n- Set priority: {"priority": {"name": "High"}} or {"priority": null} for no priority (common values: High, Medium, Low, None)n- Update custom fields: {"customfield_10XXX": "value"}",
"type": "string"
},
"issue_key": {
"description": "Jira issue key (e.g., 'PROJ-123')",
"type": "string"
}
},
"required": [
"issue_key",
"fields"
],
"type": "object"
},
"name": "jira_update_issue"
},
{
"description": "Delete an existing Jira issue",
"inputSchema": {
"properties": {
"issue_key": {
"description": "Jira issue key (e.g. PROJ-123)",
"type": "string"
}
},
"required": [
"issue_key"
],
"type": "object"
},
"name": "jira_delete_issue"
},
{
"description": "Add a comment to a Jira issue",
"inputSchema": {
"properties": {
"comment": {
"description": "Comment text in Markdown format",
"type": "string"
},
"issue_key": {
"description": "Jira issue key (e.g., 'PROJ-123')",
"type": "string"
}
},
"required": [
"issue_key",
"comment"
],
"type": "object"
},
"name": "jira_add_comment"
},
{
"description": "Add a worklog entry to a Jira issue",
"inputSchema": {
"properties": {
"comment": {
"description": "Optional comment for the worklog in Markdown format",
"type": "string"
},
"issue_key": {
"description": "Jira issue key (e.g., 'PROJ-123')",
"type": "string"
},
"original_estimate": {
"description": "Optional original estimate in Jira format (e.g., '1h 30m', '1d'). This will update the original estimate for the issue.",
"type": "string"
},
"remaining_estimate": {
"description": "Optional remaining estimate in Jira format (e.g., '1h', '30m'). This will update the remaining estimate for the issue.",
"type": "string"
},
"started": {
"description": "Optional start time in ISO format (e.g. '2023-08-01T12:00:00.000+0000'). If not provided, current time will be used.",
"type": "string"
},
"time_spent": {
"description": "Time spent in Jira format (e.g., '1h 30m', '1d', '30m')",
"type": "string"
}
},
"required": [
"issue_key",
"time_spent"
],
"type": "object"
},
"name": "jira_add_worklog"
},
{
"description": "Get worklog entries for a Jira issue",
"inputSchema": {
"properties": {
"issue_key": {
"description": "Jira issue key (e.g., 'PROJ-123')",
"type": "string"
}
},
"required": [
"issue_key"
],
"type": "object"
},
"name": "jira_get_worklog"
},
{
"description": "Link an existing issue to an epic",
"inputSchema": {
"properties": {
"epic_key": {
"description": "The key of the epic to link to (e.g., 'PROJ-456')",
"type": "string"
},
"issue_key": {
"description": "The key of the issue to link (e.g., 'PROJ-123')",
"type": "string"
}
},
"required": [
"issue_key",
"epic_key"
],
"type": "object"
},
"name": "jira_link_to_epic"
},
{
"description": "Get all issues linked to a specific epic",
"inputSchema": {
"properties": {
"epic_key": {
"description": "The key of the epic (e.g., 'PROJ-123')",
"type": "string"
},
"limit": {
"default": 10,
"description": "Maximum number of issues to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "number"
}
},
"required": [
"epic_key"
],
"type": "object"
},
"name": "jira_get_epic_issues"
},
{
"description": "Get available status transitions for a Jira issue",
"inputSchema": {
"properties": {
"issue_key": {
"description": "Jira issue key (e.g., 'PROJ-123')",
"type": "string"
}
},
"required": [
"issue_key"
],
"type": "object"
},
"name": "jira_get_transitions"
},
{
"description": "Transition a Jira issue to a new status",
"inputSchema": {
"properties": {
"comment": {
"description": "Comment to add during the transition (optional)",
"type": "string"
},
"fields": {
"default": "{}",
"description": "JSON string of fields to update during the transition (optional)",
"type": "string"
},
"issue_key": {
"description": "Jira issue key (e.g., 'PROJ-123')",
"type": "string"
},
"transition_id": {
"description": "ID of the transition to perform (get this from jira_get_transitions)",
"type": "string"
}
},
"required": [
"issue_key",
"transition_id"
],
"type": "object"
},
"name": "jira_transition_issue"
}
]