Skip to main content
Glama

atlassian-browser-mcp

CI License Python 3.11+ mcp-atlassian GeiserX/atlassian-browser-mcp MCP server

MCP server that wraps the upstream mcp-atlassian toolset with browser-cookie authentication via Playwright, for Atlassian Server/Data Center instances behind corporate SSO (Okta, SAML, etc.) where API tokens are not available. It runs locally over stdio: you log in once with the bundled CLI, and the server reuses the cookies.

Features

  • Every mcp-atlassian Jira and Confluence tool, authenticated with your SSO browser session instead of an API token, with upstream's own network hardening (SSRF redirect checks, DNS pinning, retries, rate limits, proxy and TLS settings) kept in force.

  • One login per service with the CLI; the server itself never opens a browser, so it never hangs waiting for one.

  • atlassian_auth_status tells an agent which service needs a login before it fails mid-task.

  • Optional one-time seeding of the automation profile from your real Chrome profile (ATLASSIAN_SEED_FROM_CHROME_PROFILE), so the first login is often one click.

  • On macOS, reuses a live session from an installed Chromium-family browser (Arc, Brave, Edge, Chrome and others) without opening a window. It reads that browser's Keychain key, says so on stderr, and can be turned off.

  • Separate cookie jars for Jira and Confluence, holding only that host's cookies, mode 0600. Jira-only or Confluence-only setups work.

  • A command-line front-end (atlassian-cli) for scripts and agents: get and search issues and pages.

  • Falls back to token auth with ATLASSIAN_BROWSER_AUTH_ENABLED=false.

Related MCP server: jira-run-mcp

Quick start

From PyPI, with uv installed:

JIRA_URL=https://jira.example.com uvx --from atlassian-browser-mcp atlassian-cli login jira   # once per service, opens your browser
CONFLUENCE_URL=https://confluence.example.com uvx --from atlassian-browser-mcp atlassian-cli login confluence
JIRA_URL=https://jira.example.com CONFLUENCE_URL=https://confluence.example.com uvx atlassian-browser-mcp

From a checkout, with the exact versions in uv.lock:

git clone https://github.com/GeiserX/atlassian-browser-mcp.git && cd atlassian-browser-mcp
UV_PROJECT_ENVIRONMENT=.venv-atlassian-browser uv sync --frozen   # installs the versions in uv.lock
JIRA_URL=https://jira.example.com CONFLUENCE_URL=https://confluence.example.com ./atlassian-cli login jira   # once per service

Needs Python 3.11.5+, uv, Google Chrome and a display for the login. The server never opens a browser window. It reads the saved cookies; when they are missing or expired it returns an AuthRequiredError asking you to run the login again, and on macOS it also looks for a live session in your installed browsers in the background, so a retry a few seconds later may already work. Seeding from Chrome and every setting are in Getting started.

Add it to your client

Every client runs the server over stdio. Set only the URL of a service you use. The examples use the PyPI package through uvx; from a checkout, replace uvx atlassian-browser-mcp with /path/to/atlassian-browser-mcp/run-atlassian-browser-mcp.sh.

Claude Code

claude mcp add --transport stdio atlassian \
  --env JIRA_URL=https://jira.example.com \
  --env CONFLUENCE_URL=https://confluence.example.com \
  -- uvx atlassian-browser-mcp

Claude Desktop (claude_desktop_config.json) and Cursor (~/.cursor/mcp.json or .cursor/mcp.json)

{
  "mcpServers": {
    "atlassian": {
      "command": "uvx",
      "args": ["atlassian-browser-mcp"],
      "env": {
        "JIRA_URL": "https://jira.example.com",
        "CONFLUENCE_URL": "https://confluence.example.com"
      }
    }
  }
}

VS Code (.vscode/mcp.json)

{
  "servers": {
    "atlassian": {
      "type": "stdio",
      "command": "uvx",
      "args": ["atlassian-browser-mcp"],
      "env": {
        "JIRA_URL": "https://jira.example.com",
        "CONFLUENCE_URL": "https://confluence.example.com"
      }
    }
  }
}

Codex (~/.codex/config.toml)

[mcp_servers.atlassian]
command = "uvx"
args = ["atlassian-browser-mcp"]
env = { JIRA_URL = "https://jira.example.com", CONFLUENCE_URL = "https://confluence.example.com" }

Protocol. Speaks MCP 2025-11-25, 2025-06-18, 2025-03-26 and 2024-11-05 over stdio, which covers clients that open with an initialize handshake (Claude Code, Claude Desktop, Cursor and VS Code today). MCP 2026-07-28 is not supported yet: upstream mcp-atlassian pins mcp<2 and fastmcp<4 (https://github.com/sooperset/mcp-atlassian/issues/1541), and this server follows as soon as upstream moves. It runs on stdio only and refuses to start with any other FASTMCP_TRANSPORT.

Read-only mode

Write tools act as you, with your SSO identity. To hide all of them (create, update, delete, transition, upload, restrictions), set READ_ONLY_MODE=true in the server's env. Upstream enforces it when listing and when calling. ENABLED_TOOLS (a comma-separated allow-list of tool names) and TOOLSETS narrow the list further; see Configuration.

File tools (Confluence content_file, attachment uploads) only read files inside MCP_ATLASSIAN_FILES_DIR, by default ~/.atlassian-browser-mcp/files. To upload files from a workspace, set it to that folder. The folder must hold only files you are willing to publish: never this server's checkout or its cookie jars (.atlassian-browser-*).

Tools

Tool

What it does

Hints

atlassian_auth_status

Whether each service's saved session exists and works: jar age, cookie expiry, a live check, the next step

read-only

atlassian_login

The exact atlassian-cli login <service> command to show the user

read-only

jira_* (63)

Every upstream Jira tool: issues, search, comments, transitions, sprints, boards, versions, links, worklogs, attachments, service desk, forms

38 read-only, 25 write

confluence_* (35)

Every upstream Confluence tool: pages, search, comments, labels, attachments, history, templates, restrictions

20 read-only, 15 write

Every tool carries a title and all four annotation hints (read-only, destructive, idempotent, open-world), so clients can auto-approve reads and confirm writes. The full list and the CLI are in Usage.

Documentation

  • Getting started: requirements, install, the first login, seeding from Chrome, the MCP client config

  • Configuration: every environment variable and its default

  • Usage: the MCP tools and the CLI commands

  • How it works: why login and serving are separate processes, and the files

  • Troubleshooting: symptoms, causes, fixes, and what to put in a bug report

License

GPL-3.0-or-later

Available Tools

98 tools
atlassian_auth_statusCheck Jira and Confluence sign-inA
Read-onlyIdempotent

Report whether the saved Jira and Confluence browser sessions exist and work.

Use it before a batch of Atlassian calls, or after a "Not authenticated" error, to learn which service needs a sign-in and the exact command for the user. It never opens a browser, never reads the Keychain and changes nothing in Jira or Confluence. For each service it returns the jar's age, cookie counts, the first cookie expiry, the live-check result and a one-line next step.

Inputs: service, check_live. Returns: Saved-session state of the requested services.

atlassian_loginHow to sign in to Jira or ConfluenceA
Read-onlyIdempotent

Return the terminal command that signs the user in to Jira or Confluence.

(Async on purpose: upstream wraps every tool in an error handler that awaits it, so a plain function fails with "object can't be awaited".)

Sign-in is never done from inside the server (a browser login there used to hang it). Call this after a "Not authenticated" error and show the user the command; they run it in a terminal where a browser can open, then you retry. The server reuses the saved session automatically.

Inputs: target. Returns: How to sign in to one service.

confluence_add_commentAdd CommentC

Add a comment to a Confluence page.

Inputs: body (required), page_id (required). Returns: result

confluence_add_inline_commentAdd Inline CommentA
Destructive

Add an inline comment anchored to a text selection on a page.

Inputs: body (required), page_id (required), text_selection (required), text_selection_match_count, +1 more. Returns: result

confluence_add_labelAdd LabelA
Idempotent

Add label to Confluence content (pages, blog posts, or attachments).

Useful for:

  • Categorizing attachments (e.g., 'screenshot', 'diagram', 'legal-doc')

  • Tracking status (e.g., 'approved', 'needs-review', 'archived')

  • Filtering content by topic or version

Inputs: name (required), page_id (required). Returns: result

confluence_check_content_permissionsCheck Content PermissionsA
Read-onlyIdempotent

Check 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.

Inputs: operation (required), content_id (required), user_identifier (required), subject_type. Returns: result

confluence_copy_pageCopy PageA
Destructive

Copy 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).

