confluence_add_comment
Add a comment to a Confluence page.
Run Jira and Confluence from one place — issues and sprints, service desk queues, pages, attachments and permissions.
LABSCO SUMMARY
One session can query issues in JQL, move them into a sprint, then write the result into a Confluence page — updating a single section rather than replacing it. The reporting that usually needs a plugin is answered directly: SLA metrics, cross-project dependencies, and the pull requests linked to an issue.
98 tools across both products, for Cloud and for Server and Data Center. Jira covers issues, JQL search, transitions, boards and sprints, worklogs, versions, service desk, ProForma forms, SLA metrics and development links; Confluence covers pages, templates, comments, attachments, restrictions and space permissions.
jira_search, jira_get_issue, jira_create_issue, jira_update_issue, jira_transition_issue)confluence_search, confluence_get_page, confluence_create_page, confluence_update_page)uvx on your PATH — or the ghcr.io/sooperset/mcp-atlassian container — and credentials for each product you use. On Cloud that is JIRA_URL, JIRA_USERNAME and JIRA_API_TOKEN, with the matching CONFLUENCE_* trio; OAuth 2.0 is also supported. On Server and Data Center it is a personal access token in JIRA_PERSONAL_TOKEN or CONFLUENCE_PERSONAL_TOKEN instead, with client-certificate variables available for mTLS. Either product can be configured on its own. Supported deployments are Confluence Cloud and Server v6.0+, and Jira Cloud and Server v8.14+. Two settings worth knowing before an agent touches a real instance: READ_ONLY_MODE disables every write, and ENABLED_TOOLS narrows the surface to a named list. Cloud and Server do not expose the same tools — jira_move_issue and confluence_get_page_views are Cloud only, and the service desk queue tools are Server and Data Center.
One command plus a key — uvx mcp-atlassian, then supply credentials
USE CASES
Query the backlog in JQL, create the sprint, and move the issues into it — then send back whatever does not fit. The whole loop happens in one conversation instead of a board and three filters.
Pull the issue state from Jira and write it into the existing Confluence page, updating one section rather than replacing the whole document. The page keeps its structure and its other authors keep their work.
Read the issue with its enrichments, check the create metadata if fields are missing, then transition and assign it. The metadata call is what stops a create or a transition failing on a required field you did not know about.
Read the issue links that leave the project and the epics grouped under their parents. Cross-project dependencies are exactly what a single board cannot show you.
Read the status-change history and the SLA metrics — cycle time, lead time — off the issues themselves rather than exporting to a spreadsheet or buying a plugin.
Turn on READ_ONLY_MODE, and narrow further with ENABLED_TOOLS when only a few tools are needed. Both settings apply at the server, so the restriction does not depend on the model behaving.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
confluence_add_commentAdd a comment to a Confluence page.
confluence_add_inline_commentAdd an inline comment anchored to a text selection on a page.
confluence_add_labelAdd label to Confluence content (pages, blog posts, or attachments).
Useful for:
confluence_check_content_permissionsCheck whether a user or group can perform an operation on specific content.
Wraps POST /wiki/rest/api/content/{id}/permission/check.
Note: This tool is only available for Confluence Cloud. Server/Data Center instances use different permission APIs.
Returns a JSON object with a 'hasPermission' boolean indicating whether the subject has the requested permission on the content.
confluence_copy_pageCopy a Confluence page to a new location.
On Confluence Cloud the native copy endpoint is used. On Server/Data Center the page body is fetched and a new page is created manually (attachments are not copied in the Server/DC path).
confluence_create_pageCreate a new Confluence page.
confluence_create_page_from_templateCreate a new Cloud page pre-populated with a template's body.
This operation is only available for Confluence Cloud. Fetches the named template and creates a page with its storage-format content. The page can be edited afterwards via confluence_update_page.
confluence_delete_attachmentPermanently delete an attachment from Confluence.
Warning: This action cannot be undone! The attachment and ALL its versions will be permanently deleted.
Use this tool to:
Best practices:
confluence_delete_pageDelete an existing Confluence page.
confluence_download_attachmentDownload an attachment from Confluence as an embedded resource.
Returns the attachment content as a base64-encoded embedded resource so that it is available over the MCP protocol without requiring filesystem access on the server. Files larger than 50 MB are not downloaded inline; a descriptive error message is returned instead.
confluence_download_content_attachmentsDownload all attachments for a Confluence content item as embedded resources.
Returns attachment contents as base64-encoded embedded resources so that they are available over the MCP protocol without requiring filesystem access on the server. Files larger than 50 MB are skipped with an error entry in the summary.
confluence_get_attachmentsList all attachments for a Confluence content item (page or blog post).
Returns metadata about attachments including:
Important: Confluence API returns 'application/octet-stream' as the media type for most binary files (PNG, JPG, PDF) instead of specific types like 'image/png'. For filtering by file type, using the 'filename' parameter is more reliable (e.g., filename='*.png' pattern matching if supported, or exact filename).
Useful for:
Args: ctx: The FastMCP context. content_id: The ID of the content. start: Starting index for pagination. limit: Maximum number of results (1-100). filename: Optional exact filename filter. media_type: Optional MIME type filter (note: most binaries return 'application/octet-stream').
Returns: JSON string with list of attachments and metadata.
confluence_get_commentsGet comments for a specific Confluence page.
confluence_get_inline_commentsGet all inline comments for a Confluence page.
confluence_get_labelsGet labels for Confluence content (pages, blog posts, or attachments).
confluence_get_pageGet content of a specific Confluence page by its ID, or by its title and space key.
confluence_get_page_childrenGet child pages and folders of a specific Confluence page.
confluence_get_page_diffGet a unified diff between two versions of a Confluence page.
confluence_get_page_historyGet a historical version of a specific Confluence page.
confluence_get_page_imagesGet all images attached to a Confluence page as inline image content.
Filters attachments to images only (PNG, JPEG, GIF, WebP, SVG, BMP) and returns them as base64-encoded ImageContent that clients can render directly. Non-image attachments are excluded.
Files with ambiguous MIME types (application/octet-stream) are detected by filename extension as a fallback. Images larger than 50 MB are skipped with an error entry in the summary.
confluence_get_page_restrictionsGet view and edit restrictions for a Confluence page.
Returns the current restriction lists for the read (view) and update (edit) operations. An empty list means the page is unrestricted for that operation.
confluence_get_page_templateGet a Cloud page template by ID, including its storage-format body.
confluence_get_page_viewsGet view statistics for a Confluence page.
Note: This tool is only available for Confluence Cloud. Server/Data Center instances do not support the Analytics API.
confluence_get_space_page_treeGet page hierarchy for a Confluence space as a flat list.
Returns pages with parent_id and depth attributes for token-efficient processing. Filter by depth to focus on relevant sections, or find pages by title. Much more efficient than rendering full ASCII trees.
Use this to understand space organization before creating/moving pages.
confluence_get_space_permissionsList all permission assignments for a Confluence space.
Wraps GET /wiki/api/v2/spaces/{id}/permissions.
Note: This tool is only available for Confluence Cloud. Server/Data Center instances use different permission APIs.
Returns a JSON object with a 'results' list of permission assignment objects. Each entry contains the principal (user or group), the operation permitted, and the target. Use this to audit who has access to a space.
confluence_list_page_templatesList Confluence page content templates.
This operation is only available for Confluence Cloud. Returns template metadata (ID, name, description, type) without the full body. Use confluence_get_page_template to fetch a template's body.
confluence_move_pageMove a Confluence page to a new parent or space.
confluence_reply_to_commentReply to an existing comment thread on a Confluence page.
confluence_searchSearch Confluence content using simple terms or CQL.
confluence_search_userSearch Confluence users using CQL (Cloud) or group member API (Server/DC).
confluence_set_page_restrictionsSet view and edit restrictions on a Confluence page.
Replaces all existing restrictions with the provided lists. Omitting all parameters (or passing empty lists) removes all restrictions.
confluence_update_pageUpdate an existing Confluence page.
confluence_update_page_sectionUpdate a single section of a Confluence page without affecting the rest.
Replaces only the content beneath a named heading, leaving all other sections, macros, layouts, and Confluence-specific elements completely intact. This avoids the data loss that occurs when a full page is downloaded as Markdown, edited, and re-uploaded.
confluence_upload_attachmentUpload an attachment to Confluence content (page or blog post).
Provide the file either as a server-readable path ('file_path') or as base64-encoded content ('content_base64' together with 'filename'). The base64 form is intended for remote or containerized servers that cannot read host file paths. Exactly one of the two must be supplied.
If the attachment already exists (same filename), a new version is created. This is useful for:
confluence_upload_attachmentsUpload multiple attachments to Confluence content in a single operation.
More efficient than calling upload_attachment multiple times. If files with the same names exist, new versions are created automatically.
Useful for:
jira_add_commentAdd a comment to a Jira issue.
jira_add_issues_to_sprintAdd issues to a Jira sprint.
jira_add_watcherAdd a user as a watcher to a Jira issue.
jira_add_worklogAdd a worklog entry to a Jira issue.
jira_assign_issueAssign a Jira issue to a user using the dedicated assignment endpoint.
This is more reliable than setting assignee via update_issue, which is silently ignored by some Jira configurations. Uses PUT /issue/{key}/assignee.
jira_batch_create_issuesCreate multiple Jira issues in a batch.
jira_batch_create_versionsBatch create multiple versions in a Jira project.
jira_batch_get_changelogsGet changelogs for multiple Jira issues (Cloud only).
jira_create_customer_requestCreate a Jira Service Management customer request.
jira_create_issueCreate a new Jira issue with optional Epic link or parent for subtasks.
jira_create_issue_linkCreate a link between two Jira issues.
jira_create_remote_issue_linkCreate a remote issue link (web link or Confluence link) for a Jira issue.
This tool allows you to add web links and Confluence links to Jira issues. The links will appear in the issue's "Links" section and can be clicked to navigate to external resources.
jira_create_sprintCreate Jira sprint for a board.
jira_create_versionCreate a new fix version in a Jira project.
jira_delete_issueDelete an existing Jira issue.
jira_download_attachmentsDownload attachments from a Jira issue.
Returns attachment contents as base64-encoded content so that they are available over the MCP protocol without requiring filesystem access on the server. Image attachments are returned as `EmbeddedResource blobs; all other attachments (documents, archives, etc.) are returned as TextContent carrying a base64 payload, since many MCP clients only forward EmbeddedResource` blobs for recognized image MIME types and otherwise drop the attachment (#1419).
jira_edit_commentEdit an existing comment on a Jira issue.
jira_get_agile_boardsGet jira agile boards by name, project key, or type.
jira_get_all_projectsGet all Jira projects accessible to the current user.
jira_get_board_issuesGet all issues linked to a specific board filtered by JQL.
jira_get_create_fieldsGet fields available for creating an issue of a specific type.
Returns all fields (required and optional) for the given project and issue type, including field names, IDs, whether they're required, and their schema. Use jira_get_field_options when a returned field needs its allowed values.
jira_get_cross_project_dependenciesFind all cross-project issue links for a project.
Scans issues in the project, extracts every issue link whose target belongs to a different project, and groups them by target project and link type. Useful for dependency analysis across multi-project Jira setups.
jira_get_field_optionsGet allowed option values for a custom field.
Returns the list of valid options for select, multi-select, radio, checkbox, and cascading select custom fields.
Cloud: Uses the Field Context Option API. If context_id is not provided, automatically resolves to the global context.
Server/DC: Uses createmeta to get allowedValues. Requires project_key and issue_type parameters.
jira_get_issueGet details of a specific Jira issue.
Includes Epic links and relationship information. Use the `include` parameter to inline enrichments (remote_links, transitions, watchers, changelog, comments, worklogs) so that separate tool calls are not needed.
jira_get_issue_datesGet date information and status transition history for a Jira issue.
Returns dates (created, updated, due date, resolution date) and optionally status change history with time tracking for workflow analysis.
jira_get_issue_development_infoGet development information (PRs, commits, branches) linked to a Jira issue.
This retrieves the development panel information that shows linked pull requests, branches, and commits from connected source control systems like Bitbucket, GitHub, or GitLab.
jira_get_issue_imagesGet all images attached to a Jira issue as inline image content.
Filters attachments to images only (PNG, JPEG, GIF, WebP, SVG, BMP) and returns them as base64-encoded ImageContent that clients can render directly. Non-image attachments are excluded.
Files with ambiguous MIME types (application/octet-stream) are detected by filename extension as a fallback. Images larger than 50 MB are skipped with an error entry in the summary.
jira_get_issue_proforma_formsGet all ProForma forms associated with a Jira issue.
Uses the new Jira Forms REST API. Form IDs are returned as UUIDs.
jira_get_issue_slaCalculate SLA metrics for a Jira issue.
Computes various time-based metrics including cycle time, lead time, time spent in each status, due date compliance, and more.
Working hours can be configured via environment variables:
jira_get_issue_watchersGet the list of watchers for a Jira issue.
jira_get_issues_development_infoGet development information for multiple Jira issues.
Batch retrieves development panel information (PRs, commits, branches) for multiple issues at once.
jira_get_link_typesGet all available issue link types.
jira_get_proforma_form_detailsGet detailed information about a specific ProForma form.
Uses the new Jira Forms REST API. Returns form details including ADF design structure.
jira_get_project_componentsGet all components for a specific Jira project.
jira_get_project_epic_hierarchyGroup a project's epics under their cross-project parent issues.
Fetches all epics in the project, detects their parent issue via the parent field or inward issue links, then groups them by parent. Epics with no detected parent appear under "Unlinked". Useful for understanding how a project's epics roll up to initiatives in another project.
jira_get_project_fieldsGet the fields available on issues of a project (the create schema), deduplicated across the project's issue types — i.e. which fields tickets in this project have, regardless of whether they are filled.
jira_get_project_issue_typesGet available issue types for a Jira project.
Returns the list of issue types (Bug, Task, Story, Epic, etc.) that can be created in the specified project. Use the returned issue type IDs with get_create_fields to discover what fields each type requires.
jira_get_project_issuesGet all issues for a specific Jira project.
jira_get_project_versionsGet all fix versions for a specific Jira project.
jira_get_queue_issuesGet issues from a Jira Service Desk queue.
Server/Data Center only. Not available on Jira Cloud.
jira_get_request_type_fieldsGet field definitions for a Jira Service Management request type.
jira_get_request_typesGet request types for a Jira Service Management service desk.
jira_get_service_desk_for_projectGet the Jira Service Desk associated with a project key.
Server/Data Center only. Not available on Jira Cloud.
jira_get_service_desk_queuesGet queues for a Jira Service Desk.
Server/Data Center only. Not available on Jira Cloud.
jira_get_sprint_issuesGet jira issues from sprint.
jira_get_sprints_from_boardGet jira sprints from board by state.
jira_get_transitionsGet available status transitions for a Jira issue.
jira_get_user_profileRetrieve profile information for a specific Jira user.
jira_get_worklogGet worklog entries for a Jira issue.
jira_link_to_epicLink an existing issue to an epic.
jira_move_issueMove a Jira issue to a different project (Jira Cloud only).
Uses Jira Cloud's bulk move API to perform a cross-project move. The issue keeps its current issue type and may be assigned a new key in the target project (e.g., OLDPROJ-123 becomes NEWPROJ-456).
The move is processed asynchronously on Jira's side; this tool polls until confirmed or times out after 30 seconds.
jira_move_issues_to_backlogMove issues to the backlog, removing them from any sprint.
jira_remove_issue_linkRemove a link between two Jira issues.
jira_remove_watcherRemove a user from watching a Jira issue.
jira_searchSearch Jira issues using JQL (Jira Query Language).
jira_search_assignable_usersSearch Jira users assignable in a given project or issue.
Use this when you have a display name / partial name / email fragment and need a concrete identifier (`name / key for Server/DC, accountId` for Cloud) to feed into assignee, reporter, watcher, etc.
Returns the full result set so the caller can disambiguate when several users match — `get_user_profile` only resolves one identifier and is not designed for human-name search.
Exactly one of `project_key or issue_key must be provided — the underlying API (/user/assignable/search`) requires a project or issue context and works without the global "Browse Users" permission that bot accounts in locked-down DC instances often lack.
Args: ctx: The FastMCP context. query: Display name / username / email substring. project_key: Project key (e.g. 'DT') to scope the search. issue_key: Issue key (e.g. 'DT-779') to scope the search. limit: Maximum number of users to return.
Returns: JSON string: {"success": true, "count": N, "users": [...]} on success, or an error object on failure.
jira_search_fieldsSearch Jira fields by keyword with fuzzy match.
jira_search_projectsSearch for Jira projects by name or key prefix.
Uses the projects picker endpoint to return a ranked list of matching projects without fetching every visible project on the instance.
jira_transition_issueTransition a Jira issue to a new status.
jira_update_issueUpdate an existing Jira issue including changing status, adding Epic links, updating fields, etc.
jira_update_proforma_form_answersUpdate form field answers using the Jira Forms REST API.
This is the primary method for updating form data. Each answer object must specify the question ID, answer type, and value.
⚠️ KNOWN LIMITATION - DATETIME fields: The Jira Forms API does NOT properly preserve time components in DATETIME fields. Only the date portion is stored; times are reset to midnight (00:00:00).
Workaround for DATETIME fields: Use jira_update_issue to directly update the underlying custom fields instead:
Example:
# Instead of updating via form (loses time):
# jira_update_proforma_form_answers(issue_key, form_id, [{"questionId": "91", "type": "DATETIME", "value": "..."}])
# Use direct field update (preserves time):
jira_update_issue(issue_key, {"customfield_10542": "2026-01-09T11:50:00-08:00"})Automatic DateTime Conversion: For DATE and DATETIME fields, you can provide values as:
The tool automatically converts ISO 8601 strings to Unix timestamps.
Example answers: [ {"questionId": "q1", "type": "TEXT", "value": "Updated description"}, {"questionId": "q2", "type": "SELECT", "value": "Product A"}, {"questionId": "q3", "type": "NUMBER", "value": 42}, {"questionId": "q4", "type": "DATE", "value": "2024-12-17"} ]
Common answer types:
Args: ctx: The FastMCP context. issue_key: The issue key containing the form. form_id: The form UUID (get from get_issue_proforma_forms). answers: List of answer objects with questionId, type, and value.
Returns: JSON string with operation result.
jira_update_sprintUpdate jira sprint.
jira_update_versionUpdate an existing fix version in a Jira project.
Only fields explicitly provided are modified; other attributes of the version are left untouched. Useful for archiving/unarchiving versions, renaming, or shifting release dates without recreating them.
BEFORE YOU INSTALL
98 tools when we connected.
CONTEXT COST
Rated by the size of the 98 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
uvx mcp-atlassian{
"mcpServers": {
"mcp-atlassian": {
"command": "uvx",
"args": [
"mcp-atlassian"
],
"env": {
"CONFLUENCE_URL": "https://<YOUR_COMPANY>.atlassian.net/wiki",
"CONFLUENCE_USERNAME": "<YOUR_CONFLUENCE_USERNAME>",
"CONFLUENCE_API_TOKEN": "<YOUR_CONFLUENCE_API_TOKEN>",
"JIRA_URL": "https://<YOUR_COMPANY>.atlassian.net",
"JIRA_USERNAME": "<YOUR_JIRA_USERNAME>",
"JIRA_API_TOKEN": "<YOUR_JIRA_API_TOKEN>"
}
}
}
}{
"mcpServers": {
"mcp-atlassian": {
"command": "uvx",
"args": [
"mcp-atlassian"
],
"env": {
"JIRA_URL": "https://<YOUR_COMPANY>.atlassian.net",
"JIRA_USERNAME": "<YOUR_JIRA_USERNAME>",
"JIRA_API_TOKEN": "<YOUR_JIRA_API_TOKEN>",
"CONFLUENCE_URL": "https://<YOUR_COMPANY>.atlassian.net/wiki",
"CONFLUENCE_USERNAME": "<YOUR_CONFLUENCE_USERNAME>",
"CONFLUENCE_API_TOKEN": "<YOUR_CONFLUENCE_API_TOKEN>"
}
}
}
}autohand mcp add mcp-atlassian env JIRA_URL=https://<YOUR_COMPANY>.atlassian.net JIRA_USERNAME=<YOUR_JIRA_USERNAME> JIRA_API_TOKEN=<YOUR_JIRA_API_TOKEN> CONFLUENCE_URL=https://<YOUR_COMPANY>.atlassian.net/wiki CONFLUENCE_USERNAME=<YOUR_CONFLUENCE_USERNAME> CONFLUENCE_API_TOKEN=<YOUR_CONFLUENCE_API_TOKEN> uvx mcp-atlassian{
"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_CONFLUENCE_USERNAME>",
"CONFLUENCE_API_TOKEN": "<YOUR_CONFLUENCE_API_TOKEN>",
"JIRA_URL": "https://<YOUR_COMPANY>.atlassian.net",
"JIRA_USERNAME": "<YOUR_JIRA_USERNAME>",
"JIRA_API_TOKEN": "<YOUR_JIRA_API_TOKEN>"
}
}
}
}pip install mcp-atlassianuv add mcp-atlassian