MCP server for Jira Service Management — connect Claude Code, Claude Desktop, Cursor and other AI assistants to JSM
Project description
jira-service-desk-mcp
MCP (Model Context Protocol) server for Jira Service Management (formerly Jira Service Desk).
Connects AI assistants — Claude Code, Claude Desktop, Cursor, and others — to your JSM instance via Anthropic's MCP.
Built on top of atlassian-python-api and inspired by mcp-atlassian.
Features
| Category | Tools |
|---|---|
| Service Desks | List desks, get desk by ID, app info |
| Request Types | List types, get type details, get required fields |
| Customer Requests | Create, get, list my requests, get status |
| Comments | Add public/internal comments, list, get by ID |
| Customers | Create customer, list, add/remove from desk |
| Participants | List, add, remove request participants |
| Transitions | List available transitions, perform transition |
| Organizations | CRUD organizations, manage users, link to desks |
| Queues | List queues, list issues in queue |
| SLA | Get SLA info per request, by metric ID |
| Approvals | List approvals, get by ID, approve/decline |
| Attachments | Upload temp file, attach to request |
40 tools total. Write operations are gated by READ_ONLY_MODE.
Quick Start
Install from PyPI
pip install jira-service-desk-mcp
Or with uv:
uv pip install jira-service-desk-mcp
Or install from source:
pip install -e .
Configure
Copy .env.example to .env and fill in your credentials:
cp .env.example .env
Recommended shared format (same env shape as mcp-atlassian):
JIRA_URL=https://jira.your-company.com
JIRA_PERSONAL_TOKEN=<base64-encoded username:token>
Use a base64-encoded username:token string when you want one MCP config style
that works across both mcp-atlassian and jira-service-desk-mcp for
Atlassian Cloud. On non-Cloud/self-hosted Jira instances, JIRA_PERSONAL_TOKEN
now defaults to Bearer/PAT handling to avoid misclassifying base64-looking PATs.
If you intentionally need basic auth there, set JIRA_PERSONAL_TOKEN_MODE=basic.
Alternative: Atlassian Cloud (username + API token):
JIRA_URL=https://your-instance.atlassian.net
JIRA_USERNAME=your-email@example.com
JIRA_API_TOKEN=your-api-token
Generate an API token at https://id.atlassian.com/manage-profile/security/api-tokens.
Alternative: Server / Data Center (raw Personal Access Token):
JIRA_URL=https://jira.your-company.com
JIRA_PERSONAL_TOKEN=your-personal-access-token
The token can be either a raw PAT (bearer token), the full
Bearer <token> header value, or a base64-encoded username:api_token
string. The server strips Bearer automatically when present.
For non-Cloud/self-hosted Jira, JIRA_PERSONAL_TOKEN is treated as Bearer/PAT
by default, even if it looks like base64. This avoids accidental fallback to
Basic auth for PATs that happen to decode cleanly. If you need to force Basic
auth from JIRA_PERSONAL_TOKEN, set:
JIRA_PERSONAL_TOKEN_MODE=basic
Note:
JIRA_IS_CLOUDis auto-detected from the URL (.atlassian.net→ Cloud). Set it explicitly only if the heuristic is wrong for your instance.
Run
stdio (default — for Claude Code, Claude Desktop, Cursor, etc.):
jira-service-desk-mcp
SSE (for remote/web clients):
jira-service-desk-mcp --transport sse --port 8000
Claude Code Integration
The fastest way to connect JSM to Claude Code:
claude mcp add jira-service-desk -- jira-service-desk-mcp
With environment variables inline:
claude mcp add jira-service-desk \
-e JIRA_URL=https://jira.your-company.com \
-e JIRA_PERSONAL_TOKEN=<base64-encoded username:token> \
-- uvx jira-service-desk-mcp
To scope the server to your project only:
claude mcp add --scope project jira-service-desk \
-e JIRA_URL=https://jira.your-company.com \
-e JIRA_PERSONAL_TOKEN=<base64-encoded username:token> \
-- uvx jira-service-desk-mcp
Verify it works:
claude mcp list
Shared MCP Config
Add the same shape to ~/.claude.json, project-level .mcp.json,
claude_desktop_config.json, or .cursor/mcp.json:
{
"mcpServers": {
"mcp-atlassian": {
"type": "stdio",
"command": "uvx",
"args": ["mcp-atlassian"],
"env": {
"JIRA_URL": "https://jira.your-company.com",
"JIRA_PERSONAL_TOKEN": "<base64-encoded username:token>"
}
},
"jira-service-desk": {
"type": "stdio",
"command": "uvx",
"args": ["jira-service-desk-mcp"],
"env": {
"JIRA_URL": "https://jira.your-company.com",
"JIRA_PERSONAL_TOKEN": "<base64-encoded username:token>"
}
}
}
}
This mirrors the mcp-atlassian configuration style for Atlassian Cloud while
still allowing jira-service-desk-mcp to distinguish Cloud basic-auth tokens
from non-Cloud Bearer/PAT tokens.
Environment Variables
| Variable | Required | Description |
|---|---|---|
JIRA_URL |
Yes | Jira instance URL |
JIRA_USERNAME |
Cloud | Email for Atlassian Cloud |
JIRA_API_TOKEN |
Cloud | API token for Cloud auth |
JIRA_PERSONAL_TOKEN |
Recommended | Raw PAT or base64-encoded username:token |
JIRA_PERSONAL_TOKEN_MODE |
No | auto (default), pat, or basic override for JIRA_PERSONAL_TOKEN |
JIRA_PASSWORD |
— | Basic auth password (not recommended) |
JIRA_IS_CLOUD |
No | Auto-detected from URL; set explicitly to override |
JIRA_SSL_VERIFY |
No | true (default) or false |
READ_ONLY_MODE |
No | true to disable all write operations |
Available Tools
Service Desks
get_service_desk_info— Application infolist_service_desks— All accessible service desksget_service_desk— Service desk by ID
Request Types
list_request_types— Request types for a deskget_request_type— Specific request typeget_request_type_fields— Fields required for a request type
Customer Requests
create_customer_request— Create a new requestget_customer_request— Get request by keylist_my_customer_requests— Your requestsget_customer_request_status— Request status
Comments
add_request_comment— Add public or internal commentlist_request_comments— List comments on a requestget_request_comment— Get comment by ID
Customers
create_customer— Create customer accountlist_customers— List customers of a deskadd_customers_to_service_desk— Add customersremove_customers_from_service_desk— Remove customers
Participants
list_request_participants— List participantsadd_request_participants— Add participantsremove_request_participants— Remove participants
Transitions
list_customer_transitions— Available transitionsperform_transition— Execute a transition
Organizations
list_organizations— List organizationsget_organization— Organization by IDcreate_organization— Create organizationdelete_organization— Delete organizationadd_organization_to_service_desk— Link org to deskremove_organization_from_service_desk— Unlink orglist_users_in_organization— Users in orgadd_users_to_organization— Add users to orgremove_users_from_organization— Remove users from org
Queues
list_queues— Queues in a service desklist_issues_in_queue— Issues in a queue
SLA
get_request_sla— SLA info for a requestget_request_sla_by_id— Specific SLA metric
Approvals
list_approvals— Approvals for a requestget_approval— Approval by IDanswer_approval— Approve or decline
Attachments
upload_temporary_attachment— Upload temp fileattach_file_to_request— Attach to request
Architecture
src/mcp_jira_service_desk/
├── __init__.py # CLI entry point (click)
├── __main__.py # python -m support
├── config.py # Environment-based configuration
├── client.py # ServiceDeskClient — wraps atlassian-python-api
├── formatting.py # Human-readable formatting for API responses
└── server.py # FastMCP server with all tool definitions
- config.py — reads
JIRA_*env vars, determines auth type - client.py — thin typed wrapper around
atlassian.ServiceDesk, normalizes paginated responses - formatting.py — converts raw API dicts into markdown for LLM consumption
- server.py —
FastMCPinstance with@mcp.tool()decorators for each operation
Development
git clone https://github.com/CzSadykov/jira-service-desk-mcp.git
cd jira-service-desk-mcp
pip install -e ".[dev]"
pytest
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jira_service_desk_mcp-0.1.1.tar.gz.
File metadata
- Download URL: jira_service_desk_mcp-0.1.1.tar.gz
- Upload date:
- Size: 29.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d97160a9af8ca9c5f0dfabb04cb8328194671c8508d9b7e5346843fd81212c3e
|
|
| MD5 |
2ed758310c4c69c279ecb63118890a13
|
|
| BLAKE2b-256 |
bd8d867a8bf748ce4a529fffb949eda1a85e19670abc32c8a955b44f8582631f
|
Provenance
The following attestation bundles were made for jira_service_desk_mcp-0.1.1.tar.gz:
Publisher:
publish.yml on CzSadykov/jira-service-desk-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jira_service_desk_mcp-0.1.1.tar.gz -
Subject digest:
d97160a9af8ca9c5f0dfabb04cb8328194671c8508d9b7e5346843fd81212c3e - Sigstore transparency entry: 1123100518
- Sigstore integration time:
-
Permalink:
CzSadykov/jira-service-desk-mcp@b2616a9e67e6a6a4ac2b000b4eb45fd7c8a7ac24 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/CzSadykov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b2616a9e67e6a6a4ac2b000b4eb45fd7c8a7ac24 -
Trigger Event:
release
-
Statement type:
File details
Details for the file jira_service_desk_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: jira_service_desk_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f91dbeb4ed7d63bd9138d6ce378345b20aeae751458e07d71ad3397b0564ba90
|
|
| MD5 |
441328c603b39aa9777cbebe4ca3a513
|
|
| BLAKE2b-256 |
7f3f3f1ef03d113b07e30297e73364ac8f1df4b4dc7aaea35b26b34286650cd1
|
Provenance
The following attestation bundles were made for jira_service_desk_mcp-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on CzSadykov/jira-service-desk-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jira_service_desk_mcp-0.1.1-py3-none-any.whl -
Subject digest:
f91dbeb4ed7d63bd9138d6ce378345b20aeae751458e07d71ad3397b0564ba90 - Sigstore transparency entry: 1123100532
- Sigstore integration time:
-
Permalink:
CzSadykov/jira-service-desk-mcp@b2616a9e67e6a6a4ac2b000b4eb45fd7c8a7ac24 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/CzSadykov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b2616a9e67e6a6a4ac2b000b4eb45fd7c8a7ac24 -
Trigger Event:
release
-
Statement type: