A Model Context Protocol (MCP) server for interacting with self-hosted Jira instances using Personal Access Token (PAT) authentication.
- ✅ Personal Access Token authentication for self-hosted Jira
- ✅ Create, read, update, and delete Jira issues
- ✅ Search issues using JQL (Jira Query Language)
- ✅ Add and view comments
- ✅ Manage issue assignments
- ✅ List projects and issue types
- ✅ Transition issues between statuses
- ✅ Get current user information
- Node.js 18 or higher
- A self-hosted Jira instance (e.g., https://jira.domain.com)
- A Jira Personal Access Token
- Log in to your Jira instance (e.g., https://jira.domain.com)
- Click on your profile icon in the top right corner
- Select "Profile" or "Account Settings"
- Navigate to "Personal Access Tokens" or "Security"
- Click "Create token"
- Give your token a name (e.g., "MCP Server")
- Set an expiration date (optional but recommended)
- Click "Create"
- Copy the token immediately - you won't be able to see it again!
Direct usage with npx:
npx mcp-jira-serverOr install globally:
npm install -g mcp-jira-server- Clone the repository:
git clone https://github.com/edrich13/mcp-jira-server.git cd mcp-jira-server- Install dependencies:
npm install- Build the server:
npm run buildAdd the following to your Claude Desktop configuration file:
MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json
Option 1: Using npx (Recommended)
{ "mcpServers": { "jira": { "command": "npx", "args": ["-y", "mcp-jira-server"], "env": { "JIRA_BASE_URL": "https://jira.domain.com", "JIRA_PAT": "your-personal-access-token-here" } } } }Option 2: Using source build
{ "mcpServers": { "jira": { "type": "stdio", "command": "node", "args": ["/Users/edrich.rocha/.nvm/versions/node/v22.6.0/bin/mcp-jira-server"], "env": { "JIRA_BASE_URL": "https://jira.domain.com", "JIRA_PAT": "your-personal-access-token-here" } } } }Create or update .vscode/mcp.json in your workspace:
Option 1: Using npx (Recommended)
{ "servers": { "jira": { "command": "npx", "args": ["-y", "mcp-jira-server"], "env": { "JIRA_BASE_URL": "https://jira.domain.com", "JIRA_PAT": "your-personal-access-token-here" } } } }Option 2: Using source build
{ "servers": { "jira": { "command": "node", "args": ["/absolute/path/to/mcp-jira-server/build/index.js"], "env": { "JIRA_BASE_URL": "https://jira.domain.com", "JIRA_PAT": "your-personal-access-token-here" } } } }JIRA_BASE_URL: The base URL of your self-hosted Jira instance (e.g.,https://jira.domain.com)JIRA_PAT: Your Personal Access Token
Get details of a specific Jira issue by its key.
Parameters:
issueKey(string, required): The Jira issue key (e.g., "PROJ-123")
Example:
Get details for issue PROJ-123 Search for Jira issues using JQL (Jira Query Language).
Parameters:
jql(string, required): JQL query stringmaxResults(number, optional): Maximum number of results (default: 50)
Example:
Search for all open issues in project PROJ assigned to me Common JQL Examples:
project = PROJ AND status = Openassignee = currentUser() AND status != Donepriority = High AND created >= -7dreporter = john.doe AND status IN (Open, "In Progress")
Create a new Jira issue.
Parameters:
projectKey(string, required): Project keysummary(string, required): Issue title/summaryissueType(string, required): Issue type (e.g., "Bug", "Task", "Story")description(string, optional): Detailed descriptionpriority(string, optional): Priority level (e.g., "High", "Medium", "Low")assignee(string, optional): Username to assign tolabels(array, optional): Array of labelscomponents(array, optional): Array of component names
Example:
Create a new bug in project PROJ with summary "Login page not loading" and high priority Update an existing Jira issue.
Parameters:
issueKey(string, required): Issue key to updatesummary(string, optional): New summarydescription(string, optional): New descriptionassignee(string, optional): New assignee usernamepriority(string, optional): New prioritylabels(array, optional): New labels arraystatus(string, optional): New status (e.g., "In Progress", "Done")
Example:
Update issue PROJ-123 to set status to "In Progress" and assign to john.doe Add a comment to a Jira issue.
Parameters:
issueKey(string, required): Issue keycomment(string, required): Comment text
Example:
Add a comment to PROJ-123 saying "Fixed in latest deployment" Get all comments from a Jira issue.
Parameters:
issueKey(string, required): Issue key
List all available Jira projects.
Parameters: None
Example:
List all Jira projects Get details of a specific project.
Parameters:
projectKey(string, required): Project key
Get available issue types for a project.
Parameters:
projectKey(string, required): Project key
Assign a Jira issue to a user.
Parameters:
issueKey(string, required): Issue keyassignee(string, required): Username to assign to
Delete a Jira issue permanently.
Parameters:
issueKey(string, required): Issue key to delete
Get information about the currently authenticated user.
Parameters: None
npm run buildnpm run watchnpm run devAfter configuring the server, restart Claude Desktop or VS Code to load the new MCP server.
-
Test authentication:
Get my current Jira user information -
List projects:
Show me all Jira projects -
Search for issues:
Search for all issues assigned to me that are not done -
Create an issue:
Create a new task in project PROJ with summary "Test MCP integration"
- Verify the absolute path in your configuration
- Ensure the server is built (
npm run build) - Check that environment variables are set correctly
- Restart Claude Desktop or VS Code after configuration changes
- Verify your Personal Access Token is still valid
- Check that the token has not expired
- Ensure the token has appropriate permissions
- Verify the JIRA_BASE_URL is correct (no trailing slash)
- Check Jira server logs for detailed error messages
- Verify the Jira API is accessible from your machine
- Ensure your user account has necessary permissions
- Try accessing the REST API directly:
https://jira.domain.com/rest/api/2/myself
- "Cannot find module": Run
npm installandnpm run build - "Connection refused": Check if Jira server is accessible and URL is correct
- "Unauthorized": Verify your Personal Access Token
- "Issue type not found": Use
jira_get_issue_typesto see valid types for the project
- Never commit your Personal Access Token to version control
- Store tokens securely in configuration files with restricted permissions
- Use tokens with minimal required permissions
- Set expiration dates for tokens
- Rotate tokens regularly
- Monitor token usage in Jira's audit logs
This MCP server uses the Jira REST API v2. For more information about Jira's API:
- Jira REST API documentation:
https://your-jira-instance/rest/api/2/ - JQL syntax guide: Check your Jira instance documentation
MIT
For issues related to:
- MCP Server: Check the logs in Claude Desktop or VS Code
- Jira API: Refer to your self-hosted Jira documentation
- Authentication: Contact your Jira administrator
Contributions are welcome! Please ensure:
- Code follows TypeScript best practices
- All tools are properly documented
- Error handling is comprehensive
- Security best practices are followed