jira mcp server
A TypeScript-based server that enables interaction with Jira, providing tools to execute JQL queries, manage tickets, list projects and statuses through natural language.
A TypeScript-based server that enables interaction with Jira, providing tools to execute JQL queries, manage tickets, list projects and statuses through natural language.
Talk to Jira
This is a TypeScript-based MCP server that provides tools to interact with Jira. It demonstrates core MCP concepts by providing:
execute_jql
jql
, number_of_results
(default: 1).get_only_ticket_name_and_description
jql
, number_of_results
(default: 1).create_ticket
project.key
, summary
, description
, issuetype.name
, parent
(optional).list_projects
number_of_results
(default: 1).delete_ticket
issueIdOrKey
.edit_ticket
issueIdOrKey
, summary
(optional), description
(optional), labels
(optional), parent
(optional).get_all_statuses
number_of_results
(default: 1).assign_ticket
accountId
, issueIdOrKey
.query_assignable
project_key
.add_attachment
issueIdOrKey
, imageUrl
.Install dependencies:
npm install
Build the server:
npm run build
For development with auto-rebuild:
npm run watch
To use with Claude Desktop, add the server config:
On MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
On Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"Jira communication server": {
"command": "node",
"args": [
"/PATH_TO_THE_PROJECT/build/index.js"
],
"env": {
"JIRA_URL": "https://XXXXXXXX.atlassian.net",
"JIRA_API_MAIL": "Your email",
"JIRA_API_KEY": "KEY_FROM : https://id.atlassian.com/manage-profile/security/api-tokens"
}
}
}
}
Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector, which is available as a package script:
npm run inspector
The Inspector will provide a URL to access debugging tools in your browser.
[
{
"description": "Execute a JQL query on Jira on the api /rest/api/3/search",
"inputSchema": {
"properties": {
"jql": {
"description": "JQL query string",
"type": "string"
},
"number_of_results": {
"default": 1,
"description": "Number of results to return",
"type": "integer"
}
},
"required": [
"jql"
],
"type": "object"
},
"name": "execute_jql"
},
{
"description": "Get the name and description of the requested tickets on the api /rest/api/3/search",
"inputSchema": {
"properties": {
"jql": {
"description": "JQL query string",
"type": "string"
},
"number_of_results": {
"default": 1,
"description": "Number of results to return",
"type": "integer"
}
},
"required": [
"jql"
],
"type": "object"
},
"name": "get_only_ticket_name_and_description"
},
{
"description": "Create a ticket on Jira on the api /rest/api/3/issue",
"inputSchema": {
"properties": {
"description": {
"description": "The description of the ticket",
"type": "string"
},
"issuetype": {
"properties": {
"name": {
"description": "The name of the issue type",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"parent": {
"description": "The key of the parent ticket (the epic)",
"type": "string"
},
"project": {
"properties": {
"key": {
"description": "The project key",
"type": "string"
}
},
"required": [
"key"
],
"type": "object"
},
"summary": {
"description": "The summary of the ticket",
"type": "string"
}
},
"required": [
"project",
"summary",
"description",
"issuetype"
],
"type": "object"
},
"name": "create_ticket"
},
{
"description": "List all the projects on Jira on the api /rest/api/3/project",
"inputSchema": {
"properties": {
"number_of_results": {
"default": 1,
"description": "Number of results to return",
"type": "integer"
}
},
"type": "object"
},
"name": "list_projects"
},
{
"description": "Delete a ticket on Jira on the api /rest/api/3/issue/{issueIdOrKey}",
"inputSchema": {
"properties": {
"issueIdOrKey": {
"description": "The issue id or key",
"type": "string"
}
},
"required": [
"issueIdOrKey"
],
"type": "object"
},
"name": "delete_ticket"
},
{
"description": "Edit a ticket on Jira on the api /rest/api/3/issue/{issueIdOrKey}",
"inputSchema": {
"properties": {
"description": {
"description": "The description of the ticket",
"type": "string"
},
"issueIdOrKey": {
"description": "The issue id or key",
"type": "string"
},
"labels": {
"description": "The labels of the ticket",
"items": {
"type": "string"
},
"type": "array"
},
"parent": {
"description": "The key of the parent ticket (the epic)",
"type": "string"
},
"summary": {
"description": "The summary of the ticket",
"type": "string"
}
},
"required": [
"issueIdOrKey"
],
"type": "object"
},
"name": "edit_ticket"
},
{
"description": "Get all the status on Jira on the api /rest/api/3/status",
"inputSchema": {
"properties": {
"number_of_results": {
"default": 1,
"description": "Number of results to return",
"type": "integer"
}
},
"type": "object"
},
"name": "get_all_statuses"
},
{
"description": "Assign a ticket on Jira on the api /rest/api/3/issue/{issueIdOrKey}/assignee",
"inputSchema": {
"properties": {
"accountId": {
"description": "The account id of the assignee",
"type": "string"
},
"issueIdOrKey": {
"description": "The issue id or key",
"type": "string"
}
},
"required": [
"accountId",
"issueIdOrKey"
],
"type": "object"
},
"name": "assign_ticket"
},
{
"description": "Query assignables to a ticket on Jira on the api /rest/api/3/user/assignable/search?project={project-name}",
"inputSchema": {
"properties": {
"project_key": {
"description": "The id of the project to search",
"type": "string"
}
},
"required": [
"project_key"
],
"type": "object"
},
"name": "query_assignable"
},
{
"description": "Add an attachment from a public url to a ticket on Jira on the api /rest/api/3/issue/{issueIdOrKey}/attachments",
"inputSchema": {
"properties": {
"imageUrl": {
"description": "The URL of the image to attach",
"type": "string"
},
"issueIdOrKey": {
"description": "The issue id or key",
"type": "string"
}
},
"required": [
"issueIdOrKey",
"imageUrl"
],
"type": "object"
},
"name": "add_attachment_from_public_url"
},
{
"description": "Add an attachment to a ticket on Jira from a Confluence page by its name on the api /rest/api/3/issue/{issueIdOrKey}/attachments",
"inputSchema": {
"properties": {
"attachmentName": {
"description": "The name of the attachment",
"type": "string"
},
"issueIdOrKey": {
"description": "The issue id or key",
"type": "string"
},
"pageId": {
"description": "The page id",
"type": "string"
}
},
"required": [
"issueIdOrKey",
"pageId",
"attachmentName"
],
"type": "object"
},
"name": "add_attachment_from_confluence"
}
]