atlassian-browser-mcp
Use this MCP server to work with Jira and Confluence through browser-cookie SSO authentication, with tools to check sessions and sign in via CLI.
Check Jira/Confluence session readiness and get the exact sign-in command.
Search, read, create, update, assign, transition, link, comment on, and delete Jira issues.
Work with Jira projects, fields, versions, components, users, watchers, worklogs, attachments, and images.
Use Jira Agile tools for boards, sprints, backlog moves, and sprint issues.
Use Jira Service Desk/Service Management tools for desks, queues, request types, requests, and fields.
Access Jira forms, SLA/metrics, issue dates, development info, epic hierarchy, and cross-project dependencies.
Search and read Confluence content, pages, page trees, children, history, diffs, comments, labels, and attachments/images.
Create, update, move, copy, delete, restrict, and comment on Confluence pages.
Manage Confluence labels, attachments, page templates, permissions, and page views where supported.
Use read-only mode to hide write tools, or token auth fallback by disabling browser auth.
Provides browser-based authentication and API access for Atlassian Server/Data Center instances behind corporate SSO, enabling interaction with Atlassian services when API tokens are unavailable.
Enables programmatic access to Confluence instances via browser-cookie authentication, allowing AI agents to interact with Confluence content and features through the full mcp-atlassian toolset.
Provides browser-authenticated access to Jira instances, enabling AI agents to use the complete mcp-atlassian Jira toolset for managing issues, projects, and workflows.
Supports authentication through Okta SSO systems as part of the browser-based login flow for accessing Atlassian services behind corporate authentication.
atlassian-browser-mcp
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_statustells 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-mcpFrom 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 serviceNeeds 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-mcpClaude 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 |
| Whether each service's saved session exists and works: jar age, cookie expiry, a live check, the next step | read-only |
| The exact | read-only |
| Every upstream Jira tool: issues, search, comments, transitions, sprints, boards, versions, links, worklogs, attachments, service desk, forms | 38 read-only, 25 write |
| 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
Available Tools
98 toolsatlassian_auth_statusCheck Jira and Confluence sign-inARead-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 ConfluenceARead-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 CommentADestructive
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 LabelAIdempotent
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 PermissionsARead-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 PageADestructive
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 AttachmentADestructiveIdempotent
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 PageCDestructiveIdempotent
Delete an existing Confluence page.
Inputs: page_id (required). Returns: result
confluence_download_attachmentDownload AttachmentARead-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 AttachmentsARead-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 AttachmentsARead-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 CommentsARead-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 CommentsARead-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 LabelsBRead-onlyIdempotent
Get labels for Confluence content (pages, blog posts, or attachments).
Inputs: page_id (required). Returns: result
confluence_get_pageGet PageARead-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 ChildrenBRead-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 DiffBRead-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 HistoryBRead-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 ImagesARead-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 RestrictionsARead-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 TemplateARead-onlyIdempotent
Get a Cloud page template by ID, including its storage-format body.
Inputs: template_id (required). Returns: result
confluence_get_page_viewsGet Page ViewsARead-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 TreeBRead-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 PermissionsARead-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 TemplatesARead-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 PageBDestructiveIdempotent
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_searchSearch ContentCRead-onlyIdempotent
Search Confluence content using simple terms or CQL.
Inputs: query (required), limit, spaces_filter. Returns: result
confluence_search_userSearch UserARead-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 RestrictionsADestructiveIdempotent
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 PageCDestructive
Update an existing Confluence page.
Inputs: title (required), page_id (required), emoji, content, +9 more. Returns: result
confluence_update_page_sectionUpdate Page SectionADestructive
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 AttachmentADestructive
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 AttachmentsADestructive
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 SprintCDestructiveIdempotent
Add issues to a Jira sprint.
Inputs: sprint_id (required), issue_keys (required). Returns: result
jira_add_watcherAdd Issue WatcherCIdempotent
Add a user as a watcher to a Jira issue.
Inputs: issue_key (required), user_identifier (required). Returns: result
jira_add_worklogAdd WorklogBDestructive
Add a worklog entry to a Jira issue.
Inputs: issue_key (required), time_spent (required), comment, started, +2 more. Returns: result
jira_assign_issueAssign IssueADestructiveIdempotent
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 RequestCDestructive
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_issue_linkCreate Issue LinkC
Create a link between two Jira issues.
Inputs: link_type (required), inward_issue_key (required), outward_issue_key (required), comment, +1 more. Returns: result
jira_create_remote_issue_linkCreate Remote Issue LinkA
Create 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.
Inputs: url (required), title (required), issue_key (required), summary, +2 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 IssueCDestructiveIdempotent
Delete an existing Jira issue.
Inputs: issue_key (required). Returns: result
jira_download_attachmentsDownload AttachmentsARead-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 CommentCDestructive
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 BoardsBRead-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 ProjectsBRead-onlyIdempotent
Get all Jira projects accessible to the current user.
Inputs: include_archived. Returns: result
jira_get_board_issuesGet Board IssuesBRead-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 FieldsARead-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 DependenciesARead-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 OptionsARead-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 IssueARead-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 DatesARead-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 InfoARead-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 ImagesARead-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 FormsARead-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 InfoARead-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 SLAARead-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 WatchersCRead-onlyIdempotent
Get the list of watchers for a Jira issue.
Inputs: issue_key (required). Returns: result
jira_get_link_typesGet Link TypesBRead-onlyIdempotent
Get all available issue link types.
Inputs: name_filter. Returns: result
jira_get_proforma_form_detailsGet Form DetailsARead-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 ComponentsBRead-onlyIdempotent
Get all components for a specific Jira project.
Inputs: project_key (required). Returns: result
jira_get_project_epic_hierarchyGet Project Epic HierarchyARead-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 FieldsARead-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 IssuesCRead-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 TypesARead-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 VersionsBRead-onlyIdempotent
Get all fix versions for a specific Jira project.
Inputs: project_key (required). Returns: result
jira_get_queue_issuesGet Queue IssuesARead-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 FieldsCRead-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 TypesCRead-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 ProjectARead-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 QueuesARead-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 IssuesCRead-onlyIdempotent
Get jira issues from sprint.
Inputs: sprint_id (required), limit, fields, start_at. Returns: result
jira_get_sprints_from_boardGet Sprints from BoardCRead-onlyIdempotent
Get jira sprints from board by state.
Inputs: board_id (required), limit, state, start_at. Returns: result
jira_get_transitionsGet TransitionsCRead-onlyIdempotent
Get available status transitions for a Jira issue.
Inputs: issue_key (required), expand_fields. Returns: result
jira_get_user_profileGet User ProfileARead-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 WorklogCRead-onlyIdempotent
Get worklog entries for a Jira issue.
Inputs: issue_key (required). Returns: result
jira_link_to_epicLink to EpicCDestructiveIdempotent
Link an existing issue to an epic.
Inputs: epic_key (required), issue_key (required). Returns: result
jira_move_issues_to_backlogMove Issues to BacklogBDestructiveIdempotent
Move issues to the backlog, removing them from any sprint.
Inputs: issue_keys (required). Returns: result
jira_remove_issue_linkRemove Issue LinkBDestructiveIdempotent
Remove a link between two Jira issues.
Inputs: link_id (required). Returns: result
jira_remove_watcherRemove Issue WatcherCDestructiveIdempotent
Remove a user from watching a Jira issue.
Inputs: issue_key (required), username, account_id. Returns: result
jira_searchSearch IssuesCRead-onlyIdempotent
Search Jira issues using JQL (Jira Query Language).
Inputs: jql (required), limit, expand, fields, +4 more. Returns: result
jira_search_assignable_usersSearch Assignable UsersARead-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 FieldsBRead-onlyIdempotent
Search Jira fields by keyword with fuzzy match.
Inputs: limit, keyword, refresh. Returns: result
jira_search_projectsSearch ProjectsARead-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 IssueCDestructive
Transition a Jira issue to a new status.
Inputs: issue_key (required), transition_id (required), fields, comment, +1 more. Returns: result
jira_update_issueUpdate IssueBDestructiveIdempotent
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 AnswersADestructiveIdempotent
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:
Get the custom field ID from the form details (question's "jiraField" property)
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 SprintCDestructive
Update jira sprint.
Inputs: sprint_id (required), goal, name, state, +2 more. Returns: result
jira_update_versionUpdate VersionADestructive
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
Scored across 98 tools
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.
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.
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.
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
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Browserless MCP — wraps the Browserless headless-Chromium REST API (browserless.io)
Related MCP Servers
- FlicenseBqualityDmaintenancePlaywright wrapper for MCP that enables LLM-powered clients to control a browser for automation tasks.101-
- AlicenseNot gradedqualityBmaintenanceAn MCP server for Jira 8 that enables SSO-authenticated issue management, work logging, search, and more through natural language, using Playwright for session setup and running as a local subprocess.29 npmMIT
- FlicenseNot gradedqualityDmaintenanceExposes Playwright browser automation as MCP tools, enabling AI assistants to control a real browser tab-by-tab for form filling, navigation, and more, while preserving the user's active session.-
- AlicenseNot gradedqualityCmaintenanceMCP server for Atlassian Cloud (Confluence & Jira) with seamless OAuth 2.0 authentication. Enables AI agents to document work in Confluence, manage Jira issues, and understand project context.54 PyPI4MIT