Inputs: new_title (required), source_page_id (required), destination_space_key (required), copy_attachments, +1 more. Returns: result

confluence_create_pageCreate PageC

Create a new Confluence page.

Inputs: title (required), space_key (required), emoji, content, +8 more. Returns: result

confluence_create_page_from_templateCreate Page from TemplateA

Create 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.

Inputs: title (required), space_key (required), template_id (required), parent_id. Returns: result

confluence_delete_attachmentDelete AttachmentA
DestructiveIdempotent

Permanently 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:

  • Remove outdated or incorrect attachments

  • Clean up duplicate files

  • Delete sensitive information that was accidentally uploaded

Best practices:

  • Verify the attachment ID before deletion using get_attachments

  • Consider downloading the attachment first as a backup

  • Check with content owners before deleting shared attachments

Inputs: attachment_id (required). Returns: result

confluence_delete_pageDelete PageC
DestructiveIdempotent

Delete an existing Confluence page.

Inputs: page_id (required). Returns: result

confluence_download_attachmentDownload AttachmentA
Read-onlyIdempotent

Download 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.

Inputs: attachment_id (required).

confluence_download_content_attachmentsDownload All Content AttachmentsA
Read-onlyIdempotent

Download 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.

Inputs: content_id (required).

confluence_get_attachmentsGet Content AttachmentsA
Read-onlyIdempotent

List all attachments for a Confluence content item (page or blog post).

Returns metadata about attachments including:

  • Attachment ID, title, and file type

  • File size and download URL

  • Creation/modification dates

  • Version information

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:

  • Discovering what files are attached to a page

  • Getting attachment IDs for download operations

  • Checking if a specific file exists

  • Listing images/documents for processing

Inputs: content_id (required), limit, start, filename, +1 more. Returns: result

confluence_get_commentsGet CommentsA
Read-onlyIdempotent

Get comments for a specific Confluence page.

Replies include their parent comment ID when available. Inline comments also include anchor selection, marker reference, and resolution status metadata.

Inputs: page_id (required). Returns: result

confluence_get_inline_commentsGet Inline CommentsA
Read-onlyIdempotent

Get all inline comments for a Confluence page.

Results include parent comment IDs plus anchor selection, marker reference, and resolution status metadata when Confluence provides those fields.

Inputs: page_id (required). Returns: result

confluence_get_labelsGet LabelsB
Read-onlyIdempotent

Get labels for Confluence content (pages, blog posts, or attachments).

Inputs: page_id (required). Returns: result

confluence_get_pageGet PageA
Read-onlyIdempotent

Get content of a specific Confluence page by its ID, or by its title and space key.

Inputs: title, page_id, space_key, include_metadata, +1 more. Returns: result

confluence_get_page_childrenGet Page ChildrenB
Read-onlyIdempotent

Get child pages and folders of a specific Confluence page.

Inputs: parent_id (required), limit, start, expand, +3 more. Returns: result

confluence_get_page_diffGet Page Version DiffB
Read-onlyIdempotent

Get a unified diff between two versions of a Confluence page.

Inputs: page_id (required), to_version (required), from_version (required). Returns: result

confluence_get_page_historyGet Page HistoryB
Read-onlyIdempotent

Get a historical version of a specific Confluence page.

Inputs: page_id (required), version (required), convert_to_markdown. Returns: result

confluence_get_page_imagesGet Page ImagesA
Read-onlyIdempotent

