MCP server that wraps the upstream mcp-atlassian toolset with browser-cookie authentication. By default it reuses cookies from an existing Firefox profile, so you can sign in through your normal browser and avoid API tokens. A Playwright-based manual login mode is still available when explicitly enabled.
- Sign in to Jira and Confluence in Firefox using your normal SSO/MFA flow
- On startup, the server loads matching Firefox cookies with
browser-cookie3 - All MCP tool calls use those cookies via a custom
requests.Sessionsubclass - If an API response looks like an SSO redirect, the session reloads Firefox cookies and retries once
The server monkey-patches JiraClient and ConfluenceClient constructors in mcp-atlassian to inject the browser-backed session, giving full parity with the upstream tool surface (73 Atlassian tools + 1 atlassian_login helper = 74 total).
| File | Purpose |
|---|---|
atlassian_browser_mcp_full.py |
Entrypoint. Patches upstream clients, registers atlassian_login tool, runs the MCP server |
atlassian_browser_auth.py |
Shared auth: BrowserCookieSession, cookie providers, SSO detection |
run-atlassian-browser-mcp.sh |
Launcher: creates venv, installs deps via uv, runs compatibility check, starts server |
pyproject.toml |
Dependency pins |
First, open Firefox and sign in to Jira and Confluence. Then run:
export JIRA_URL="https://jira.example.com"
export CONFLUENCE_URL="https://confluence.example.com"
./run-atlassian-browser-mcp.shOr configure as an MCP server in your editor (Cursor, Claude Code, etc.) pointing to the launcher script.
This server exposes Atlassian actions as MCP tools, not MCP resources. If your client reports resources/list failed or resources/templates/list failed, call the Jira/Confluence tools directly instead of resource discovery.
Tool names below are the exposed MCP names in Codex. The wrapper prefixes Jira tools with jira_ and Confluence tools with confluence_.
Jira tools
| Tool | Used for |
|---|---|
jira_get_user_profile |
Retrieve profile information for a specific Jira user. |
jira_get_issue_watchers |
Get the list of watchers for a Jira issue. |
jira_add_watcher |
Add a user as a watcher to a Jira issue. |
jira_remove_watcher |
Remove a user from watching a Jira issue. |
jira_get_issue |
Get details of a specific Jira issue including its Epic links and relationship information. |
jira_search |
Search Jira issues using JQL (Jira Query Language). |
jira_search_fields |
Search Jira fields by keyword with fuzzy match. |
jira_get_field_options |
Get allowed option values for a custom field. |
jira_get_project_issues |
Get all issues for a specific Jira project. |
jira_get_transitions |
Get available status transitions for a Jira issue. |
jira_get_worklog |
Get worklog entries for a Jira issue. |
jira_download_attachments |
Download attachments from a Jira issue. |
jira_get_issue_images |
Get all images attached to a Jira issue as inline image content. |
jira_get_agile_boards |
Get Jira agile boards by name, project key, or type. |
jira_get_board_issues |
Get all issues linked to a specific board filtered by JQL. |
jira_get_sprints_from_board |
Get Jira sprints from board by state. |
jira_get_sprint_issues |
Get Jira issues from sprint. |
jira_get_link_types |
Get all available issue link types. |
jira_create_issue |
Create a new Jira issue with optional Epic link or parent for subtasks. |
jira_batch_create_issues |
Create multiple Jira issues in a batch. |
jira_batch_get_changelogs |
Get changelogs for multiple Jira issues (Cloud only). |
jira_update_issue |
Update an existing Jira issue including changing status, adding Epic links, updating fields, etc. |
jira_delete_issue |
Delete an existing Jira issue. |
jira_add_comment |
Add a comment to a Jira issue. |
jira_edit_comment |
Edit an existing comment on a Jira issue. |
jira_add_worklog |
Add a worklog entry to a Jira issue. |
jira_link_to_epic |
Link an existing issue to an epic. |
jira_create_issue_link |
Create a link between two Jira issues. |
jira_create_remote_issue_link |
Create a remote issue link (web link or Confluence link) for a Jira issue. |
jira_remove_issue_link |
Remove a link between two Jira issues. |
jira_transition_issue |
Transition a Jira issue to a new status. |
jira_create_sprint |
Create Jira sprint for a board. |
jira_update_sprint |
Update Jira sprint. |
jira_add_issues_to_sprint |
Add issues to a Jira sprint. |
jira_get_project_versions |
Get all fix versions for a specific Jira project. |
jira_get_project_components |
Get all components for a specific Jira project. |
jira_get_all_projects |
Get all Jira projects accessible to the current user. |
jira_get_service_desk_for_project |
Get the Jira Service Desk associated with a project key. |
jira_get_service_desk_queues |
Get queues for a Jira Service Desk. |
jira_get_queue_issues |
Get issues from a Jira Service Desk queue. |
jira_create_version |
Create a new fix version in a Jira project. |
jira_batch_create_versions |
Batch create multiple versions in a Jira project. |
jira_get_issue_proforma_forms |
Get all ProForma forms associated with a Jira issue. |
jira_get_proforma_form_details |
Get detailed information about a specific ProForma form. |
jira_update_proforma_form_answers |
Update form field answers using the Jira Forms REST API. |
jira_get_issue_dates |
Get date information and status transition history for a Jira issue. |
jira_get_issue_sla |
Calculate SLA metrics for a Jira issue. |
jira_get_issue_development_info |
Get development information (PRs, commits, branches) linked to a Jira issue. |
jira_get_issues_development_info |
Get development information for multiple Jira issues. |
Confluence tools
| Tool | Used for |
|---|---|
confluence_search |
Search Confluence content using simple terms or CQL. |
confluence_get_page |
Get content of a specific Confluence page by its ID, or by its title and space key. |
confluence_get_page_children |
Get child pages and folders of a specific Confluence page. |
confluence_get_space_page_tree |
Get page hierarchy for a Confluence space as a flat list. |
confluence_get_comments |
Get comments for a specific Confluence page. |
confluence_get_labels |
Get labels for Confluence content (pages, blog posts, or attachments). |
confluence_add_label |
Add label to Confluence content (pages, blog posts, or attachments). |
confluence_create_page |
Create a new Confluence page. |
confluence_update_page |
Update an existing Confluence page. |
confluence_delete_page |
Delete an existing Confluence page. |
confluence_move_page |
Move a Confluence page to a new parent or space. |
confluence_add_comment |
Add a comment to a Confluence page. |
confluence_reply_to_comment |
Reply to an existing comment thread on a Confluence page. |
confluence_search_user |
Search Confluence users using CQL (Cloud) or group member API (Server/DC). |
confluence_get_page_history |
Get a historical version of a specific Confluence page. |
confluence_get_page_diff |
Get a unified diff between two versions of a Confluence page. |
confluence_get_page_views |
Get view statistics for a Confluence page. |
confluence_upload_attachment |
Upload an attachment to Confluence content (page or blog post). |
confluence_upload_attachments |
Upload multiple attachments to Confluence content in a single operation. |
confluence_get_attachments |
List all attachments for a Confluence content item (page or blog post). |
confluence_download_attachment |
Download an attachment from Confluence as an embedded resource. |
confluence_download_content_attachments |
Download all attachments for a Confluence content item as embedded resources. |
confluence_delete_attachment |
Permanently delete an attachment from Confluence. |
confluence_get_page_images |
Get all images attached to a Confluence page as inline image content. |
Helper
| Tool | Used for |
|---|---|
atlassian_login |
Refresh browser-backed Atlassian authentication. |
If you use this server from Codex, reduce token usage by redacting the MCP tool list in Codex itself. Codex supports per-server tool allowlists and denylists in ~/.codex/config.toml via enabled_tools and disabled_tools; see the official Codex MCP docs and config reference.
For the lowest token usage, prefer enabled_tools. That prevents all non-listed tool schemas from being exposed to Codex for this MCP server.
Example: keep only basic Jira lookup tools available in Codex:
[mcp_servers.atlassian_browser]
command = "/Users/you/Projects/atlassian-browser-mcp/run-atlassian-browser-mcp.sh"
cwd = "/Users/you/Projects/atlassian-browser-mcp"
startup_timeout_sec = 30
tool_timeout_sec = 120
enabled_tools = [
"jira_search",
"jira_get_issue",
"jira_download_attachments",
"jira_get_issue_images"
]
[mcp_servers.atlassian_browser.env]
JIRA_URL = "https://jira.example.com"
CONFLUENCE_URL = "https://confluence.example.com"If you want to block only a few tools and keep the rest, use disabled_tools instead:
[mcp_servers.atlassian_browser]
command = "/Users/you/Projects/atlassian-browser-mcp/run-atlassian-browser-mcp.sh"
cwd = "/Users/you/Projects/atlassian-browser-mcp"
disabled_tools = [
"confluence_search",
"confluence_get_page",
]Notes:
enabled_toolsis better thandisabled_toolswhen your goal is token reduction.- Redaction is client-side in Codex. Other MCP clients still see the full tool surface unless they apply their own filtering.
- Restart Codex after changing
~/.codex/config.toml. - Add
atlassian_logintoenabled_toolsonly if you need the manual login helper exposed.
For even lower main-session token usage, keep Atlassian MCP tools out of the main Codex session and expose them only to a focused Jira summarizer subagent. Codex custom agents can live in ~/.codex/agents/ for personal use or .codex/agents/ for project-scoped use. Codex only spawns subagents when you explicitly ask it to.
Use gpt-5.4-mini with model_reasoning_effort = "medium" by default. Jira summarization is mostly retrieval, filtering, and compression. Use gpt-5.4 with model_reasoning_effort = "high" only when the Jira work is complex, spans multiple tickets, or needs careful risk synthesis. See the official Codex subagents docs, Codex MCP docs, Codex config reference, and model list.
Create ~/.codex/agents/jira-summarizer.toml:
name = "jira_summarizer"
description = "Reads Jira issues through atlassian-browser-mcp and returns compact summaries for the parent agent."
model = "gpt-5.4-mini"
model_reasoning_effort = "medium"
sandbox_mode = "read-only"
developer_instructions = """
Use Jira tools only to gather issue context.
Summarize for the parent agent, not for an end user.
When reading a specific issue, include comments because they often contain decisions, clarifications, and current blockers.
Check for attachments and download them when filenames, metadata, or the parent request suggest they may contain useful requirements, screenshots, logs, or reproduction details.
Prefer compact output: status, assignee, priority, key dates, requirements, blockers, comments, attachment findings, and engineering implications.
Do not make code changes.
Do not fetch unrelated issues unless the parent agent asks for linked or related work.
"""
[mcp_servers.atlassian_browser]
command = "/Users/you/Projects/atlassian-browser-mcp/run-atlassian-browser-mcp.sh"
cwd = "/Users/you/Projects/atlassian-browser-mcp"
startup_timeout_sec = 30
tool_timeout_sec = 120
enabled_tools = [
"jira_search",
"jira_get_issue",
"jira_download_attachments",
"jira_get_issue_images",
]
[mcp_servers.atlassian_browser.env]
JIRA_URL = "https://jira.example.com"
CONFLUENCE_URL = "https://confluence.example.com"Then ask the main agent to delegate Jira reading:
Use jira_summarizer to read BIZ-20528, include comments, attachments, status, assignee, and acceptance details if available, and return a compact summary with blockers and engineering implications.
Firefox profile discovery is automatic. If Firefox has multiple profiles and the wrong one is selected, point directly at the cookie database:
export FIREFOX_COOKIE_FILE="$HOME/Library/Application Support/Firefox/Profiles/xxxx.default-release/cookies.sqlite"
./run-atlassian-browser-mcp.shTo use the previous Playwright/Chromium login flow instead:
export COOKIES_PROVIDER=playwright
./run-atlassian-browser-mcp.sh| Variable | Default | Description |
|---|---|---|
JIRA_URL |
(required) | Jira base URL (e.g. https://jira.example.com) |
CONFLUENCE_URL |
(required) | Confluence base URL (e.g. https://confluence.example.com) |
ATLASSIAN_BROWSER_AUTH_ENABLED |
true |
Enable browser auth (set false to fall back to token auth) |
COOKIES_PROVIDER |
firefox |
Cookie provider. Use firefox for existing Firefox cookies or playwright for the legacy Chromium login flow |
FIREFOX_COOKIE_FILE |
(auto) | Optional path to a Firefox cookies.sqlite file when automatic discovery picks the wrong profile |
HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, NO_PROXY |
(none) | Standard proxy environment variables honored by the underlying requests.Session; lowercase variants are also supported |
ATLASSIAN_BROWSER_PROFILE_DIR |
./.atlassian-browser-profile |
Playwright mode only: persistent Chromium profile directory |
ATLASSIAN_STORAGE_STATE |
./.atlassian-browser-state.json |
Playwright mode only: storage-state file |
ATLASSIAN_LOGIN_TIMEOUT_SECONDS |
300 |
Playwright mode only: seconds to wait for manual login |
ATLASSIAN_USERNAME |
(none) | Playwright mode only: prefill username on SSO page |
ATLASSIAN_SSO_MARKERS |
(auto) | Comma-separated URL/text markers for SSO redirect detection. Defaults cover Okta, ADFS, Azure AD, PingOne, Google SAML |
TOOLSETS |
all |
Which upstream toolsets to enable |
- Python 3.12+
- uv (for dependency management)
- Firefox with an active Jira/Confluence session
- Chromium only when
COOKIES_PROVIDER=playwright(installed automatically by Playwright) - Network access to your Atlassian instance