www-jira-mcp
MCP (Model Context Protocol) server providing Jira Server/Data Center integration — issue management, search, projects, comments, transitions, links, worklogs, attachments, and more.
Gives AI assistants (Qoder, Claude Desktop, Cursor, etc.) the ability to read and write Jira issues and projects through a single MCP server with 47 tools, 5 resources, and 3 prompt templates.
Note: This server targets Jira Server/Data Center only (REST API v2). Jira Cloud is not supported.
System Requirements
| Requirement | Version |
|---|---|
| uv | Install guide |
| Python | 3.10+ (managed automatically by uv) |
| Jira | Server 7.0+ / Data Center 8.0+ |
Install uv
macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
macOS (Homebrew):
brew install uv
Installation
Option 1: Run directly with uvx (recommended)
No clone needed. Runs from PyPI. Updates automatically on each run:
uvx www-jira-mcp
MCP client config:
{
"mcpServers": {
"www-jira-mcp": {
"command": "uvx",
"args": ["www-jira-mcp"],
"env": {
"JIRA_URL": "https://jira.example.com",
"JIRA_PERSONAL_TOKEN": "your-pat-here"
}
}
}
}
Option 2: Install as a uv tool
# From PyPI
uv tool install www-jira-mcp
# After installation, the command is available globally:
www-jira-mcp
To update or reinstall:
uv tool upgrade www-jira-mcp
# or force reinstall latest:
uv tool install --force www-jira-mcp@latest
Option 3: Run from local source (for development)
git clone https://github.com/naifs/www-jira-mcp.git
cd www-jira-mcp
uv sync
uv run www-jira-mcp
To update:
git pull && uv sync
MCP client config (local source):
{
"mcpServers": {
"www-jira-mcp": {
"command": "uv",
"args": [
"run",
"--project",
"/absolute/path/to/www-jira-mcp",
"www-jira-mcp"
],
"env": {
"JIRA_URL": "https://jira.example.com",
"JIRA_PERSONAL_TOKEN": "your-pat-here"
}
}
}
}
Option 4: Install from built wheel
cd /path/to/www-jira-mcp
uv build
uv tool install dist/*.whl
Authentication
The server supports two authentication methods for Jira Server/Data Center:
| Method | Environment Variables |
|---|---|
| Personal Access Token (PAT) (recommended) | JIRA_PERSONAL_TOKEN |
| Basic Auth (username + password) | JIRA_USERNAME + JIRA_PASSWORD |
PAT takes priority if both are configured. JIRA_API_TOKEN is accepted as a legacy fallback for JIRA_PASSWORD.
Environment Variables
| Variable | Description | Default |
|---|---|---|
JIRA_URL |
Jira Server/DC base URL (required) | — |
JIRA_PERSONAL_TOKEN |
Personal Access Token for PAT auth | — |
JIRA_USERNAME |
Username for Basic auth | — |
JIRA_PASSWORD |
Password for Basic auth | — |
JIRA_SSL_VERIFY |
Verify TLS certificates (system trust store via truststore) |
true |
JIRA_SSL_PATH |
Optional path to extra CA certs (PEM file or OpenSSL-hashed dir), loaded in addition to the system trust store | — |
JIRA_TIMEOUT |
HTTP request timeout in seconds | 30 |
JIRA_MAX_RESULTS |
Default max results per query (1..100) | 50 |
JIRA_READ_ONLY |
Disable write tools (true/false) |
true |
JIRA_PROJECTS_FILTER |
Comma-separated project keys to filter searches | — |
JIRA_HTTP_PROXY |
HTTP proxy URL | — |
JIRA_HTTPS_PROXY |
HTTPS proxy URL | — |
JIRA_DEBUG |
Enable debug logging (1/true/yes/on) |
false |
JIRA_PROMPTS_DIR |
Directory with custom prompt definitions (JSON) | — |
JIRA_MCP_TRANSPORT |
MCP transport: stdio or http (multi-user mode) |
stdio |
JIRA_MCP_HOST |
Bind host for HTTP transport | 127.0.0.1 |
JIRA_MCP_PORT |
Bind port for HTTP transport | 8080 |
JIRA_RATE_LIMIT_TOKENS |
Client-side rate limit, requests per second | 10.0 |
JIRA_RATE_LIMIT_BURST |
Client-side rate limit burst size | 20 |
JIRA_FIELD_TARGET_START |
Custom field ID for Target start (jira_sync_issue_dates) |
— |
JIRA_FIELD_TARGET_END |
Custom field ID for Target end (jira_sync_issue_dates) |
— |
Naming pattern: JIRA_FIELD_<FIELDNAME> — use this pattern for custom field overrides (e.g., JIRA_FIELD_TARGET_START for the Target start field).
Resilience
All API requests go through a client-side token-bucket rate limiter and an
automatic retry with exponential backoff on 429 / 5xx responses
(respects the Retry-After header). Failures are returned to the AI as
structured errors with error_code, suggested_action, and retryable hints.
Provided Tools
Read Tools (25)
jira_search— Search issues using JQL or plain textjira_get_issue— Get issue by key or URLjira_get_comments— Get issue commentsjira_get_transitions— Get available status transitions for an issuejira_get_projects— List projectsjira_get_project— Get project by keyjira_get_link_types— Get available issue link typesjira_get_attachments— List issue attachmentsjira_download_attachment— Download an attachment by ID to disk (uses attachment metadata API for reliable downloads)jira_get_worklogs— Get issue worklogsjira_get_watchers— Get issue watchersjira_get_priorities— List prioritiesjira_get_statuses— List statuses (globally, or per project viaproject_key)jira_get_resolutions— List resolutionsjira_get_fields— List fields (system + custom)jira_get_issue_types— List issue types (all or per project)jira_get_boards— List Agile boardsjira_get_board— Get board details by IDjira_get_sprints— List sprints for a boardjira_get_sprint— Get sprint detailsjira_get_sprint_issues— Get issues in a sprintjira_search_user— Search for usersjira_get_current_user— Get current authenticated userjira_mcp_info— Server configuration guide (env vars, auth status, tool catalog)jira_mcp_status— Server status and Jira connectivity check
Write Tools (20) — only when JIRA_READ_ONLY=false
jira_create_issue— Create a new issue. Useextra_fieldsfor custom fields (dict or JSON string):{"customfield_10101": "EPIC-KEY", "components": [{"name": "..."}]}jira_update_issue— Update an existing issue. Usefieldsparameter with JSON:{"summary": "...", "customfield_12345": value, "components": [{"name": "..."}]}. For Epic Link, use{"customfield_10101": "EPIC-KEY"}jira_delete_issue— Delete an issue (⚠️ destructive, requires permissions)jira_assign_issue— Assign an issue to a user by usernamejira_add_comment— Add a commentjira_update_comment— Update a commentjira_delete_comment— Delete a commentjira_transition_issue— Transition by ID or name. Before using: calljira_get_transitions()to see available transitions and required fields (e.g., resolution for "Cancel"). Usefieldsparameter for mandatory fields:{"resolution": {"id": "12345"}}jira_sync_issue_dates— Fill Target start/end from sprint dates (epics roll up children). Uses Jira Agile API for reliable epic children discovery. Safety-first:dry_rundefaults to true — preview, report the changes to the user, and apply (dry_run=false) only after explicit approval. SetJIRA_FIELD_TARGET_START/JIRA_FIELD_TARGET_ENDif your Jira uses custom field IDsjira_link_issues— Create a link between two issues. Usejira_get_link_types()to find available link types (e.g., "Blocks", "Relates", "Parent")jira_delete_link— Delete an issue linkjira_upload_attachment— Upload a file to an issuejira_delete_attachment— Delete an attachmentjira_add_worklog— Add a worklog entryjira_add_watcher— Add a watcher by usernamejira_remove_watcher— Remove a watcher by usernamejira_create_sprint— Create a sprint on a board (requires board_id)jira_update_sprint— Update sprint name, goal, dates, or statejira_move_issues_to_sprint— Move issues into a sprint (by sprint_id)jira_move_issues_to_backlog— Remove issues from sprint to backlog
Multi-User HTTP Mode
By default the server runs over stdio with a single credential set taken
from environment variables. Set JIRA_MCP_TRANSPORT=http to serve multiple
users over the streamable-HTTP transport:
JIRA_MCP_TRANSPORT=http JIRA_MCP_PORT=8080 uvx www-jira-mcp
In HTTP mode each request may carry its own Jira credentials as headers
(same names as the env vars): JIRA_URL, JIRA_PERSONAL_TOKEN,
JIRA_USERNAME, JIRA_PASSWORD (or JIRA_API_TOKEN). Per-user HTTP clients
are cached for 1 hour. When headers are absent, the server falls back to the
environment configuration.
MCP Resources
Resources are read-only reference data that the AI can access by URI — like lightweight cached endpoints. They are useful when the AI needs context (e.g. available priorities, project list) before calling tools.
| URI | Description | Example Output |
|---|---|---|
jira://projects |
List of projects | PROJ: My Project |
jira://issuetypes |
Issue types (incl. sub-tasks) | Bug: A problem... |
jira://priorities |
Priority levels | High: Major... |
jira://statuses |
Statuses with categories | In Progress [In Progress]: ... |
jira://fields |
System + custom fields | summary — Summary [string] |
How it works: When the MCP client connects, it discovers available resources. The AI can then read jira://projects to get the list of projects, for example — without calling jira_get_projects tool. This is useful for providing background context.
When to use Resources vs Tools:
- Resources — for reference data that rarely changes (priorities, statuses, fields). The AI reads them once and uses as context.
- Tools — for actions and dynamic data (search, create issue, get specific issue). Always use tools for anything that depends on parameters.
MCP Prompts
Prompts are reusable templates that pre-fill common workflows. The user invokes a prompt by name with parameters, and gets back a ready-to-use instruction for the AI.
| Prompt | Parameters | Description |
|---|---|---|
create_bug |
summary, steps, expected, actual |
Structured bug report template |
jql_search |
project, status, assignee, priority, issuetype |
JQL query builder |
daily_standup |
project, assignee |
Daily standup report generator |
Examples
create_bug prompt:
User invokes: create_bug(summary="Login fails on mobile", steps="1. Open app\n2. Tap Login", expected="Redirect to dashboard", actual="Error 500")
AI receives:
Create a Jira bug with the following details:
Summary: Login fails on mobile
Description:
*Steps to Reproduce:*
1. Open app
2. Tap Login
*Expected Result:*
Redirect to dashboard
*Actual Result:*
Error 500
Use the `jira_create_issue` tool with `issuetype='Bug'`. Optionally set `extra_fields` for custom fields like Epic Link or components.
jql_search prompt:
User invokes: jql_search(project="PROJ", status="In Progress", assignee="me")
AI receives:
Run the following JQL query using the `jira_search` tool:
project = "PROJ" AND status = "In Progress" AND assignee = currentUser()
If the results are too broad, help me refine the query.
daily_standup prompt:
User invokes: daily_standup(project="PROJ")
AI receives:
Generate a daily standup report for me.
1. Run `jira_search` with JQL: `project = "PROJ" AND assignee = currentUser() AND updated >= -1d`
2. Optionally call `jira_get_transitions()` on key issues to see what moved
2. Summarize: what was done, what's in progress, what's blocked.
3. List any issues that transitioned to Done in the last day.
Quick Verification
# Run the server
JIRA_URL=https://jira.example.com JIRA_PERSONAL_TOKEN=your-token \
uv run www-jira-mcp
Troubleshooting
uv not found
Install uv and reopen your terminal. See System Requirements.
Dependencies missing
uv sync
MCP tools not appearing in client
- Check that the MCP client config JSON is valid.
- Ensure the
--projectpath is absolute and correct. - Reload the MCP client after config changes.
- Check
JIRA_DEBUG=truefor detailed logs.
Authentication error
- Verify
JIRA_URLpoints to your Server/DC instance (not*.atlassian.net). - For PAT: ensure the token is valid and not expired.
- For Basic auth: ensure both
JIRA_USERNAMEandJIRA_PASSWORDare set.
Wrong project path in config
The --project argument must point to the root directory of www-jira-mcp (where pyproject.toml is located), not to the src/ subdirectory.
License
MIT
Metadata
Release files for www-jira-mcp 1.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| www_jira_mcp-1.1.5.tar.gz | 168.3 kB | With provenance | Details for www_jira_mcp-1.1.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| www_jira_mcp-1.1.5-py3-none-any.whl | Python 3 | none | any | Details for www_jira_mcp-1.1.5-py3-none-any.whl |
Total release size: 269.1 kB
Release files / www_jira_mcp-1.1.5.tar.gz
| Download URL | www_jira_mcp-1.1.5.tar.gz |
|---|---|
| Size | 168.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c53b7f86a844d9f387145a222aabaf9ed3f7bd7394f025db3ff73518002f3447
|
|
BLAKE2b-256 checksum How to use checksums |
39c16a6e0d403d9e32f3b7b226d810c7eeda97fdd1e632085cb6c0bd9914c237
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.
Transparency logRelease files / www_jira_mcp-1.1.5-py3-none-any.whl
| Download URL | www_jira_mcp-1.1.5-py3-none-any.whl |
|---|---|
| Size | 100.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8a8477ccd49c2fb855b98e9f859e877cbcc7f032b20c2510528f43cfdc9d7ca4
|
|
BLAKE2b-256 checksum How to use checksums |
1b2fb638ae4484cd64e00055a3a01584871d8275515be077bca8c59fc8688e6b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.
Transparency logSecurity for www-jira-mcp 1.1.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for www_jira_mcp-1.1.5.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.