jira mcp server

Local 2025-09-01 00:38:10 0

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:

  • Tools for executing JQL queries
  • Tools for creating, editing, and deleting Jira tickets
  • Tools for listing Jira projects and statuses

Features

Jira Tools

execute_jql

  • Purpose: Run a JQL query.
  • Parameters: jql, number_of_results (default: 1).

get_only_ticket_name_and_description

  • Purpose: Fetch ticket name and description.
  • Parameters: jql, number_of_results (default: 1).

create_ticket

  • Purpose: Create a Jira ticket.
  • Parameters: project.key, summary, description, issuetype.name, parent (optional).

list_projects

  • Purpose: List Jira projects.
  • Parameters: number_of_results (default: 1).

delete_ticket

  • Purpose: Delete a ticket.
  • Parameters: issueIdOrKey.

edit_ticket

  • Purpose: Modify a ticket.
  • Parameters: issueIdOrKey, summary (optional), description (optional), labels (optional), parent (optional).

get_all_statuses

  • Purpose: Retrieve all statuses.
  • Parameters: number_of_results (default: 1).

assign_ticket

  • Purpose: Assign a ticket to a user.
  • Parameters: accountId, issueIdOrKey.

query_assignable

  • Purpose: Find assignable users in a project.
  • Parameters: project_key.

add_attachment

  • Purpose: Add an attachment to a ticket.
  • Parameters: issueIdOrKey, imageUrl.

Development

Install dependencies:

npm install

Build the server:

npm run build

For development with auto-rebuild:

npm run watch

Installation

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"
      }
    }
  }
}

Debugging

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"
  }
]