mcp-jira
Provides tools for searching, creating, updating, and managing JIRA issues, including comments, links, epics, subtasks, and workflow transitions, via the JIRA API.
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., "@mcp-jirasearch for open bugs in project PROJ using JQL"
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 Server (Async)
An async Model Context Protocol (MCP) server for JIRA integration via stdio transport. Supports both Atlassian Cloud and Server/DC instances.
MCP Tools
6 tools covering the full issue lifecycle, plus 2 prompt templates:
Tool | Description | Key Parameters |
| Search issues using JQL (paginated) |
|
| Get issue details, comments, links; optionally subtasks and transitions |
|
| Create a new issue |
|
| Update fields on an existing issue, optionally add a comment |
|
| Move an issue through a workflow transition |
|
| Get required fields and allowed values before creating an issue |
|
Related MCP server: Jira MCP Server
Features
Cloud + Server/DC: Auto-detects deployment type via
JIRA_USER_EMAILenv varToken optimization: API responses transformed to 40-60% fewer tokens
ADF support: Reads and writes Atlassian Document Format (Cloud v3)
Connection pooling:
aiohttpwith configurable pool sizeRate limiting: Built-in throttling with exponential backoff on 429s
Testable: Injectable client via
_set_client(), session injection for HTTP-level tests, 113 unit tests
Setup
Prerequisites
Python 3.13+
uv package manager
JIRA API token
Installation
git clone https://github.com/judexzhu/mcp-jira.git
cd mcp-jira
uv sync
cp config.env.example .env
# Edit .env with your JIRA credentialsEnvironment Variables
Variable | Description | Default | Required |
| Your JIRA instance URL | — | Yes |
| Your JIRA API token | — | Yes |
| Email for Cloud Basic Auth (enables Cloud mode) | — | Cloud only |
| Max concurrent requests & rate limit (req/sec) |
| No |
| HTTP request timeout (seconds) |
| No |
| HTTP connection timeout (seconds) |
| No |
| Logging level |
| No |
| Enable stdout logging (breaks MCP stdio) |
| No |
Claude Desktop
Add to your Claude Desktop MCP config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"jira": {
"command": "uv",
"args": ["run", "--directory", "/path/to/mcp-jira", "python", "jira_mcp_server.py"],
"env": {
"JIRA_SERVER_URL": "https://your-company.atlassian.net",
"JIRA_API_TOKEN": "your_api_token",
"JIRA_USER_EMAIL": "you@company.com"
}
}
}
}Claude Code
Add to your Claude Code MCP settings (.claude/settings.json or global ~/.claude/settings.json):
{
"mcpServers": {
"jira": {
"command": "uv",
"args": ["run", "--directory", "/path/to/mcp-jira", "python", "jira_mcp_server.py"],
"env": {
"JIRA_SERVER_URL": "https://your-company.atlassian.net",
"JIRA_API_TOKEN": "your_api_token",
"JIRA_USER_EMAIL": "you@company.com"
}
}
}
}Or add via CLI:
claude mcp add jira \
-e JIRA_SERVER_URL=https://your-company.atlassian.net \
-e JIRA_API_TOKEN=your_api_token \
-e JIRA_USER_EMAIL=you@company.com \
-- uv run --directory /path/to/mcp-jira python jira_mcp_server.pyAlternatively, skip the -e flags and put credentials in a .env file inside the mcp-jira directory — load_dotenv() picks them up automatically.
Testing
# Unit tests (no credentials needed)
uv sync --group dev
uv run pytest tests/ -vArchitecture
Two-file core:
jira_mcp_server.py— 6 MCP tool functions + 2 prompt templates, each a thin wrapper delegating to the clientjira_client.py—AsyncJiraClientwithJiraClientProtocolseam,_CloudFormat/_ServerFormatadapters, auth, connection pooling, rate limiting, retry, and response transformation
Cloud vs Server/DC is detected by the presence of JIRA_USER_EMAIL. See docs/adr/0001-cloud-detection-via-email.md for the rationale.
Available Tools
6 toolsjira_create_issueA
Creates a new issue in a specified Jira project. Requires project key, summary, description, and issue type. Optional fields include assignee, priority, labels, and custom fields.
On Cloud instances, pass an accountId string for assignee_name (not a username).
Args: project_key: Key of the project to create issue in (e.g., "PROJECT") summary: Issue summary description: Issue description issue_type_name: Type of the issue to create (e.g., "Bug", "Task") assignee_name: Assignee — accountId on Cloud, username on Server/DC (optional) priority_name: Name of the priority (optional) labels: List of labels to add to the issue (optional) custom_fields: Dictionary of custom fields to set (optional)
Returns: JSON object with the key of the new issue
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | ||
| summary | Yes | ||
| description | Yes | ||
| project_key | Yes | ||
| assignee_name | No | ||
| custom_fields | No | ||
| priority_name | No | ||
| issue_type_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the creation behavior, required parameters, the return value (JSON with issue key), and a Cloud-specific nuance for assignee_name. It lacks details on permissions, validation, or side effects, but covers the key behavioral aspects for a create tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an opening summary, a caveat, an Args list, and a Returns line. The Args list is justified because the schema lacks descriptions. The 'Optional fields include...' sentence is slightly redundant with the Args list, but it provides a quick overview, so it still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema, and no annotations, the description covers all parameters, the return value, and a platform-specific behavior. It does not address potential errors, permissions, or custom field formatting, but for a creation tool this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by documenting all 8 parameters with meaningful explanations, examples (e.g., project_key example, issue type examples), and the Cloud versus Server/DC distinction for assignee_name. This is far beyond what the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Creates a new issue in a specified Jira project' — a specific verb+resource statement that clearly distinguishes it from sibling tools like jira_update_issue or jira_search_issues. It also lists required vs optional parameters, reinforcing the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on required fields and optional fields, plus a specific platform caveat for Cloud instances (accountId vs username). However, it does not explicitly state when to prefer this tool over alternatives or mention when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_create_metaA
Get metadata for creating issues — available issue types and their required/optional fields.
Call without issue_type to list available types. Call with issue_type to get field requirements.
Args: project_key: Project key (e.g., "OCPBUGS") issue_type: Issue type name (e.g., "Bug"). If omitted, lists available types.
Returns: Issue types list, or field details (name, required, allowed values) for one type
| Name | Required | Description | Default |
|---|---|---|---|
| issue_type | No | ||
| project_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavior disclosure. It explains the two distinct output modes based on the issue_type parameter and summarizes the return content ('Issue types list, or field details (name, required, allowed values)'). This goes beyond a mere restatement of the tool name, though it does not mention potential errors or edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with a one-sentence summary followed by clearly labeled Args and Returns sections. Every sentence adds value: the first explains the purpose, the second explains the two call modes, the Args list clarifies parameter formats, and the Returns section sets expectations. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains the return values and the two call modes. It could be more detailed about the exact structure of 'field details' (e.g., whether IDs are included), but for a metadata retrieval tool with only two parameters, the description is sufficiently complete for an agent to invoke it correctly. It also covers both parameter modes, which is the main complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description fully compensates for the 0% schema coverage. It explains both parameters with examples (project_key: 'OCPBUGS', issue_type: 'Bug') and describes the effect of omitting issue_type. This gives an agent complete understanding of how to fill the arguments, which is far more than the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' with a clear resource 'metadata for creating issues', and further specifies the two modes of operation (listing issue types vs. retrieving field details). This distinguishes it from sibling tools like jira_create_issue, which perform actual creation, and jira_get_issue, which retrieves existing issues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to call with and without the issue_type parameter: 'Call without issue_type to list available types. Call with issue_type to get field requirements.' While it doesn't name alternative tools, the purpose is clear enough that an agent would know this is the metadata lookup companion to jira_create_issue. It could have explicitly stated 'Use this before creating an issue' but the context is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_issueA
Get detailed information about a specific JIRA issue including comments and links. Optionally include subtasks and available workflow transitions.
Args: issue_key: The JIRA issue key (e.g., "PROJECT-123") include_subtasks: Also fetch subtasks (extra API call) include_transitions: Also fetch available workflow transitions (extra API call)
Returns: Issue details with comments, links, and optionally subtasks/transitions
| Name | Required | Description | Default |
|---|---|---|---|
| issue_key | Yes | ||
| include_subtasks | No | ||
| include_transitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that optional parameters cause 'extra API call(s)', which is useful behavioral context. However, with no annotations, it doesn't explicitly state read-only behavior, error handling, or permissions. It partially carries the transparency burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise purpose statement followed by Args and Returns sections. Every sentence earns its place, and the format makes it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with three parameters and no output schema, the description covers functionality, optional behaviors, and return contents. It lacks details on errors or permissions, but these are not critical for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions for parameters (0% coverage), so the description fully compensates. It explains issue_key with an example format and describes the boolean flags include_subtasks and include_transitions, adding clear meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get detailed information about a specific JIRA issue' with the specific resource (issue key) and what details are included (comments and links). It is distinguished from sibling tools like search, create, update, and transition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's purpose of retrieving a single issue by key is evident, but there is no explicit when-to-use vs. alternatives statement. The description implies usage for getting detailed info on a known issue, which is clear yet not as explicit as naming alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_search_issuesA
Search for JIRA issues using JQL (JIRA Query Language).
Returns a paginated result with total count. Use start_at to page through large result sets.
Args: jql: JQL query string (e.g., "project = PROJECT AND status = 'In Progress'") max_results: Maximum number of results to return (default: 50) start_at: Index of the first result (default: 0, for pagination)
Returns: Dict with issues array, total count, start_at, and max_results
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | ||
| start_at | No | ||
| max_results | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It discloses pagination behavior, total count, and the return dict structure. It also explains the role of start_at and max_results. While it doesn't explicitly state that this is a read-only operation, 'search' implies no side effects, and no annotations contradict this. This is good transparency for a read-oriented tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a short purpose statement, a note on pagination, and clear Args/Returns sections. It front-loads the main purpose and remains appropriately sized for the tool's simplicity, with no redundant sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description explains the return dict structure (issues array, total, start_at, max_results). All three parameters are documented with defaults and usage. For a simple tool with 3 parameters and no nested objects, the description covers all necessary information for an agent to invoke it correctly, including JQL format and pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so effectively: jql is described with an example, max_results explains its purpose and default, and start_at is described in the context of pagination. This adds meaning well beyond the schema's types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search for JIRA issues using JQL,' which clearly identifies the action (search) and resource (JIRA issues). This distinguishes it from sibling tools like jira_get_issue and jira_create_issue. The JQL specification further clarifies the search capability and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by explaining that JQL is used for querying and explicitly advises 'Use start_at to page through large result sets.' It gives a JQL example and explains pagination. However, it does not explicitly state when to use this tool versus alternatives like jira_get_issue, though the name and purpose make this obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_transition_issueA
Transition a JIRA issue to a new workflow state. Use jira_get_issue with include_transitions=True to see available transitions and their IDs.
Args: issue_key: The JIRA issue key (e.g., "PROJECT-123") transition_id: ID of the transition to execute (from jira_get_issue transitions) comment: Optional comment to add with the transition
Returns: Confirmation with issue key
| Name | Required | Description | Default |
|---|---|---|---|
| comment | No | ||
| issue_key | Yes | ||
| transition_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must disclose behavior. It explicitly mentions the state change and return confirmation, and points out the source of valid transition IDs. However, it omits permissions, failure modes, or reversibility, leaving some burden unmet for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with Args and Returns sections. Slightly longer than minimal but every sentence adds necessary information; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity and no output schema, the description provides the essential steps: how to obtain the transition ID and what is returned. It is complete enough for correct invocation, though it could mention error conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage. Description defines each parameter with examples (issue_key) and explains that transition_id comes from jira_get_issue transitions, and comment is optional. Fully compensates for schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'Transition a JIRA issue to a new workflow state' – clear verb, resource, target. Distinct from siblings (get, create, update) and references jira_get_issue for transition IDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs to 'Use jira_get_issue with include_transitions=True to see available transitions and their IDs', giving a concrete prerequisite and pointing to the correct sibling tool. Clarifies when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_update_issueA
Update fields on an existing JIRA issue. All field parameters are optional — only provided fields are updated. Optionally add a comment in the same call.
On Cloud instances, pass an accountId string for assignee (not a username).
Args: issue_key: The JIRA issue key (e.g., "PROJECT-123") summary: New summary (optional) description: New description (optional) assignee: New assignee — accountId on Cloud, username on Server/DC (optional) priority: New priority name (optional) labels: New labels list — replaces existing labels (optional) comment: Comment to add after update (optional) custom_fields: Dictionary of custom fields to update (optional)
Returns: Confirmation with issue key
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | ||
| comment | No | ||
| summary | No | ||
| assignee | No | ||
| priority | No | ||
| issue_key | Yes | ||
| description | No | ||
| custom_fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It explains partial-update behavior ('only provided fields are updated'), that labels replace existing ones, and that assignee format differs by platform (accountId on Cloud vs username on Server/DC). It does not mention potential destructive implications or permission requirements, but adds meaningful behavioral context beyond 'Update fields'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently organized: a one-sentence purpose, a few context notes, an Args list with per-parameter explanations, and a Returns line. It avoids fluff, though the parameter list is lengthy; however, this length is justified given the 0% schema coverage. It is front-loaded with the main behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given high complexity (8 parameters, no annotations, no output schema), this description is remarkably complete. It covers the purpose, all parameters, return value, and critical edge cases like Cloud/Server assignee differences and label replacement. It leaves little ambiguity for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates fully by listing each parameter with a meaningful explanation: issue_key with format example, assignee with platform-specific format, labels with replacement semantics, comment with timing, and custom_fields as a dictionary. This adds substantial meaning beyond the schema's bare type/title fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update fields on an existing JIRA issue' — a specific verb+resource that clearly distinguishes it from sibling tools like jira_create_issue, jira_search_issues, or jira_transition_issue. It further clarifies scope by noting all field parameters are optional and that a comment can be added in the same call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use it to update fields on an existing issue, with all fields optional, and notes the Cloud vs Server/DC distinction for assignee. However, it does not explicitly state when to use an alternative (e.g., jira_transition_issue for status changes) or provide exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
jira_create_issue - First observed
jira_get_create_meta - First observed
jira_get_issue - First observed
jira_search_issues - First observed
jira_transition_issue - First observed
jira_update_issue
TDQS
Scored across 6 tools
Each tool targets a distinct operation: search, get, create, update, transition, and metadata. No overlap exists; search returns lists while get returns single issue details, and transition handles workflow state changes.
All tool names follow the jira_verb_noun pattern consistently (jira_search_issues, jira_get_issue, etc.). The one compound verb 'get_create_meta' still follows the verb_noun convention.
Six tools cover the core Jira issue lifecycle without being excessive. The count is well-scoped for a focused issue management server.
Core CRUD and workflow transitions are covered: search, get, create, update, transition, and create metadata. Minor gaps include no delete issue or dedicated comment tool, but comments can be added via update/transition.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Remote MCP server to read and manage your Atako AI agents, messages, files, and integrations.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceA production-ready MCP server for JIRA integration that enables AI assistants to query JIRA issues and perform searches using natural language through JQL.1-
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for Atlassian Jira that enables AI assistants to manage issues, sprints, comments, and worklogs through natural language.MIT
- FlicenseBqualityCmaintenanceMCP server that connects AI assistants to your Jira site, supporting PAT or SSO authentication for search, read, create, update, and delete operations on issues.17507 npm-
- FlicenseNot gradedqualityBmaintenanceMCP server that provides AI assistants with access to Jira Cloud for issue management, search, and workflow operations.-