Get 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.

Inputs: content_id (required).

confluence_get_page_restrictionsGet Page RestrictionsA
Read-onlyIdempotent

Get 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.

Inputs: page_id (required). Returns: result

confluence_get_page_templateGet Page TemplateA
Read-onlyIdempotent

Get a Cloud page template by ID, including its storage-format body.

Inputs: template_id (required). Returns: result

confluence_get_page_viewsGet Page ViewsA
Read-onlyIdempotent

Get 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.

Inputs: page_id (required), include_title. Returns: result

confluence_get_space_page_treeGet Space Page TreeB
Read-onlyIdempotent

Get 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.

Inputs: space_key (required), limit. Returns: result

confluence_get_space_permissionsGet Space PermissionsA
Read-onlyIdempotent

List 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.

Inputs: space_id (required), limit, cursor. Returns: result

confluence_list_page_templatesList Page TemplatesA
Read-onlyIdempotent

List 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.

Inputs: limit, space_key. Returns: result

confluence_move_pageMove PageB
DestructiveIdempotent

Move a Confluence page to a new parent or space.

Inputs: page_id (required), position, target_parent_id, target_space_key. Returns: result

confluence_reply_to_commentReply to CommentB

Reply to an existing comment thread on a Confluence page.

Inputs: body (required), comment_id (required). Returns: result

confluence_search_userSearch UserA
Read-onlyIdempotent

Search Confluence users using CQL (Cloud) or group member API (Server/DC).

Inputs: query (required), limit, group_name. Returns: result

confluence_set_page_restrictionsSet Page RestrictionsA
DestructiveIdempotent

Set 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.

Inputs: page_id (required), edit_users, read_users, edit_groups, +1 more. Returns: result

confluence_update_pageUpdate PageC
Destructive

Update an existing Confluence page.

Inputs: title (required), page_id (required), emoji, content, +9 more. Returns: result

confluence_update_page_sectionUpdate Page SectionA
Destructive

Update 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. A following excerpt, expand, or layout that contains a heading of the same or higher level ends the section — that wrapper is not replaced. This avoids the data loss that occurs when a full page is downloaded as Markdown, edited, and re-uploaded.

Inputs: page_id (required), new_content (required), heading_text (required), is_minor_edit, +2 more. Returns: result

confluence_upload_attachmentUpload AttachmentA
Destructive

Upload 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:

  • Attaching documents, images, or files to a page

  • Updating existing attachments with new versions

  • Adding supporting materials to documentation

Inputs: content_id (required), comment, filename, file_path, +2 more. Returns: result

confluence_upload_attachmentsUpload Multiple AttachmentsA
Destructive

Upload 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:

  • Bulk uploading documentation assets (diagrams, screenshots, etc.)

  • Adding multiple related files to a page at once

  • Batch updating existing attachments with new versions

Inputs: content_id (required), file_paths (required), comment, minor_edit. Returns: result

jira_add_commentAdd CommentC

Add a comment to a Jira issue.

Inputs: body (required), issue_key (required), public, visibility. Returns: result

jira_add_issues_to_sprintAdd Issues to SprintC
DestructiveIdempotent

Add issues to a Jira sprint.

Inputs: sprint_id (required), issue_keys (required). Returns: result

jira_add_watcherAdd Issue WatcherC
Idempotent

Add a user as a watcher to a Jira issue.

Inputs: issue_key (required), user_identifier (required). Returns: result

jira_add_worklogAdd WorklogB
Destructive

Add a worklog entry to a Jira issue.

Inputs: issue_key (required), time_spent (required), comment, started, +2 more. Returns: result

jira_assign_issueAssign IssueA
DestructiveIdempotent

Assign 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.

On Jira Server/DC the following identifier forms are all accepted: login name, email address, display name, or JIRAUSER key. The resolution order is: key lookup → email search (with email-as-username fallback) → text search → assignable-user search scoped to the issue.

Inputs: issue_key (required), assignee. Returns: result

jira_batch_create_issuesBatch Create IssuesC

Create multiple Jira issues in a batch.

