jira-issue-context-mcp
This server provides a single read-only tool (jira_issue_context) to fetch context for a specific Jira issue.
What it can do:
Retrieve the title and description of a specified Jira issue (by key, e.g.
CORE-7584)Fetch all comments, with automatic pagination
Download and return image attachments as MCP
imagecontentConvert Jira ADF (Atlassian Document Format) descriptions and comments into plain Markdown-friendly text
Control whether comments are included via
includeComments(defaults totrue)Control whether images are included via
includeImages(defaults totrue)Limit image download size per attachment via
maxImageSizeMB(defaults to 8 MB)Authenticate via Atlassian Cloud API token, bearer token, or session/browser cookie (with an integrated Playwright helper for SSO environments)
Limitations:
No write operations — cannot create, update, or transition issues
No JQL search, board/sprint browsing, or comment posting
Operates on one issue at a time
Provides read-only access to a single Jira issue, returning its title, description, comments, and image attachments. Supports Atlassian Cloud API token, bearer token, or session cookie authentication.
Click on "Install 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-issue-context-mcpFetch issue PROJ-123 for context"
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-issue-context-mcp
Read-only MCP server that gives Codex, Claude, Cursor, or any MCP client Jira issue context and JQL-based task discovery.
It intentionally stays narrow: fetch a single issue by key or list issues from a JQL query without performing Jira writes.
Features
Self-describing helper tool:
jira_issue_helpIssue context read-only tool:
jira_issue_contextWorkflow/router triage read-only tool:
jira_issue_workflowJQL read-only task discovery tool:
jira_issue_searchNo board listing, sprint browsing, transitions, comment creation, or writes
Converts Jira ADF descriptions/comments into plain Markdown-ish text
Paginates all issue comments
Validates JQL before search by default
Reads available transitions, issue links, subtasks, and recent changelog for router triage
Returns image attachments as MCP
imagecontentSupports Atlassian Cloud API token auth, bearer auth, or browser/session cookie auth
Optional Playwright login helper for cookie-based SSO setups
Related MCP server: Work Integrations MCP
Tools
jira_issue_help
Explains what tools this MCP exposes, when to use each one, and example arguments. It does not call Jira and does not require Jira authentication.
Inputs:
topic: optional help topic. Supported values:overview,router,config,jira_issue_search,jira_issue_workflow,jira_issue_context.
Use this tool when the model is unsure whether it should search by JQL, triage workflow state, or fetch full issue context.
jira_issue_context
Fetches the context for one issue key: title, description, comments, attachment summary, and image attachments.
jira_issue_workflow
Fetches a read-only workflow view for one issue key so routers can decide whether to create agent work.
Inputs:
issueKey: Jira issue key. Optional if the MCP was started with--issue=KEYorJIRA_ISSUE_KEY.maxChangelogEntries: maximum recent changelog entries to return. Defaults to5, maximum20.
The output includes:
current status and status category
available transitions for the authenticated user
subtasks and their statuses
issue links and linked issue statuses
recent changelog entries
a stable
Router PayloadJSON block withtaskKey,routerAction,availableTransitions, and workflow signals
Possible routerAction values:
ready_for_agent_work: issue is not done and transitions are availablereview_no_available_transitions: issue is not done, but Jira returned no transitions for this user/statusskip_done: issue is already in a Done status category
jira_issue_search
Runs a read-only JQL query and returns a compact task list for routers plus issue metadata.
Inputs:
jql: JQL query to execute.maxIssues: maximum issues to return. Defaults toJIRA_DEFAULT_JQL_MAX_ISSUESor5, maximum200.validateJql: validates the JQL before searching. Defaults totrue.
The output includes a stable Router Payload JSON block with taskKeys, issueCount, limit, and isTruncated. If isTruncated is true, the JQL matched more issues than maxIssues.
Example Router Payload:
{
"taskKeys": ["XXXX-123", "XXXX-345"],
"issueCount": 2,
"limit": 5,
"isTruncated": false
}Example router prompt:
Actua como router. Ejecuta este JQL y trabaja en las tareas en paralelo:
project = XXXX AND statusCategory != Done ORDER BY priority DESC, updated ASC
Primero usa jira_issue_search para obtener las claves. Despues delega a jira-pm para
revisar cada issue con jira_issue_workflow. Si routerAction es ready_for_agent_work,
recoge contexto por issue con jira_issue_context y crea una conversacion por tarea.
No trabajes mas de 5 issues por ejecucion salvo que yo indique otro maxIssues.For a daily Codex automation, use the same router prompt and keep maxIssues low. The MCP only discovers and reads Jira issues; branch creation, worktrees, delegation, commits, and pull requests belong to the Codex router/agents that consume the returned task keys.
Install
npm install
npm run buildDevelopment
Run the full local validation:
npm testThe test suite builds TypeScript and runs Node's built-in test runner. Current coverage includes:
config loading, auth selection, numeric defaults, and issue key validation
Jira issue field requests and HTTP error reporting
ADF-to-text conversion
image attachment download/skip behavior
JQL search pagination, truncation, and validation
helper guidance topics and examples
stable router payload formatting
workflow triage payloads, transitions, links, subtasks, and changelog formatting
Authentication
Set JIRA_BASE_URL plus one auth method.
Optional safety limit for JQL task discovery:
JIRA_DEFAULT_JQL_MAX_ISSUES=5You can put these variables in the shell environment or in a .env file in the directory where the MCP command is started. The package also checks its own local .env as a fallback.
If your MCP client starts the server from a different working directory, pass --env-file or set JIRA_ENV_PATH so the server reads the intended project .env explicitly:
JIRA_ENV_PATH=/absolute/path/to/your/project/.envjira-issue-mcp --env-file=/absolute/path/to/your/project/.envFor Codex project config, prefer --env-file in args because it avoids relying on the parent Codex process environment.
Recommended for Atlassian Cloud:
JIRA_BASE_URL=https://your-domain.atlassian.net
JIRA_EMAIL=you@example.com
JIRA_API_TOKEN=your-atlassian-api-tokenBearer token:
JIRA_BASE_URL=https://your-domain.atlassian.net
JIRA_BEARER_TOKEN=your-tokenCookie/session token:
JIRA_BASE_URL=https://your-domain.atlassian.net
JIRA_SESSION_TOKEN=your-cookie-value
JIRA_COOKIE_NAME=tenant.session.tokenFor SSO environments where API tokens are not available, the login helper can capture a browser cookie:
npx -y --package github:formonkey/jira-issue-context-mcp#main jira-issue-login \
--base-url=https://your-domain.atlassian.net \
--cookie-name=tenant.session.token \
--storage-state=.auth/jira-storage-state.jsonRun it from your project root. The first successful run writes JIRA_SESSION_TOKEN to .env and saves Playwright auth state to .auth/jira-storage-state.json. Later runs try that stored auth state first, refresh .env, and only open the browser again if the state is missing or expired.
--force-login=false is the normal mode. It does not disable login. It means:
Try the stored Playwright state first.
If the stored state is still valid, write a fresh
JIRA_SESSION_TOKENto.envand exit.If the stored state is missing or expired, open the login browser, let the user complete SSO, capture the cookie, and update
.env.
Use --force-login=true only when you explicitly want to ignore the stored state and force a fresh browser login.
If your Atlassian organization only shows SSO from a specific Jira application login URL, pass it explicitly:
npx -y --package github:formonkey/jira-issue-context-mcp#main jira-issue-login \
--base-url=https://your-domain.atlassian.net \
--cookie-name=tenant.session.token \
--login-url="https://id.atlassian.com/login?...&application=jira&orgId=..."Or let the helper build the Atlassian login URL:
npx -y --package github:formonkey/jira-issue-context-mcp#main jira-issue-login \
--base-url=https://your-domain.atlassian.net \
--cookie-name=tenant.session.token \
--atlassian-site-id=your-site-id \
--atlassian-org-id=your-org-id \
--login-application=jira \
--login-continue=https://your-domain.atlassian.net/browse/PROJ-123If Microsoft SSO blocks the automated browser, start Edge yourself with remote debugging and let the helper connect to that real Edge session:
npx -y --package github:formonkey/jira-issue-context-mcp#main jira-issue-login \
--base-url=https://your-domain.atlassian.net \
--cookie-name=tenant.session.token \
--launch-browser=msedge \
--cdp-port=9222 \
--default-profile=true \
--close-existing-browser=trueThis closes existing Edge processes, launches a real Edge process with the installed browser's default profile, connects to it over CDP, waits for you to finish Microsoft SSO, captures the Jira session cookie, and writes it to .env.
Advanced manual mode:
start msedge --remote-debugging-port=9222Then run:
npx -y --package github:formonkey/jira-issue-context-mcp#main jira-issue-login \
--base-url=https://your-domain.atlassian.net \
--cookie-name=tenant.session.token \
--cdp-url=http://127.0.0.1:9222Both CDP modes are useful for corporate SSO because the browser is launched as a normal installed browser instead of a Playwright-managed browser.
Recommended Project Makefile
For project usage, wrap the long login command in make. The important commands are:
make jira-login
make jira-checkmake jira-login should be the single normal login command. It tries the stored auth state first and only opens the SSO browser when required.
make jira-check should verify that the generated .env contains a valid Jira session before starting Codex or another MCP client.
Example for a project that vendors this MCP under mcps/jira:
JIRA_BASE_URL ?= https://your-domain.atlassian.net
JIRA_COOKIE_NAME ?= tenant.session.token
JIRA_STORAGE_STATE ?= .auth/jira-storage-state.json
JIRA_FORCE_LOGIN ?= false
JIRA_LOGIN_URL ?= https://id.atlassian.com/login?...&application=jira&orgId=...
.PHONY: jira-build jira-install-browser jira-login jira-check
jira-build: ; npm --prefix mcps/jira run build
jira-install-browser: ; npm --prefix mcps/jira exec playwright install chromium
jira-login: ; node mcps/jira/dist/login-cli.js --base-url="$(JIRA_BASE_URL)" --cookie-name="$(JIRA_COOKIE_NAME)" --storage-state="$(JIRA_STORAGE_STATE)" --login-url="$(JIRA_LOGIN_URL)" --force-login="$(JIRA_FORCE_LOGIN)"
jira-check: ; node mcps/jira/dist/check-cli.jsEquivalent make jira-login command when using the package directly from GitHub:
JIRA_BASE_URL ?= https://your-domain.atlassian.net
JIRA_COOKIE_NAME ?= tenant.session.token
JIRA_STORAGE_STATE ?= .auth/jira-storage-state.json
JIRA_FORCE_LOGIN ?= false
JIRA_LOGIN_URL ?= https://id.atlassian.com/login?...&application=jira&orgId=...
.PHONY: jira-login jira-check
jira-login: ; npx -y --package github:formonkey/jira-issue-context-mcp#main jira-issue-login --base-url="$(JIRA_BASE_URL)" --cookie-name="$(JIRA_COOKIE_NAME)" --storage-state="$(JIRA_STORAGE_STATE)" --login-url="$(JIRA_LOGIN_URL)" --force-login="$(JIRA_FORCE_LOGIN)"
jira-check: ; npx -y --package github:formonkey/jira-issue-context-mcp#main jira-issue-check --base-url="$(JIRA_BASE_URL)" --cookie-name="$(JIRA_COOKIE_NAME)"If Playwright reports that its browser executable is missing, run the install target once:
make jira-install-browserFor Atlassian SSO, prefer a login URL whose query contains application=jira. Some Atlassian admin/user-access URLs use application values such as admin--...; those flows may hide the Microsoft SSO option even though the normal Jira application flow works.
After make jira-login, verify the session:
make jira-checkThe check should call Jira /rest/api/3/myself with:
Cookie: tenant.session.token=<JIRA_SESSION_TOKEN>and return HTTP 200 OK. Once this works, restart the MCP client so it reads the updated .env.
MCP Client Configuration
This server uses the MCP stdio transport. Every MCP client needs to start a local command and pass the Jira environment file:
node /absolute/path/to/jira-issue-context-mcp/dist/index.js --env-file=/absolute/path/to/your/project/.envRecommended setup:
Clone or vendor this repository.
Run
npm installandnpm run build.Create a project
.envwithJIRA_BASE_URLand one auth method.Configure your MCP client to run
node dist/index.js --env-file=....Restart or reload the client and check that the tools are visible.
Keep secrets in .env, shell env, keychains, or client secret stores. Do not commit Jira tokens.
Tool Selection Guidance
Tell the agent this mapping so it uses the right tool:
Use
jira_issue_helpwhen unsure which Jira MCP tool fits the request.Use
jira_issue_searchwhen the user gives a JQL or asks for pending Jira tasks.Use
jira_issue_workflowbefore opening implementation work for an issue.Use
jira_issue_contextwhen the agent needs the full description, comments, attachments, and images for one issue.
Good router prompt:
Actua como router. Ejecuta este JQL y trabaja en las tareas en paralelo:
project = XXXX AND statusCategory != Done ORDER BY priority DESC, updated ASC
Usa jira_issue_search con maxIssues=5 para obtener las claves.
Para cada clave, usa jira_issue_workflow.
Si routerAction es ready_for_agent_work, delega a jira-pm para obtener contexto con jira_issue_context.
Crea una conversacion o rama por tarea siguiendo el patron feature/XXXX-123.
No hagas escrituras en Jira desde este MCP; es read-only.Codex
Project-level config goes in .codex/config.toml.
Local checkout:
[mcp_servers.jira_issue]
command = "node"
args = [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
]
cwd = "/absolute/path/to/your/project"
enabled = true
startup_timeout_sec = 20
tool_timeout_sec = 90
default_tools_approval_mode = "auto"Directly from GitHub with npx:
[mcp_servers.jira_issue]
command = "npx"
args = [
"-y",
"--package",
"github:formonkey/jira-issue-context-mcp#main",
"jira-issue-mcp",
"--env-file=/absolute/path/to/your/project/.env"
]
cwd = "/absolute/path/to/your/project"
enabled = true
startup_timeout_sec = 20
tool_timeout_sec = 90
default_tools_approval_mode = "auto"Codex project instructions can include:
When Jira context is needed, use the jira_issue MCP server.
For JQL task discovery use jira_issue_search.
For router triage use jira_issue_workflow.
For full issue context use jira_issue_context.Claude Code
Claude Code can load MCP servers from a project .mcp.json, user scope, or local scope. For team-shared configuration, put this in .mcp.json at the project root:
{
"mcpServers": {
"jira-issue": {
"type": "stdio",
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
],
"env": {}
}
}
}Equivalent CLI command:
claude mcp add --transport stdio --scope project jira-issue -- \
node /absolute/path/to/jira-issue-context-mcp/dist/index.js \
--env-file=/absolute/path/to/your/project/.envVerify in Claude Code:
claude mcp listInside Claude Code, run:
/mcpIf you already configured the server in Claude Desktop, Claude Code can import compatible servers on supported platforms:
claude mcp add-from-claude-desktopClaude Desktop
Claude Desktop local MCP configuration is separate from Claude Code. Add this to claude_desktop_config.json:
{
"mcpServers": {
"jira-issue": {
"type": "stdio",
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
],
"env": {}
}
}
}Restart Claude Desktop after editing the file. If tools do not appear, confirm that npm run build has produced dist/index.js and that the .env path is absolute.
GitHub Copilot in VS Code
VS Code MCP configuration uses a top-level servers object. For a workspace-shared setup, create .vscode/mcp.json:
{
"servers": {
"jira-issue": {
"type": "stdio",
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
]
}
}
}Then:
Reload VS Code.
Open Copilot Chat.
Use Agent mode.
Open the tools picker and confirm
jira-issuetools are listed.
For personal VS Code configuration, use the command palette action MCP: Open User Configuration and add the same server under servers.
GitHub Copilot CLI
Copilot CLI uses mcpServers. Add a user-level server:
copilot mcp add jira-issue --type stdio -- \
node /absolute/path/to/jira-issue-context-mcp/dist/index.js \
--env-file=/absolute/path/to/your/project/.envVerify:
copilot mcp list
copilot mcp get jira-issueWorkspace-level Copilot CLI configs can be stored in .mcp.json or .github/mcp.json:
{
"mcpServers": {
"jira-issue": {
"type": "stdio",
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
]
}
}
}Copilot CLI requires tool-call permission even for read-only MCP tools.
GitHub Copilot Custom Agent
For a Copilot custom agent profile, configure this MCP under mcp-servers and list the tools the agent may use:
---
name: jira-router
description: Routes Jira issues into implementation work.
tools:
- jira-issue/jira_issue_search
- jira-issue/jira_issue_workflow
- jira-issue/jira_issue_context
mcp-servers:
jira-issue:
type: local
command: node
args:
- /absolute/path/to/jira-issue-context-mcp/dist/index.js
- --env-file=/absolute/path/to/your/project/.env
tools: ["*"]
---
Actua como router de Jira. Usa jira_issue_search para JQL, jira_issue_workflow
para triage y jira_issue_context para contexto completo.For cloud agents, configure Jira secrets as repository or organization agent secrets/variables instead of hardcoding them.
Gemini CLI
Gemini CLI uses mcpServers in settings.json. Project-level config goes in .gemini/settings.json; user-level config goes in ~/.gemini/settings.json.
{
"mcpServers": {
"jira-issue": {
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
],
"timeout": 30000,
"trust": false
}
}
}Gemini CLI also supports adding the server from the command line:
gemini mcp add jira-issue node /absolute/path/to/jira-issue-context-mcp/dist/index.js -- \
--env-file=/absolute/path/to/your/project/.envVerify:
gemini mcp listInside Gemini CLI:
/mcpAvoid underscores in Gemini MCP server aliases; use jira-issue instead of jira_issue.
Cursor
Cursor uses mcpServers. Project-level config goes in .cursor/mcp.json; global config goes in ~/.cursor/mcp.json.
{
"mcpServers": {
"jira-issue": {
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
],
"env": {}
}
}
}Use Cursor Agent/Composer and ask for the tool by purpose:
Use the Jira MCP to fetch workflow triage for XXXX-123 before implementing.Continue
Continue can load MCP server blocks from .continue/mcpServers/. Create .continue/mcpServers/jira-issue.yaml:
name: Jira Issue MCP
version: 1.0.0
schema: v1
mcpServers:
- name: Jira Issue
type: stdio
command: node
args:
- /absolute/path/to/jira-issue-context-mcp/dist/index.js
- --env-file=/absolute/path/to/your/project/.envContinue also supports copying JSON-style MCP config files into .continue/mcpServers/, so the generic mcpServers JSON block below also works there.
Windsurf / Cascade
Windsurf uses a global mcp_config.json. Open Cascade's MCP settings, choose the raw config, and add:
{
"mcpServers": {
"jira-issue": {
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
]
}
}
}After saving, refresh MCP servers from the Windsurf/Cascade MCP toolbar. If your Windsurf version does not interpolate env vars, keep using --env-file as shown.
Generic MCP Clients
Most MCP clients accept a config shaped like this:
{
"mcpServers": {
"jira-issue": {
"type": "stdio",
"command": "node",
"args": [
"/absolute/path/to/jira-issue-context-mcp/dist/index.js",
"--env-file=/absolute/path/to/your/project/.env"
],
"env": {}
}
}
}Some clients use servers instead of mcpServers and some call stdio local. Keep the command and args the same.
Troubleshooting MCP Clients
Run
npm run buildbefore configuring clients; they executedist/index.js.Use an absolute
--env-filepath.Restart or reload the client after changing MCP config or
.env.Check that
JIRA_BASE_URLand exactly one auth method are valid.Run
node dist/check-cli.js --env-file=/absolute/path/to/your/project/.envif auth fails.If the client shows the server but no tools, inspect the client's MCP logs and confirm stdout is not used for logs. This server writes diagnostics to stderr.
If a JQL returns too many issues, lower
maxIssuesor setJIRA_DEFAULT_JQL_MAX_ISSUES=5.
Reference Docs
Codex uses project
.codex/config.tomlfor MCP server configuration.Claude Code MCP configuration: https://code.claude.com/docs/en/mcp
Claude Desktop MCP support: https://support.anthropic.com/en/articles/10949351-getting-started-with-local-mcp-servers-on-claude-desktop
VS Code MCP configuration: https://code.visualstudio.com/docs/agents/reference/mcp-configuration
GitHub Copilot CLI MCP configuration: https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference
GitHub Copilot custom agents with MCP: https://docs.github.com/en/copilot/reference/custom-agents-configuration
Gemini CLI MCP configuration: https://github.com/google-gemini/gemini-cli/blob/main/docs/tools/mcp-server.md
Cursor MCP configuration: https://docs.cursor.com/context/model-context-protocol
Continue MCP configuration: https://docs.continue.dev/customize/deep-dives/mcp
Windsurf MCP configuration example: https://learn.microsoft.com/en-us/azure/developer/azure-mcp-server/get-started/tools/windsurf
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Related MCP Servers
- Alicense-qualityDmaintenanceA read-only MCP server that enables querying and searching Atlassian Confluence pages and Jira issues through their REST APIs. Supports retrieving content by ID or URL, searching using CQL/JQL, and listing spaces and projects.Last updated1MIT
- Alicense-qualityDmaintenanceAn MCP server that enables interaction with Jira to fetch issues by key and perform JQL searches. It provides a foundation for integrating multiple work systems, with planned support for Slack and GitHub.Last updated634MIT
- FlicenseDqualityCmaintenanceMCP server for fetching Jira issue data via the Jira API.Last updated1
- Alicense-qualityBmaintenanceA read-only MCP server that provides AI agents structured access to Jira Cloud, enabling project listing, sprint overview, issue retrieval, and JQL search.Last updated80MIT
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
A MCP server built for developers enabling Git based project management with project and personal…
A basic MCP server to operate on the Postman API.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/formonkey/jira-issue-context-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server