Jira MCP OAuth gateway
This MCP server connects an AI assistant (e.g. Cursor) to Jira over stdio so it can search, read, create, edit, and manage Jira issues on Cloud or Data Center.
Authenticate:
jira_loginruns a Playwright/Chromium browser SSO flow and saves cookies for REST calls (schema also allows aJIRA_PATtoken fallback).Search:
execute_jqlruns JQL queries (maxResults, default 10, max 100).Read issues:
get_ticket/get_taskfor full issue JSON,read_ticket/read_taskfor a compact view,get_only_ticket_name_and_descriptionfor summary + plain-text description only.Create issues:
create_ticketwith summary, description, issuetype, and optional project, boardName, boardId, or parent; project resolves viaJIRA_DEFAULT_PROJECT, a board, or a single board project.Update issues:
edit_ticketfor summary, description, labels, and parent.Delete issues:
delete_ticket(subject to Jira permissions).Projects & boards:
list_projectsandlist_boards(Jira Software Agile, used to resolve create_ticket targets).People & workflow:
assign_ticketby Atlassian account ID,query_assignablefor assignable users in a project,get_all_statusesfor issue statuses.Attachments:
add_attachment_from_confluence(pull a Confluence page attachment) andadd_attachment_from_public_url(download from a URL and attach).Compatibility: works against Jira Cloud or Data Center/Server, with configurable REST prefix (
/rest/api/3default,/rest/api/2fallback), description format, timeouts, keep-alive, and default project.
Supports adding attachments from Confluence pages to Jira issues using Confluence REST API and authentication.
Provides tools for searching, reading, creating, updating, deleting, and assigning Jira issues, as well as managing projects, boards, statuses, and attachments.
Integrates with Jira Software boards for listing boards and creating tickets with board context.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Jira MCP OAuth gatewayshow me recent issues assigned to me"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Jira MCP
A Model Context Protocol (MCP) server that connects AI assistants (for example Cursor Composer or Agent) to your Jira site. Configure JIRA_BASE_URL for Atlassian Jira Cloud or Jira Data Center / Server—this project is not limited to one company or hosting model. You can search issues, read and edit tickets, manage assignments, and more, authenticating with a browser SSO session (cookies). Auth is SSO-cookie only — there is no token/PAT mode. A background session keep-alive helps the cookie stay warm while the server runs.
See also (sibling projects)
Project | Purpose |
Confluence MCP | confluence-mcp — Confluence REST + SSO ( |
GitHub Enterprise launcher | mcp-github-enterprise-launcher — npm stdio wrapper around a |
SonarQube launcher | mcp-sonarqube-launcher — npm stdio wrapper around a SonarQube MCP |
Related MCP server: MCP Atlassian
What this project is
Role | Runs as a small Node.js process that speaks MCP over standard input/output (stdio). Your editor starts it; you do not usually run it by hand except when debugging. |
Target product | Jira (Cloud or Data Center) via REST. Paths default to |
Auth model | SSO cookies only — complete |
SSO login | Uses Playwright + Chromium to open a real browser, let you sign in (SAML, OIDC, etc.), and saves session cookies for later API calls. |
Session keep-alive | A background loop pings |
The design matches the idea behind confluence-mcp: use a real browser session for corporate SSO, and treat Jira as a normal REST API with those cookies.
Why use it
Works behind SSO: Many organizations do not expose simple API-password flows. A real browser SSO session fits Data Center and many federated setups where only interactive login is allowed.
No secrets in config: There are no tokens to store or accidentally commit — auth is the browser session cookie, saved locally and gitignored.
Familiar Jira operations: JQL search, full issue JSON, compact “read” views, create/update/delete, projects, assignees, statuses, and optional attachments from Confluence or a public URL.
How it fits in your workflow
You add this server to Cursor (or another MCP client) via
mcp.json.You set at least
JIRA_BASE_URLin that config’senvblock.Cursor starts the server when needed; the assistant calls MCP tools by name (for example “run
execute_jqlwith …”).If you rely on SSO, you run
jira_loginonce (tool ornpm run login); cookies are stored undercookies/session.jsonon disk (ignored by git and not published to npm).
┌─────────────┐ stdio (JSON-RPC) ┌──────────────────┐ HTTPS ┌─────────────┐
│ Cursor / │ ◄────────────────────► │ This MCP server │ ───────────► │ Jira REST │
│ MCP client │ │ (Node + fetch) │ Cookies │ (and opt. │
└─────────────┘ └──────────────────┘ Cookies │ Confluence) │
└─────────────┘MCP tools (reference)
Tools are exposed to the assistant under the names below. Exact parameters are defined in the server’s tool schemas (your client may show them in the UI).
Authentication
Tool | Purpose |
| Opens a browser, completes SSO, saves the session cookie file. Run once before using other tools, and again if the session expires. |
Search and read
Tool | Purpose |
| Run JQL and return matching issues (with configurable |
| Full issue JSON from the REST API (aliases for task-style issues). |
| Compact issue view (summary, description as plain text, status, assignee, etc.). |
| Only summary and plain-text description. |
Create, update, delete
Tool | Purpose |
| Create an issue (summary, description, issuetype; optional project, boardName, boardId, parent). If project is omitted, uses JIRA_DEFAULT_PROJECT, resolves from a board, or auto-picks when only one project appears on your boards—otherwise fails with a message listing boards (use |
| List Jira Software boards (Agile REST). Helps choose boardName / boardId for |
| Update fields such as summary, description, labels, parent. |
| Delete an issue (requires permission in Jira). |
Projects, people, workflow
Tool | Purpose |
| List projects (v3: search API; v2: |
| Assign an issue by Atlassian account ID. |
| List users assignable for a project key. |
| Return issue statuses from Jira. |
Attachments
Tool | Purpose |
| Pull a named attachment from a Confluence page (needs |
| Download a file from a public URL and attach it to an issue. |
Prerequisites
Node.js 18+
Network access to your Jira (and Confluence, if you use that tool)
One-time browser install for Playwright (Chromium), required only if you use
jira_loginor SSO fallback:
npm install
npm run install-browserHow to use it
Option A — Published package (npx)
After the package is on npm, you do not need to clone the repo. Cursor (or your host) can start the server with:
npx -y @svasimahmed283/jira-mcp@0.2.3Pin a version if you want reproducibility:
npx -y @svasimahmed283/jira-mcp@0.2.3@0.1.4The process speaks MCP on stdio. In normal use the IDE starts it; you only run the command yourself to verify installation or debug.
Option B — Clone this repository
git clone <your-repo-url>
cd jira-mcp
npm install
npm run install-browserRun the server locally:
npm startSame stdio behavior as npx; again, the typical pattern is to let Cursor spawn node with a path to src/index.js (see below).
Configure Cursor (mcp.json)
Put URLs and timeouts in env. There are no secrets to configure — auth is the browser SSO session saved by jira_login.
Using npx (after publish):
{
"mcpServers": {
"jira-sso": {
"command": "npx",
"args": ["-y", "@svasimahmed283/jira-mcp@0.2.3"],
"env": {
"JIRA_BASE_URL": "https://jira.company.com",
"JIRA_LOGIN_WAIT_SECONDS": "90"
}
}
}
}Using a local checkout (development):
{
"mcpServers": {
"jira-sso": {
"command": "node",
"args": ["C:/path/to/jira-mcp/src/index.js"],
"env": {
"JIRA_BASE_URL": "https://jira.company.com"
}
}
}
}Replace
jira-ssoif you prefer another server id; it is only a label in Cursor.Fully quit and restart Cursor after any change to
mcp.json.
First-time SSO
Ensure
JIRA_BASE_URLis correct (include/jirain the path only if your instance uses that context path).In chat, run the
jira_logintool or from the repo runnpm run login(uses the same merged config as the MCP server).Complete login in the opened browser; wait until the tool finishes (up to
JIRA_LOGIN_WAIT_SECONDS, default 90).On success, the server also discovers your Agile board(s) and their project keys and caches them to
cookies/boards-<host>.json. From then on,create_ticketdefaults to your board's project when you don't pass one (auto-selected only when a single project is cached; otherwise passproject,boardName, orboardId). Re-runjira_loginto refresh the cache.Use
execute_jql,read_ticket, etc., as needed.
Using tools from the assistant
You do not type REST URLs yourself. Ask the assistant in natural language, for example:
“Search Jira for
project = KEY AND status = Openusingexecute_jql.”“Read issue
KEY-123withread_ticket.”“Create a Bug in project
KEYwith summary … usingcreate_ticket.”
The client maps these to the tool calls above.
Environment variables
Required
Variable | Meaning |
| Root URL of your Jira site (example: |
Optional (Jira)
Variable | Meaning |
| REST base path (default |
|
|
| Login page URL (default |
| Browser SSO wait, in seconds (default 90). |
| Max upload size in bytes (default 10 MiB). |
| If several MCP entries share the same path to |
| Default project key when |
| Background session keep-alive interval in seconds (default 240). Set |
| During |
Optional (Confluence attachment helper)
Variable | Meaning |
| Confluence root URL for |
| Optional; used to name the Confluence cookie file for |
Cookie files: Jira SSO uses cookies/session-<JIRA_MCP_SERVER_KEY or hostname>.json. Confluence attachments from this package use cookies/cf-<CONFLUENCE_MCP_SERVER_KEY or hostname>.json (separate from Jira). Both come from SSO login — there is no token mode.
Where to set them
Cursor:
%USERPROFILE%\.cursor\mcp.json(Windows) or~/.cursor/mcp.json(macOS/Linux) →mcpServers.<name>.env. Restart the IDE after edits.Local
npm run login: Env is merged from the discoveredmcp.jsonblock (same path as thissrc/index.js, or legacyjira-sso) for keys that are unset—setJIRA_MCP_SERVER_KEYwhen multiple entries share that path.
Configuration reference (files & precedence)
Topic | Detail |
Auth | SSO cookies only — no tokens are read from |
CLI login merge | Fills only undefined env keys from the discovered block (never overwrites Cursor). |
Cookie files | One file per instance: |
Cookies | SSO sessions are saved under this package's |
| Needs |
Defaults (when omitted)
Variable | Default |
|
|
|
|
|
|
|
|
|
|
| (none — set when you want |
Boards and Agile: list_boards and board-based create_ticket resolution use /rest/agile/1.0 (Jira Software). If that API returns 404 or an empty list, your site may not expose Software boards—set project or JIRA_DEFAULT_PROJECT instead.
Authentication (summary)
Auth is SSO cookies only. Run
jira_loginonce; the session cookie file is used for every REST call.A background keep-alive (
JIRA_KEEPALIVE_SECONDS, default 240) pings/myselfto keep the session warm and warns on stderr if it goes stale.When the session truly expires, tools fail with a clear error — run
jira_loginagain to refresh it. (SSO cookies cannot be renewed headlessly.)
Validation
Step | Command / action |
Unit tests (features) |
|
Syntax + config (no Jira calls) |
|
MCP wiring | Cursor Settings → MCP: server shows connected. Restart Cursor after |
Interactive tools | In Agent, call |
Inspector (optional) | Install/run the official MCP Inspector (see modelcontextprotocol/inspector) and point it at |
Local tarball sanity check
npm pack
# Creates e.g. svasimahmed283-jira-mcp-0.2.3.tgzWindows (cmd):
set JIRA_BASE_URL=https://jira.example.com
npx .\svasimahmed283-jira-mcp-0.2.3.tgzmacOS / Linux:
export JIRA_BASE_URL=https://jira.example.com
npx ./svasimahmed283-jira-mcp-0.2.3.tgzThe first npx run may take a moment while dependencies install. If your mcp.json already defines JIRA_BASE_URL, the process may stay running on stdio (normal for MCP).
Security
Treat session cookies like passwords. Do not commit the
cookies/directory (it is gitignored and excluded from the npm package).A saved cookie file grants roughly the same access as your browser user; lock down the machine and project directory.
Troubleshooting
Symptom | What to do |
| Add |
401 / HTML instead of JSON | Session expired or wrong API version — try |
SSO in the browser but REST still 401 | Delete the per-server file under |
| Increase |
Browser closes immediately | Session detection requires JSON from |
| Ensure the |
Half-installed | Clear |
Repository and npm metadata
Package repository, homepage, and bugs in package.json point to https://github.com/Wasim-Shaikh25/jira-mcp. Update those fields if you fork to another org.
The npm package name is @svasimahmed283/jira-mcp. Legacy: jira-mcp-oauth, unscoped jira-mcp (name taken on npm), repo jira-mcp-auth.
License
See package.json for the declared license. Add a LICENSE file in the repo if you publish publicly.
Available Tools
17 toolsadd_attachment_from_confluenceA
Download an attachment from Confluence (CONFLUENCE_BASE_URL + CONFLUENCE_PAT or SSO cookies) and upload it to a Jira issue.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Confluence page ID | |
| issueIdOrKey | Yes | Issue ID or key to add attachment to | |
| attachmentName | Yes | Name of the attachment in Confluence |
add_attachment_from_public_urlA
Download a file from a public URL and attach it to a Jira issue.
| Name | Required | Description | Default |
|---|---|---|---|
| imageUrl | Yes | Public URL of the file to attach | |
| issueIdOrKey | Yes | Issue ID or key to add attachment to |
assign_ticketC
Assign an issue by Atlassian account ID.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Assignee's account ID | |
| issueIdOrKey | Yes | Issue ID or key to assign |
create_ticketA
Create an issue in a project. project is optional if the destination is unambiguous: set JIRA_DEFAULT_PROJECT in MCP env, pass boardName or boardId (Jira Software Agile boards), or omit when your account sees exactly one project across boards—otherwise the tool fails with a clear error listing boards (use list_boards). Description is plain text: v3 → ADF, v2 → string (JIRA_REST_API_PREFIX, JIRA_DESCRIPTION_FORMAT). Does not set sprint/backlog placement—use the UI or Agile REST for that.
| Name | Required | Description | Default |
|---|---|---|---|
| parent | No | Parent issue key (for subtasks) | |
| boardId | No | Agile board id as string (from list_boards or the board URL). Resolves the board's project key when project is not set. | |
| project | No | Project key (e.g. PROJ). If omitted, resolution uses JIRA_DEFAULT_PROJECT, boardName/boardId, or a single board project. | |
| summary | Yes | Ticket summary | |
| boardName | No | Jira Software board name (substring match). Resolves the board's project key when project is not set. | |
| issuetype | Yes | Issue type name (Bug, Story, Task, etc.) | |
| description | Yes | Ticket description (plain text) |
delete_ticketB
Delete an issue (requires permission).
| Name | Required | Description | Default |
|---|---|---|---|
| issueIdOrKey | Yes | Issue ID or key to delete |
edit_ticketB
Update issue fields (summary, description, labels, parent).
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | Labels to set | |
| parent | No | New parent issue key | |
| summary | No | New summary | |
| description | No | New description (plain text) | |
| issueIdOrKey | Yes | Issue ID or key to edit |
execute_jqlC
Run a JQL search and return issues (summary fields).
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | JQL query string | |
| maxResults | No | Maximum number of results (default 10, max 100). |
get_all_statusesB
Return all issue statuses from Jira.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Ignored; kept for parity with official tool shape. |
get_only_ticket_name_and_descriptionA
Return only summary and plain-text description for an issue.
| Name | Required | Description | Default |
|---|---|---|---|
| issueIdOrKey | Yes | The issue ID or key of the ticket |
get_taskB
Same as get_ticket — returns full issue JSON (alias for task-type issues).
| Name | Required | Description | Default |
|---|---|---|---|
| issueIdOrKey | Yes | The issue ID or key of the ticket |
get_ticketA
Get full issue JSON from Jira. Uses JIRA_REST_API_PREFIX (e.g. /rest/api/2 or /rest/api/3). If you see 401, set JIRA_PAT or run jira_login once.
| Name | Required | Description | Default |
|---|---|---|---|
| issueIdOrKey | Yes | The issue ID or key of the ticket |
jira_loginA
SSO login in a browser (Playwright); saves cookies for REST. If IdP redirects or automation block a session, use JIRA_PAT + PREFER_SSO_COOKIES=0 in mcp.json or delete the reported cookie file. When JIRA_PAT is set, REST prefers it unless PREFER_SSO_COOKIES and cookies override.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
list_boardsA
List Jira Software boards (GET /rest/agile/1.0/board). Use names/ids with create_ticket when project is ambiguous. Returns 404 if Agile is disabled or your site has no Software boards—in that case pass project or JIRA_DEFAULT_PROJECT.
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum boards (default 50, max 50). |
list_projectsA
List Jira projects. Uses /project/search on REST v3; on REST v2 uses GET /project (v2 has no project search endpoint).
| Name | Required | Description | Default |
|---|---|---|---|
| maxResults | No | Maximum number of projects (default 50, max 100). |
query_assignableB
List users assignable for a project.
| Name | Required | Description | Default |
|---|---|---|---|
| project_key | Yes | Project key to query assignable users for |
read_taskC
Same as read_ticket — compact issue view (alias for task-type issues).
| Name | Required | Description | Default |
|---|---|---|---|
| issueIdOrKey | Yes | The issue ID or key of the ticket |
read_ticketC
Read a ticket as a compact object (summary, plain-text description, status, assignee, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| issueIdOrKey | Yes | The issue ID or key of the ticket |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v0.1.5- First observed
add_attachment_from_confluence - First observed
add_attachment_from_public_url - First observed
assign_ticket - First observed
create_ticket - First observed
delete_ticket - First observed
edit_ticket - First observed
execute_jql - First observed
get_all_statuses - First observed
get_only_ticket_name_and_description - First observed
get_task - First observed
get_ticket - First observed
jira_login - First observed
list_boards - First observed
list_projects - First observed
query_assignable - First observed
read_task - First observed
read_ticket
TDQS
Scored across 17 tools
Multiple aliases (get_task/get_ticket, read_task/read_ticket) create redundancy and confusion. Agents may struggle to choose the correct tool for retrieving issue data. The two attachment tools are similar but distinct in source.
Most tools follow verb_noun pattern (e.g., create_ticket, list_boards), but inconsistencies exist: jira_login instead of login_jira, and usage of both 'get' and 'read' for similar retrieval functions. The lengthy get_only_ticket_name_and_description breaks the pattern.
17 tools is slightly above the well-scoped range (3-15). While the number covers Jira operations, the presence of duplicate aliases (4 tools for ticket retrieval) inflates the count without adding value.
Core operations like CRUD for issues, JQL search, and project/board listing are present. However, critical gaps exist: no tool for transitioning issue status (workflow), and no direct way to manage issue types or sprints. Alias tools further reduce effective coverage.
Related MCP Connectors
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
One MCP server for the services your AI needs: memory, files, Microsoft 365, kanban and more.
Related MCP Servers
- AlicenseCqualityCmaintenanceAn MCP server that enables AI assistants to interact with JIRA, allowing for querying issue details, creating and updating work items, and managing attachments through a standardized interface.124MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that enables AI assistants to interact with Atlassian Jira and Confluence across Cloud and Server/Data Center environments. It supports tasks like searching and summarizing documentation, managing Jira issues, and creating content through natural language.MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that provides AI assistants with access to Jira Cloud for issue management, search, and workflow operations.-
- AlicenseNot gradedqualityCmaintenanceMCP server for Atlassian Confluence and Jira, enabling AI assistants to search, create, and update issues and pages via natural language.MIT