Inputs: issues (required), validate_only. Returns: result

jira_batch_create_versionsBatch Create VersionsC

Batch create multiple versions in a Jira project.

Inputs: versions (required), project_key (required). Returns: result

jira_create_customer_requestCreate Customer RequestC
Destructive

Create a Jira Service Management customer request.

Inputs: request_type_id (required), service_desk_id (required), request_field_values (required), attachments, +3 more. Returns: result

jira_create_issueCreate IssueB

Create a new Jira issue with optional Epic link or parent for subtasks.

Inputs: summary (required), issue_type (required), project_key (required), assignee, +3 more. Returns: result

jira_create_sprintCreate SprintC

Create Jira sprint for a board.

Inputs: name (required), board_id (required), end_date (required), start_date (required), +1 more. Returns: result

jira_create_versionCreate VersionC

Create a new fix version in a Jira project.

Inputs: name (required), project_key (required), start_date, description, +1 more. Returns: result

jira_delete_issueDelete IssueC
DestructiveIdempotent

Delete an existing Jira issue.

Inputs: issue_key (required). Returns: result

jira_download_attachmentsDownload AttachmentsA
Read-onlyIdempotent

Download 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).

Inputs: issue_key (required).

jira_edit_commentEdit CommentC
Destructive

Edit an existing comment on a Jira issue.

Inputs: body (required), issue_key (required), comment_id (required), visibility. Returns: result

jira_get_agile_boardsGet Agile BoardsB
Read-onlyIdempotent

Get jira agile boards by name, project key, or type.

Inputs: limit, start_at, board_name, board_type, +1 more. Returns: result

jira_get_all_projectsGet All ProjectsB
Read-onlyIdempotent

Get all Jira projects accessible to the current user.

Inputs: include_archived. Returns: result

jira_get_board_issuesGet Board IssuesB
Read-onlyIdempotent

Get all issues linked to a specific board filtered by JQL.

Inputs: jql (required), board_id (required), limit, expand, +2 more. Returns: result

jira_get_create_fieldsGet Create FieldsA
Read-onlyIdempotent

Get 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.

Inputs: project_key (required), issue_type_id (required). Returns: result

jira_get_cross_project_dependenciesGet Cross-Project DependenciesA
Read-onlyIdempotent

Find 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.

Inputs: project_key (required), max_issues. Returns: result

jira_get_field_optionsGet Field OptionsA
Read-onlyIdempotent

Get 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.

Inputs: field_id (required), contains, context_id, issue_type, +3 more. Returns: result

jira_get_issueGet IssueA
Read-onlyIdempotent

Get 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, epic_summary) so that separate tool calls are not needed. The epic_summary section only applies when the issue is an Epic and adds child-issue aggregations (counts by status, assignee, and type, plus a completion percentage); it is aggregate-only unless epic_summary_children is set.

Inputs: issue_key (required), expand, fields, include, +6 more. Returns: result

jira_get_issue_datesGet Issue DatesA
Read-onlyIdempotent

Get 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.

Inputs: issue_key (required), include_status_changes, include_status_summary. Returns: result

jira_get_issue_development_infoGet Issue Development InfoA
Read-onlyIdempotent

Get 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.

Inputs: issue_key (required), data_type, application_type. Returns: result

jira_get_issue_imagesGet Issue ImagesA
Read-onlyIdempotent

Get 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.

Inputs: issue_key (required).

jira_get_issue_proforma_formsGet Issue FormsA
Read-onlyIdempotent

Get all ProForma forms associated with a Jira issue.

Uses the new Jira Forms REST API. Form IDs are returned as UUIDs.

Inputs: issue_key (required). Returns: result

jira_get_issues_development_infoGet Issues Development InfoA
Read-onlyIdempotent

Get development information for multiple Jira issues.

Batch retrieves development panel information (PRs, commits, branches) for multiple issues at once.

Inputs: issue_keys (required), data_type, application_type. Returns: result

jira_get_issue_slaGet Issue SLAA
Read-onlyIdempotent

Calculate 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_SLA_WORKING_HOURS_ONLY: Enable working hours filtering (true/false)

  • JIRA_SLA_WORKING_HOURS_START: Start time (e.g., "09:00")

  • JIRA_SLA_WORKING_HOURS_END: End time (e.g., "17:00")

  • JIRA_SLA_WORKING_DAYS: Working days (e.g., "1,2,3,4,5" for Mon-Fri)

  • JIRA_SLA_TIMEZONE: Timezone for calculations (e.g., "America/New_York")

Inputs: issue_key (required), metrics, include_raw_dates, working_hours_only. Returns: result

jira_get_issue_watchersGet Issue WatchersC
Read-onlyIdempotent

Get the list of watchers for a Jira issue.

Inputs: issue_key (required). Returns: result

jira_get_proforma_form_detailsGet Form DetailsA
Read-onlyIdempotent

Get detailed information about a specific ProForma form.

Uses the new Jira Forms REST API. Returns form details including ADF design structure.

Inputs: form_id (required), issue_key (required). Returns: result

jira_get_project_componentsGet Project ComponentsB
Read-onlyIdempotent

Get all components for a specific Jira project.

Inputs: project_key (required). Returns: result

jira_get_project_epic_hierarchyGet Project Epic HierarchyA
Read-onlyIdempotent

Group 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.

Inputs: project_key (required), max_epics. Returns: result

jira_get_project_fieldsGet Project FieldsA
Read-onlyIdempotent

Get 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.

Inputs: project_key (required). Returns: result

jira_get_project_issuesGet Project IssuesC
Read-onlyIdempotent

Get all issues for a specific Jira project.

Inputs: project_key (required), limit, start_at. Returns: result

jira_get_project_issue_typesGet Project Issue TypesA
Read-onlyIdempotent

Get 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.

Inputs: project_key (required). Returns: result

jira_get_project_versionsGet Project VersionsB
Read-onlyIdempotent

Get all fix versions for a specific Jira project.

Inputs: project_key (required). Returns: result

jira_get_queue_issuesGet Queue IssuesA
Read-onlyIdempotent

Get issues from a Jira Service Desk queue.

Server/Data Center only. Not available on Jira Cloud.

Inputs: queue_id (required), service_desk_id (required), limit, start_at. Returns: result

jira_get_request_type_fieldsGet Request Type FieldsC
Read-onlyIdempotent

Get field definitions for a Jira Service Management request type.

Inputs: request_type_id (required), service_desk_id (required). Returns: result

jira_get_request_typesGet Request TypesC
Read-onlyIdempotent

Get request types for a Jira Service Management service desk.

Inputs: service_desk_id (required), limit, start_at. Returns: result

jira_get_service_desk_for_projectGet Service Desk For ProjectA
Read-onlyIdempotent

Get the Jira Service Desk associated with a project key.

Server/Data Center only. Not available on Jira Cloud.

Inputs: project_key (required). Returns: result

jira_get_service_desk_queuesGet Service Desk QueuesA
Read-onlyIdempotent

Get queues for a Jira Service Desk.

Server/Data Center only. Not available on Jira Cloud.

Inputs: service_desk_id (required), limit, start_at. Returns: result

jira_get_sprint_issuesGet Sprint IssuesC
Read-onlyIdempotent

Get jira issues from sprint.

Inputs: sprint_id (required), limit, fields, start_at. Returns: result

jira_get_sprints_from_boardGet Sprints from BoardC
Read-onlyIdempotent

Get jira sprints from board by state.

Inputs: board_id (required), limit, state, start_at. Returns: result

jira_get_transitionsGet TransitionsC
Read-onlyIdempotent

Get available status transitions for a Jira issue.

Inputs: issue_key (required), expand_fields. Returns: result

jira_get_user_profileGet User ProfileA
Read-onlyIdempotent

Retrieve profile information for a Jira user.

Use user_identifier="me" to return the account authenticated for the current request directly from Jira's /myself endpoint. This path does not require Browse Users permission.

Inputs: user_identifier (required), expand. Returns: result

