A production-ready Model Context Protocol server that provides comprehensive JIRA operations to AI assistants.
- Overview
- What is MCP?
- Features
- Architecture
- Prerequisites
- Quick Start
- Installation
- Configuration
- Available Tools
- Usage Examples
- Deployment
- Security
- Troubleshooting
- Contributing
- Support
The JIRA MCP Server is a generic, production-ready tool that brings JIRA's full power to AI assistants through the Model Context Protocol. It enables natural language interaction with your JIRA instance while maintaining security, auditability, and organizational standards.
Compatible with:
- Claude Desktop - GUI application for AI assistance
- Claude Code - CLI tool for development workflows
- Any other MCP-compatible client
Before: Teams spend hours each week on repetitive JIRA tasks
- Creating similar issues repeatedly
- Searching for related tickets
- Bulk operations requiring manual UI clicks
- Context switching between code and JIRA
After: AI-assisted JIRA operations through natural language
- "Create a story for feature X with standard labels"
- "Close all QE tracker tickets as duplicates"
- "Find all open bugs assigned to my team"
- Seamless integration with development workflow
Result: 80-90% reduction in JIRA administrative overhead
Model Context Protocol (MCP) is an open standard that enables AI assistants to securely connect to external tools and data sources. Think of it as a universal adapter that lets Claude interact with your enterprise systems.
+-----------------+ +------------------+ +-------------+
| Claude | | | | |
| Desktop/Code | MCP | MCP Server | REST | Jira API |
| |<-------> | (This Project) |<------->| |
| | Protocol | | API | |
+-----------------+ +------------------+ +-------------+
↑ ↑
| |
| |
↓ ↓
+-----------------+ +------------------+
| Natural | | Uses jira CLI |
| Language: |<------->| for auth & API |
| | | |
| "Create a story | +------------------+
| in PROJECT-X |
| called 'Add |
| Feature Y'" |
+-----------------+
- Standardized: Works with any MCP-compatible client
- Secure: Uses your existing JIRA credentials
- Auditable: All operations logged in JIRA
- Extensible: Easy to add custom tools for your organization
-
Issue Management
-
Create issues (Story, Task, Bug, Epic, Sub-task)
-
Edit issue fields
-
Add labels and metadata
-
View detailed issue information
-
Search & Discovery
-
JQL (JIRA Query Language) search
-
Filter by project, status, assignee, labels
-
Structured result formatting
-
Issue Relationships
-
Link issues (blocks, relates to, duplicates, depends on)
-
Create issue hierarchies
-
Maintain traceability
-
Workflow Operations
-
Transition issues through workflow
-
Close issues with resolution
-
Add comments during transitions
-
Batch Operations
-
Close multiple issues at once
-
Bulk label updates
-
Mass transitions
- Generic Design: Works with any JIRA instance
- Project Agnostic: Supports all project types
- Error Handling: Comprehensive retry logic and error reporting
- Timeout Management: Configurable operation timeouts
- JSON Responses: Structured, parseable output
- CLI Integration: Leverages battle-tested jira-cli tool
+-----------------------------------------------------------------+
| User Layer |
| |
| +--------------+ +--------------+ +--------------+ |
| | Claude | | Other MCP | | Future | |
| | Desktop/code | | Clients | | Clients | |
| +------+-------+ +------+-------+ +------+-------+ |
| | | | |
+---------+--------------------+--------------------+-------------+
| | |
+--------------------+--------------------+
|
Model Context Protocol
|
+------------------------------+----------------------------------+
| MCP Server Layer |
| | |
| +---------------------------v----------------------------+ |
| | FastMCP Server (server.py) | |
| | | |
| | +-------------+ +-------------+ +-------------+ | |
| | |create_issue()| |search_issues| |link_issues()| | |
| | +-------------+ +-------------+ +-------------+ | |
| | | |
| | +-------------+ +-------------+ +-------------+ | |
| | |transition() | |add_labels() | |batch_close()| | |
| | +-------------+ +-------------+ +-------------+ | |
| | | |
| | +-------------+ | |
| | |view_issue() | 7 Tools Total | |
| | +-------------+ | |
| +--------------------------+------------------------------+ |
| | |
| run_jira_command() |
| | |
+-----------------------------+-----------------------------------+
|
+-----------------------------v------------------------------------+
| Integration Layer |
| |
| +----------------------------------------------------------+ |
| | jira-cli (ankitpokhrel/jira-cli) | |
| | | |
| | - Authentication management | |
| | - Secure credential storage | |
| | - REST API abstraction | |
| +---------------------------+------------------------------+ |
| | |
+------------------------------+-----------------------------------+
|
HTTPS/TLS
|
+------------------------------v-----------------------------------+
| JIRA Instance |
| |
| +-----------------------------------------------------------+ |
| | JIRA REST API | |
| | | |
| | - Issue operations - Search (JQL) | |
| | - Workflow transitions - Link management | |
| | - Field updates - Audit logging | |
| +-----------------------------------------------------------+ |
| |
+------------------------------------------------------------------+
- User Request: Natural language query to Claude Desktop
- Tool Selection: Claude determines appropriate MCP tool to use
- MCP Protocol: Tool invocation sent to MCP server via stdio
- Command Execution: Server translates to jira-cli command
- API Call: jira-cli makes authenticated REST API call to JIRA
- Response Processing: Parse and structure JIRA API response
- Result Return: JSON-formatted result back through MCP protocol
- User Presentation: Claude formats result for user in natural language
+-------------------------------------------------------------+
| Security Boundaries |
| |
| User Credentials ---> jira-cli Storage ---> JIRA API |
| (Initial Setup) (Encrypted) (TLS 1.2+) |
| |
| +------------------------------------------------------+ |
| | Permissions Model | |
| | | |
| | - Server runs with user's JIRA permissions | |
| | - No privilege escalation | |
| | - All operations audited in JIRA | |
| | - No credential storage in MCP server | |
| +------------------------------------------------------+ |
+-------------------------------------------------------------+
-
Python 3.10 or higher
python3 --version # Should be 3.10+ -
JIRA CLI (ankitpokhrel/jira-cli)
# macOS brew install ankitpokhrel/jira-cli/jira-cli # Linux curl -L https://github.com/ankitpokhrel/jira-cli/releases/download/v1.4.0/jira_1.4.0_linux_x86_64.tar.gz | tar xz sudo mv bin/jira /usr/local/bin/ # Windows scoop install jira-cli
-
JIRA Access
- Valid JIRA account
- API token or credentials
- Appropriate project permissions
- Claude Desktop - For AI-assisted JIRA operations
- Virtual Environment - Recommended for Python isolation
Get up and running in under 5 minutes.
Works with:
- Claude Desktop (GUI application)
- Claude Code (CLI tool)
# 1. Clone the repository
git clone https://github.com/rrasouli/jira-mcp-server.git ~/Documents/GitHub/jira-mcp-server
cd ~/Documents/GitHub/jira-mcp-server
# 2. Install everything (jira-cli + Python dependencies)
make install
# 3. Configure jira CLI
jira init
# 4. Run interactive setup
make setup
# 5. Restart Claude Desktop
# 6. Test it out
# Ask Claude: "Create a test story in PROJECT-X called 'MCP Integration Test'"cd ~/Documents/GitHub/jira-mcp-server
./setup.shThe setup will:
- Check prerequisites
- Create Python virtual environment
- Install dependencies
- Configure JIRA CLI
- Update Claude Desktop configuration
- Validate installation
The project includes a comprehensive Makefile for easy setup and development:
make help # Show all available commands
make status # Show installation status
make install # Full installation (jira-cli + Python deps)
make install-jira-cli # Install jira CLI only
make setup # Run interactive setup
make run # Start the MCP server
make test # Run tests
make lint # Check code style
make format # Format code with black
make clean # Clean build artifactsCommon Workflows:
# First-time setup
make install
make setup
# Development
make dev-setup # Install development dependencies
make test # Run tests
make lint # Check code style
make format # Format code
# Check what's installed
make statuscd ~/Documents/GitHub/jira-mcp-server
make install # Installs jira-cli and Python dependencies
make setup # Interactive configurationThe Makefile automatically detects your OS (macOS/Linux) and installs prerequisites accordingly.
cd ~/Documents/GitHub/jira-mcp-server
./setup.shFollow the interactive prompts to configure your JIRA instance and default project.
# 1. Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# 2. Install dependencies
pip install --upgrade pip
pip install mcp
# 3. Configure JIRA CLI
jira init
# Provide:
# - JIRA server URL (e.g., https://jira.company.com)
# - Authentication method (Personal Access Token recommended)
# - Your credentials
# 4. Make server executable
chmod +x server.py
# 5. Test the server
python server.py
# Server starts and waits for MCP protocol messagescd ~/jira-mcp-server
pip install -e .This installs the server as a Python package, making it available system-wide.
This JIRA MCP server works with both Claude Desktop (GUI) and Claude Code (CLI).
| Aspect | Claude Desktop | Claude Code |
|---|---|---|
| Config file | ~/Library/Application Support/Claude/claude_desktop_config.json |
~/.claude.json |
| Config scope | Global (all conversations) | Per-project (each directory) |
| MCP location | mcpServers at root level |
projects.<path>.mcpServers |
| Server name | Usually jira |
Can be jira or jira-prod |
| Restart required | Yes (restart app) | Yes (exit/restart in directory) |
Key difference: Claude Desktop has global MCP configuration, while Claude Code has per-project configuration. This means you must configure jira-prod separately for each working directory in Claude Code.
Settings are loaded in the following order:
- Environment variables (highest priority)
- Persistent config file
~/.jira-mcp-config.json - Default values (lowest priority)
Run the configuration wizard to save your settings persistently:
python server.py --configureThis creates ~/.jira-mcp-config.json with secure permissions (0600) containing:
- JIRA_URL: Your JIRA instance URL (required)
- JIRA_API_TOKEN: Your API token (required)
- JIRA_ENABLE_WRITE: Enable write operations - true/false (optional, default: false)
- JIRA_EMAIL: For legacy basic_auth only (optional, not needed for modern JIRA)
Benefits:
- Settings persist between sessions
- No need to set environment variables every time
- Secure file permissions (owner-only read/write)
- View current config:
python server.py --show-config - Reset config:
python config.py reset
You can override the persistent config with environment variables:
# Required
export JIRA_URL="https://jira.your-company.com"
export JIRA_API_TOKEN="your-api-token-here"
# Optional
export JIRA_ENABLE_WRITE="true" # Enable write operations (default: false)
# Legacy only (not needed for modern JIRA)
export JIRA_EMAIL="your.email@company.com" # Only for old basic_authAdd to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"jira": {
"command": "python",
"args": ["/absolute/path/to/jira-mcp-server/server.py"],
"env": {
"JIRA_URL": "https://jira.your-company.com",
"JIRA_DEFAULT_PROJECT": "YOUR_PROJECT"
}
}
}
}Important:
- Use absolute paths (not
~or$HOME) - Replace placeholders with your actual values
- Restart Claude Desktop after configuration changes
Configuration File Locations:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
IMPORTANT: Claude Code uses per-project MCP configuration, not global configuration.
Unlike Claude Desktop, Claude Code does not support global MCP server configuration. MCP servers are configured per-project in ~/.claude.json under each project's directory path.
Key differences:
- Claude Desktop: Uses
~/Library/Application Support/Claude/claude_desktop_config.json(global) - Claude Code: Uses
~/.claude.jsonwith per-projectmcpServerssections (no global option)
This means:
- MCP servers must be configured separately for each working directory
- Sessions in different directories won't share MCP server configuration
- You'll need to duplicate MCP server config across projects where you want it available
Claude Code stores project-specific settings in ~/.claude.json. Each project directory has its own mcpServers section:
{
"projects": {
"/Users/YOUR_USERNAME/Documents": {
"mcpServers": {
"jira-prod": {
"type": "stdio",
"command": "/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/venv/bin/python",
"args": [
"/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/server.py"
],
"env": {}
}
}
},
"/Users/YOUR_USERNAME/Documents/GitHub/my-project": {
"mcpServers": {
"jira-prod": {
"type": "stdio",
"command": "/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/venv/bin/python",
"args": [
"/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/server.py"
],
"env": {}
}
}
}
}
}To add jira-prod to a project:
- Find your project's section in
~/.claude.json - Locate the
mcpServersobject (will be empty{}if not configured) - Add the jira-prod configuration:
"mcpServers": {
"jira-prod": {
"type": "stdio",
"command": "/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/venv/bin/python",
"args": [
"/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/server.py"
],
"env": {}
}
}- Exit and restart Claude Code in that directory
To add jira-prod to multiple projects:
You'll need to duplicate the jira-prod configuration in each project's mcpServers section. For example:
{
"projects": {
"/Users/YOUR_USERNAME/Documents": {
"mcpServers": {
"jira-prod": { ... }
}
},
"/Users/YOUR_USERNAME/Documents/GitHub/project-a": {
"mcpServers": {
"jira-prod": { ... }
}
},
"/Users/YOUR_USERNAME/Documents/GitHub/project-b": {
"mcpServers": {
"jira-prod": { ... }
}
}
}
}Why per-project configuration?
- Different projects may need different MCP servers
- Isolates tool availability by working directory
- Prevents MCP servers from loading in irrelevant contexts
Verify MCP Server is Loaded:
# When you start Claude Code in a configured directory, you should see:
# "MCP server jira-prod initialized"
# In an unconfigured directory, jira-prod won't be availableAfter configuration:
- Exit Claude Code if running
- Restart Claude Code in the configured directory
- Ask Claude: "Create a test story in YOUR_PROJECT called 'MCP Integration Test'"
Cursor is a popular AI-powered code editor that supports MCP servers. This section provides complete setup instructions.
-
Get a Jira API Token:
- Visit https://id.atlassian.com/manage-profile/security/api-tokens
- Click "Create API token"
- Give it a descriptive name (e.g., "Cursor MCP Server")
- Copy and securely save the token
-
Know your paths:
# Find absolute path to jira-mcp-server cd ~/Documents/GitHub/jira-mcp-server pwd # Copy this path - you'll need it for configuration
Create or edit ~/.cursor/mcp.json (global configuration):
{
"mcpServers": {
"jira-prod": {
"command": "/absolute/path/to/jira-mcp-server/venv/bin/python",
"args": ["/absolute/path/to/jira-mcp-server/server.py"],
"env": {
"JIRA_URL": "https://your-instance.atlassian.net",
"JIRA_DEFAULT_PROJECT": "MYPROJECT",
"JIRA_EMAIL": "your-email@company.com",
"JIRA_API_TOKEN": "your-api-token-here"
}
}
}
}Example with specific paths:
{
"mcpServers": {
"jira-prod": {
"command": "/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/venv/bin/python",
"args": ["/Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/server.py"],
"env": {
"JIRA_URL": "https://your-company.atlassian.net",
"JIRA_DEFAULT_PROJECT": "MYPROJECT",
"JIRA_EMAIL": "your-email@company.com",
"JIRA_API_TOKEN": "your-api-token-here"
}
}
}
}Important Configuration Notes:
- Use absolute paths (e.g.,
/Users/username/...not~/...) - Replace
YOUR_USERNAMEwith your actual username - Replace
YOUR-PROJECT-KEYwith your default Jira project - Replace
your-email@company.comwith your Jira account email - Replace
your-api-token-herewith the API token from step 1 - The
JIRA_EMAILandJIRA_API_TOKENfields are required for Cursor
Alternative: Workspace-specific configuration
Create .cursor/mcp.json in your project directory for project-specific settings:
{
"mcpServers": {
"jira-prod": {
"command": "/absolute/path/to/jira-mcp-server/venv/bin/python",
"args": ["/absolute/path/to/jira-mcp-server/server.py"],
"env": {
"JIRA_URL": "https://your-company.atlassian.net",
"JIRA_DEFAULT_PROJECT": "MYPROJECT",
"JIRA_EMAIL": "your-email@company.com",
"JIRA_API_TOKEN": "your-token"
}
}
}
}- Restart Cursor completely (not just reload window)
- Verify the MCP server is connected:
- Look for a green indicator or "MCP" status in Cursor
- The server should show as "jira-prod" (connected)
- Test the integration:
- Ask Cursor: "Show me all open issues in [YOUR-PROJECT]"
- Ask Cursor: "Create a test task in [YOUR-PROJECT] called 'MCP Integration Test'"
Issue: MCP Server Shows as Red/Disconnected
Symptoms:
- Red circle next to "jira-prod" in Cursor
- Error:
401 Unauthorizedor authentication failures - Server appears as disconnected
Solutions:
-
Verify credentials are set in
envsection:"env": { "JIRA_URL": "https://your-instance.atlassian.net", "JIRA_DEFAULT_PROJECT": "PROJECT", "JIRA_EMAIL": "your-email@company.com", // Required! "JIRA_API_TOKEN": "your-token-here" // Required! }
-
Test credentials manually:
curl -u "your-email@company.com:your-api-token" \ "https://your-instance.atlassian.net/rest/api/3/myself"
Should return your user info, not a 401 error.
-
Verify absolute paths:
// CORRECT "command": "/Users/username/Documents/GitHub/jira-mcp-server/venv/bin/python" // WRONG - do not use these "command": "~/Documents/GitHub/jira-mcp-server/venv/bin/python" "command": "./venv/bin/python" "command": "python"
-
Check virtual environment exists:
ls -la /Users/YOUR_USERNAME/Documents/GitHub/jira-mcp-server/venv/bin/python # Should show the Python interpreter, not "No such file" -
Regenerate API token if expired:
- Visit https://id.atlassian.com/manage-profile/security/api-tokens
- Delete old token
- Create new token
- Update
~/.cursor/mcp.jsonwith new token - Restart Cursor
Issue: "Python jira library basic_auth mode failing with 401"
This is a known issue with the Python jira library's handling of redirects. The library may strip authentication headers on redirects, while curl preserves them.
Solution:
Ensure both JIRA_EMAIL and JIRA_API_TOKEN are set in the env section. This allows the server to use proper authentication headers.
Issue: Configuration file not found
If Cursor can't find ~/.cursor/mcp.json:
# Create the directory if it doesn't exist
mkdir -p ~/.cursor
# Create the configuration file
cat > ~/.cursor/mcp.json << 'EOF'
{
"mcpServers": {
"jira-prod": {
"command": "/absolute/path/to/venv/bin/python",
"args": ["/absolute/path/to/server.py"],
"env": {
"JIRA_URL": "https://your-instance.atlassian.net",
"JIRA_DEFAULT_PROJECT": "PROJECT",
"JIRA_EMAIL": "your-email@company.com",
"JIRA_API_TOKEN": "your-token"
}
}
}
}
EOFIssue: Changes not taking effect
- Ensure you saved
~/.cursor/mcp.json - Completely quit and restart Cursor (not just reload)
- Check Cursor's logs for MCP server initialization errors
~/.cursor/mcp.jsoncontains sensitive credentials- DO NOT commit this file to version control
- Add to
.gitignoreif using workspace-specific.cursor/mcp.json - File permissions should be user-only (600):
chmod 600 ~/.cursor/mcp.json
Once configured, you can use natural language in Cursor:
You: "Show me all open bugs in PROJECT assigned to me"
Cursor: [Uses jira-prod MCP server]
Found 3 open bugs:
- PROJECT-101: Bug description here
- PROJECT-102: Another bug description
- PROJECT-103: Yet another bug
You: "Create a story in PROJECT called 'Add new feature X'"
Cursor: [Uses jira-prod MCP server]
Created story PROJECT-150: Add new feature X
URL: https://your-instance.atlassian.net/browse/PROJECT-150
Create a new JIRA issue with comprehensive metadata.
Parameters:
summary(required): Issue titleissue_type(required): Story, Task, Bug, Epic, Sub-taskproject(optional): Project key, usesJIRA_DEFAULT_PROJECTif not specifieddescription(optional): Detailed issue descriptionlabels(optional): Comma-separated labels
Returns:
{
"issue_key": "PROJECT-1234",
"url": "https://jira.company.com/browse/PROJECT-1234",
"success": true
}Example Usage:
"Create a story in PLATFORM called 'Add OAuth2 authentication support'
with description 'Implement OAuth2 flow for third-party integrations'
and labels security,authentication,oauth"
Search for issues using JIRA Query Language (JQL).
Parameters:
jql(required): JQL query stringmax_results(optional): Maximum results to return (default: 50)
Returns:
{
"jql": "project = PLATFORM AND status = Open",
"count": 12,
"issues": [
{
"key": "PLATFORM-1234",
"summary": "Add OAuth2 support",
"status": "Open",
"assignee": "john.doe",
"url": "https://jira.company.com/browse/PLATFORM-1234"
}
]
}Example Queries:
"Search for all critical bugs assigned to me"
→ JQL: assignee = currentUser() AND priority = Critical AND type = Bug
"Find open issues in PLATFORM project with label 'security'"
→ JQL: project = PLATFORM AND status = Open AND labels = security
"Show all stories created this week"
→ JQL: type = Story AND created >= startOfWeek()
Create relationships between issues.
Parameters:
inward_issue(required): First issue keyoutward_issue(required): Second issue keylink_type(required): blocks, Related, Duplicate, Depend
Link Types:
blocks: outward_issue blocks inward_issueRelated: Issues are relatedDuplicate: outward_issue duplicates inward_issueDepend: inward_issue depends on outward_issue
Example:
"Link PLATFORM-1234 and PLATFORM-1235 where 1235 blocks 1234"
Move an issue through your workflow.
Parameters:
issue_key(required): Issue to transitionstate(required): Target state (In Progress, Done, Closed, etc.)resolution(optional): Resolution type (Done, Won't Fix, Duplicate, etc.)comment(optional): Comment to add during transition
Example:
"Close PLATFORM-1234 as Duplicate with comment 'Duplicate of PLATFORM-999'"
Add labels to existing issues.
Parameters:
issue_key(required): Issue to updatelabels(required): Comma-separated labels
Example:
"Add labels urgent,customer-facing,security to PLATFORM-1234"
Get detailed information about an issue.
Parameters:
issue_key(required): Issue to view
Returns: Full issue details including description, comments, attachments, and metadata.
Example:
"Show me details of PLATFORM-1234"
Close multiple issues at once with the same resolution.
Parameters:
issue_keys(required): Comma-separated issue keysresolution(optional): Resolution type (default: "Duplicate")comment(optional): Comment to add to all issues
Returns:
{
"total": 3,
"results": [
{
"issue_key": "QE-100",
"state": "Closed",
"resolution": "Duplicate",
"success": true
}
]
}Example:
"Close QE-100, QE-101, QE-102 as duplicates with comment 'Consolidated into QE-99'"
The same MCP server works with both clients, but the user experience differs:
- Open Claude Desktop application
- Start a conversation
- Ask in natural language:
You: "Create a story in MYTEAM project called 'Add RuntimeClass support for Windows workloads'
with labels windows,winc,runtimeclass"
Claude: I'll create that story for you using the JIRA MCP server.
[Uses create_issue() tool]
Created story MYTEAM-1234: Add RuntimeClass support for Windows workloads
View at: https://issues.myorg.com/browse/MYTEAM-1234
Labels: windows, winc, runtimeclass
$ claude
You: Create a story in MYTEAM project called 'Add RuntimeClass support'
Claude: I'll create that JIRA story for you.
[MCP server jira initialized]
[Uses jira.create_issue tool]
Created story MYTEAM-1234: Add RuntimeClass support
URL: https://issues.myorg.com/browse/MYTEAM-1234
You: Now search for all open issues in MYTEAM with label 'windows'
Claude: Searching JIRA...
[Uses jira.search_issues tool]
Found 12 open issues:
- MYTEAM-1234: Add RuntimeClass support
- MYTEAM-1230: Fix container isolation
- MYTEAM-1225: Update Windows node configuration
...Key Differences:
- Claude Desktop: Graphical interface, richer formatting, persistent conversations
- Claude Code: Terminal-based, faster for developers, integrates with shell workflow
Both support the same MCP tools and capabilities!
User: "Create an epic for Q2 authentication improvements in PLATFORM project"
Claude uses: create_issue()
{
"summary": "Q2 Authentication Improvements",
"issue_type": "Epic",
"project": "PLATFORM",
"description": "Enhance authentication system with OAuth2, 2FA, and session management",
"labels": "q2-2024,security,authentication"
}Follow-up: "Create three subtasks: OAuth2 implementation, 2FA setup, and session timeout"
Claude creates three linked subtasks automatically.
User: "Find all open QE tracker tickets and close them as duplicates"
Claude workflow:
- Uses
search_issues()with JQL:type = "QE Tracker" AND status = Open - Extracts issue keys from results
- Uses
batch_close_issues()to close all at once
Result: 15 tickets closed in seconds instead of manual UI clicks.
User: "Find all high-priority bugs in PLATFORM project and move them to In Progress"
Claude workflow:
- Search:
project = PLATFORM AND priority = High AND type = Bug - For each issue:
transition_issue(key, "In Progress") - Add label:
add_labels(key, "sprint-12")
User: "Create a release tracker for v2.5.0 with standard release tasks"
Custom tool (you can add this):
@mcp.tool()
def create_release_tracker(version: str, target_date: str) -> str:
"""Create standardized release tracker with subtasks"""
# Create epic
epic = create_issue(f"Release {version}", "Epic", description=f"Release {version} - Target: {target_date}")
# Create standard subtasks
tasks = [
"Code freeze",
"QE testing complete",
"Documentation review",
"Release notes published",
"Production deployment"
]
for task in tasks:
subtask = create_issue(task, "Sub-task", ...)
link_issues(epic["issue_key"], subtask["issue_key"], "Related")See DEPLOYMENT_GUIDE.md for comprehensive deployment strategies.
Option 1: Internal Git Repository (Recommended)
git remote add origin https://github.com/your-org/jira-mcp-server.git
git push -u origin mainOption 2: Internal PyPI
python -m build
twine upload --repository-url https://pypi.your-org.com dist/*Option 3: Shared Network Drive
cp -r ~/jira-mcp-server /shared/network/tools/Option 4: Container Registry
docker build -t your-registry.com/jira-mcp-server:1.0.0 .
docker push your-registry.com/jira-mcp-server:1.0.0** Recommended: jira-cli Credential Storage**
- Credentials stored securely by jira-cli
- System keychain integration (macOS Keychain, Windows Credential Manager, Linux Secret Service)
- No credentials in MCP server code or configuration
** Not Recommended: Environment Variables**
- Credentials visible in process list
- Risk of accidental commit to version control
- Less secure than keychain storage
The MCP server operates with your JIRA permissions:
- Cannot escalate privileges
- Respects project-level permissions
- Subject to JIRA's security policies
- All operations audited in JIRA
- Rotate Regularly: Change API tokens every 90 days
- Least Privilege: Grant minimum required permissions
- Never Commit: Add tokens to
.gitignore - Audit Access: Review JIRA audit logs monthly
- Revoke Unused: Delete tokens when no longer needed
- All JIRA API calls over HTTPS/TLS 1.2+
- Certificate validation enforced
- No proxy credential storage
- Respects corporate network policies
Problem: jira-cli not installed or not in PATH
Solution:
# macOS
brew install ankitpokhrel/jira-cli/jira-cli
# Linux
curl -L https://github.com/ankitpokhrel/jira-cli/releases/latest/download/jira_linux_x86_64.tar.gz | tar xz
sudo mv bin/jira /usr/local/bin/
# Verify installation
jira versionProblem: JIRA API call taking longer than 30 seconds
Solution: Increase timeout in server.py:
# Line 48
timeout=60 # Increase from 30 to 60 secondsFor slow JIRA instances, consider 90-120 second timeout.
Problem: No default project configured
Solution:
# Set in Claude Desktop config
export JIRA_DEFAULT_PROJECT="YOUR_PROJECT"
# Or always specify project in requests
"Create a story in PLATFORM called ..."Problem: JIRA credentials invalid or expired
Solution:
# Reconfigure jira-cli
jira init
# Test authentication
jira issue list --jql "assignee = currentUser()"
# Regenerate API token if using PAT
# Visit: https://your-jira.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokensProblem: Server process not starting or crashing
Solution:
# Test server directly
cd ~/jira-mcp-server
source venv/bin/activate
python server.py
# Check for errors in output
# Verify Python version
python --version # Must be 3.10+
# Reinstall dependencies
pip install --upgrade mcpProblem: Configuration not loaded correctly
Solution:
- Verify config file location (see Configuration section)
- Check JSON syntax (use jsonlint.com)
- Ensure absolute paths (not
~or$HOME) - Restart Claude Desktop completely
- Check Claude Desktop logs:
- macOS:
~/Library/Logs/Claude/ - Linux:
~/.config/Claude/logs/
- macOS:
Problem: MCP server works in one directory but not others
Cause: Claude Code uses per-project MCP configuration, not global configuration. The server is only available in directories where you've configured it.
Solution:
-
Check which directory you're in:
pwd # Example: /Users/yourname/Documents/GitHub/release
-
Edit
~/.claude.jsonand find your project's section:# Open the config file code ~/.claude.json # or your editor of choice # Find the section for your current directory # Look for: "/Users/yourname/Documents/GitHub/release": {
-
Add jira-prod to that project's
mcpServers:"/Users/yourname/Documents/GitHub/release": { "mcpServers": { "jira-prod": { "type": "stdio", "command": "/Users/yourname/Documents/GitHub/jira-mcp-server/venv/bin/python", "args": [ "/Users/yourname/Documents/GitHub/jira-mcp-server/server.py" ], "env": {} } } }
-
Exit and restart Claude Code in that directory
To make jira-prod available everywhere:
Unfortunately, there's no global MCP configuration for Claude Code. You must add the jira-prod configuration to each project's mcpServers section in ~/.claude.json.
Common directories to configure:
- Your home directory:
/Users/yourname/Documents - Each Git repository you work in
- Any worktree directories
Example multi-project configuration:
{
"projects": {
"/Users/yourname/Documents": {
"mcpServers": {
"jira-prod": { ... }
}
},
"/Users/yourname/Documents/GitHub/repo-a": {
"mcpServers": {
"jira-prod": { ... }
}
},
"/Users/yourname/Documents/GitHub/repo-b": {
"mcpServers": {
"jira-prod": { ... }
}
}
}
}See CONTRIBUTING.md for development guidelines.
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Make changes and test thoroughly
- Commit:
git commit -m "Add amazing feature" - Push:
git push origin feature/amazing-feature - Open Pull Request
@mcp.tool()
def your_custom_tool(param1: str, param2: int) -> str:
"""
Description of your custom tool.
Args:
param1: Description of param1
param2: Description of param2
Returns:
JSON string with structured result
"""
# Your implementation
result = run_jira_command(["your", "command", "here"])
return json.dumps({
"success": result["success"],
"data": result["output"]
})- JIRA CLI Documentation: https://github.com/ankitpokhrel/jira-cli
- MCP Protocol Specification: https://modelcontextprotocol.io
- JIRA REST API Reference: https://developer.atlassian.com/cloud/jira/platform/rest/v3/
Report bugs or request features at: https://github.com/rrasouli/jira-mcp-server/issues
This project is licensed under the GNU General Public License v2.0 - see the LICENSE file for details.
- Initial release
- 7 core JIRA tools
- Generic JIRA instance support
- FastMCP integration
- Automated setup script
- Comprehensive documentation
- Built with FastMCP
- Uses jira-cli for JIRA integration
- Implements Model Context Protocol
Questions? Reach out to the MCP team at mcp-support@your-company.com