jira_get_worklogGet WorklogC
Read-onlyIdempotent

Get worklog entries for a Jira issue.

Inputs: issue_key (required). Returns: result

jira_move_issues_to_backlogMove Issues to BacklogB
DestructiveIdempotent

Move issues to the backlog, removing them from any sprint.

Inputs: issue_keys (required). Returns: result

jira_remove_watcherRemove Issue WatcherC
DestructiveIdempotent

Remove a user from watching a Jira issue.

Inputs: issue_key (required), username, account_id. Returns: result

jira_search_assignable_usersSearch Assignable UsersA
Read-onlyIdempotent

Search 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.

Inputs: query (required), limit, issue_key, project_key. Returns: result

jira_search_fieldsSearch FieldsB
Read-onlyIdempotent

Search Jira fields by keyword with fuzzy match.

Inputs: limit, keyword, refresh. Returns: result

jira_search_projectsSearch ProjectsA
Read-onlyIdempotent

Search 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.

Inputs: query (required), max_results, current_project_ids. Returns: result

jira_transition_issueTransition IssueC
Destructive

Transition a Jira issue to a new status.

Inputs: issue_key (required), transition_id (required), fields, comment, +1 more. Returns: result

jira_update_issueUpdate IssueB
DestructiveIdempotent

Update an issue and optionally transition, comment, and log work.

Inputs: issue_key (required), fields, comment, worklog, +8 more. Returns: result

jira_update_proforma_form_answersUpdate Form AnswersA
DestructiveIdempotent

Update 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:

  1. Get the custom field ID from the form details (question's "jiraField" property)

  2. Use jira_update_issue with fields like: {"customfield_XXXXX": "2026-01-09T11:50:00-08:00"}

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:

  • ISO 8601 strings (e.g., "2024-12-17T19:00:00Z", "2024-12-17")

  • Unix timestamps in milliseconds (e.g., 1734465600000)

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:

  • TEXT: String values

  • NUMBER: Numeric values

  • DATE: Date values (ISO 8601 string or Unix timestamp in ms)

  • DATETIME: DateTime values - ⚠️ USE WORKAROUND ABOVE

  • SELECT: Single selection from options

  • MULTI_SELECT: Multiple selections (value as list)

  • CHECKBOX: Boolean values

Inputs: answers (required), form_id (required), issue_key (required). Returns: result

jira_update_sprintUpdate SprintC
Destructive

Update jira sprint.

Inputs: sprint_id (required), goal, name, state, +2 more. Returns: result

jira_update_versionUpdate VersionA
Destructive

Update 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.

Inputs: version_id (required), name, archived, released, +3 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 98 tools

    Disambiguation3/5

    Most tools have distinct resource+action names, but there is substantial overlap between convenience tools and dedicated tools: jira_update_issue can transition/comment/log work, while separate transition/comment/worklog tools exist; jira_get_issue can inline comments/worklogs/watchers. The many attachment and comment getters (download vs list vs images, comments vs inline comments) are distinguishable only after reading descriptions, and the 98-tool surface makes misselection likely.

    Naming Consistency4/5

    The set is overwhelmingly snake_case with clear service/resource/action prefixes such as jira_get_issue, confluence_update_page, and atlassian_login. Minor inconsistencies appear in singular/plural and batch/single variants (e.g. jira_get_issue_development_info vs jira_get_issues_development_info, download_attachment vs download_attachments), but the pattern remains readable.

    Tool Count1/5

    98 tools is far beyond a well-scoped set and creates an overwhelming surface for an agent. While Jira+Confluence is broad, the count is inflated by single/batch pairs, platform-specific variants, and overlapping convenience operations.

    Completeness4/5

    Coverage is broad across Jira issues, projects, sprints, boards, service desk, forms, versions, links, attachments, watchers, worklogs, and Confluence pages, comments, attachments, labels, templates, restrictions, history, and permissions. Some lifecycle gaps remain, such as delete operations for comments, worklogs, sprints, or versions, and blog-post management is thin, but most core workflows are supported.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers