Skip to main content
Glama
kornbed

Jira MCP Server for Cursor

by kornbed
README.md
<!-- markdownlint-disable MD029 -->
# Jira MCP Server for Cursor

[![smithery badge](https://smithery.ai/badge/@kornbed/jira-mcp-server)](https://smithery.ai/server/@kornbed/jira-mcp-server)
A TypeScript-based MCP server that integrates with Jira, allowing Cursor to interact with Jira tickets.

<a href="https://glama.ai/mcp/servers/@kornbed/jira-mcp-server">
  <img width="380" height="200" src="https://glama.ai/mcp/servers/@kornbed/jira-mcp-server/badge" alt="Jira Server for Cursor MCP server" />
</a>

## Features

- List Jira tickets
- Get ticket details
- Get ticket comments
- Create new tickets
- Add comments to tickets
- Update ticket status
- Full MCP protocol support for Cursor integration

## Setup

### Installing via Smithery

To install Jira MCP Server for Cursor for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@kornbed/jira-mcp-server):

```bash
npx -y @smithery/cli install @kornbed/jira-mcp-server --client claude
```

1. Install dependencies:

```bash
npm install
```

2. Create a `.env` file based on `.env.example` and fill in your Jira credentials:

```env
JIRA_HOST=https://your-domain.atlassian.net
JIRA_EMAIL=your-email@example.com
JIRA_API_TOKEN=your-api-token
PORT=3000
```

To get your Jira API token:

1. Log in to <https://id.atlassian.com/manage/api-tokens>
2. Click "Create API token"
3. Copy the token and paste it in your `.env` file

## Development

Run the development server:

```bash
npm run dev
```

## Build and Run

Build the project:

```bash
npm run build
```

Start the server:

```bash
npm start
```

## Cursor Integration

To use this MCP server with Cursor, you have two options:

### Option 1: Command-based Integration (Recommended)

1. Build the project:

```bash
npm run build
```

2. Open Cursor's settings:
   - Click on the Cursor menu
   - Select "Settings" (or use the keyboard shortcut)
   - Navigate to the "Extensions" or "Integrations" section

3. Add the MCP configuration:

```json
{
  "mcpServers": {
    "jira": {
      "command": "node",
      "args": ["/path/to/jira-mcp-cursor/dist/server.js"]
    }
  }
}
```

Replace `/path/to/jira-mcp-cursor` with the absolute path to your project.

### Option 2: HTTP-based Integration (Alternative)

1. Start the MCP server (if not already running):

```bash
npm start
```

2. Open Cursor's settings:
   * Click on the Cursor menu
   * Select "Settings" (or use the keyboard shortcut)
   * Navigate to the "Extensions" or "Integrations" section

3. Add the MCP configuration:

```json
{
  "mcpServers": {
    "jira": {
      "url": "http://localhost:3000",
      "capabilities": [
        "list_tickets",
        "get_ticket",
        "get_comments",
        "create_ticket",
        "update_status",
        "add_comment"
      ]
    }
  }
}
}
```

## Using Jira in Cursor

After configuring the MCP server, you can use Jira commands directly in Cursor:

- `/jira list` - List your tickets
- `/jira view TICKET-123` - View ticket details
- `/jira comments TICKET-123` - Get ticket comments
- `/jira create` - Create a new ticket
- `/jira comment TICKET-123` - Add a comment
- `/jira status TICKET-123` - Update ticket status

## MCP Protocol Support

The server implements the Model-Client-Protocol (MCP) required by Cursor:

- Stdio communication for command-based integration
- Tool registration for Jira operations

## API Endpoints

### List Tickets

Retrieves a list of Jira tickets, optionally filtered by a JQL query.

**Endpoint:** `GET /api/tickets`

**Query Parameters:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| jql | string | No | Jira Query Language (JQL) string to filter tickets |

**Example Request:**

```http
GET /api/tickets?jql=project=TEST+AND+status=Open
```

**Example Response:**

```text
TEST-123: Example ticket (Open)
TEST-124: Another ticket (In Progress)
```

### Get Ticket

Retrieves detailed information about a specific ticket.

**Endpoint:** `GET /api/tickets/:id`

**Path Parameters:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| id | string | Yes | The Jira ticket ID (e.g., TEST-123) |

**Example Request:**

```http
GET /api/tickets/TEST-123
```

**Example Response:**

```text
Key: TEST-123
Summary: Example ticket
Status: Open
Type: Task
Description:
Detailed ticket description
```

### Get Ticket Comments

Retrieves all comments for a specific ticket.

**Endpoint:** `GET /api/tickets/:id/comments`

**Path Parameters:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| id | string | Yes | The Jira ticket ID (e.g., TEST-123) |

**Example Request:**

```http
GET /api/tickets/TEST-123/comments
```

**Example Response:**

```text
[3/20/2024, 10:00:00 AM] John Doe:
Comment text
---

[3/20/2024, 9:30:00 AM] Jane Smith:
Another comment
---
```

### Create Ticket

Creates a new Jira ticket.

**Endpoint:** `POST /api/tickets`

**Request Body:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| summary | string | Yes | The ticket summary |
| description | string | Yes | The ticket description |
| projectKey | string | Yes | The project key (e.g., TEST) |
| issueType | string | Yes | The type of issue (e.g., Task, Bug) |

**Example Request:**

```http
POST /api/tickets
Content-Type: application/json

{
  "summary": "New feature request",
  "description": "Implement new functionality",
  "projectKey": "TEST",
  "issueType": "Task"
}
```

**Example Response:**

```text
Created ticket: TEST-124
```

### Add Comment

Adds a new comment to an existing ticket.

**Endpoint:** `POST /api/tickets/:id/comments`

**Path Parameters:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| id | string | Yes | The Jira ticket ID (e.g., TEST-123) |

**Request Body:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| body | string | Yes | The comment text |

**Example Request:**

```http
POST /api/tickets/TEST-123/comments
Content-Type: application/json

{
  "body": "This is a new comment"
}
```

**Example Response:**

```text
Added comment to TEST-123
```

### Update Status

Updates the status of an existing ticket.

**Endpoint:** `POST /api/tickets/:id/status`

**Path Parameters:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| id | string | Yes | The Jira ticket ID (e.g., TEST-123) |

**Request Body:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| transitionId | string | Yes | The ID of the transition to perform |

**Example Request:**

```http
POST /api/tickets/TEST-123/status
Content-Type: application/json

{
  "transitionId": "21"
}
```

**Example Response:**

```text
Updated status of TEST-123
```

### Search Tickets

Searches for tickets across specified projects using text search.

**Endpoint:** `GET /api/tickets/search`

**Query Parameters:**

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| searchText | string | Yes | Text to search for in tickets |
| projectKeys | string | Yes | Comma-separated list of project keys to search in |
| maxResults | number | No | Maximum number of results to return (default: 50) |

**Example Request:**

```http
GET /api/tickets/search?searchText=login+bug&projectKeys=TEST,PROD&maxResults=10
```

**Example Response:**

```text
Found 2 tickets matching "login bug"

[TEST] TEST-123: Login page bug
Status: Open (Updated: 3/20/2024, 10:00:00 AM)
Description:
Users unable to login using SSO
----------------------------------------

[PROD] PROD-456: Fix login performance
Status: In Progress (Updated: 3/19/2024, 3:30:00 PM)
Description:
Login page taking too long to load
----------------------------------------
```

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose targeting specific Jira operations: list_tickets vs. search_tickets differentiate between personal assignment and project-wide text search, while get_ticket vs. get_comments separate ticket details from comment retrieval. No tools appear to overlap in functionality, making misselection unlikely.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern using snake_case (e.g., add_comment, create_ticket, get_comments). The verbs are appropriately chosen for each action (add, create, get, list, search, update), creating a predictable and readable naming convention throughout the set.

Tool Count5/5

With 7 tools, this server is well-scoped for Jira ticket management. Each tool earns its place by covering essential operations like creating, retrieving, listing, searching, updating status, and managing comments, without being overly sparse or bloated for the domain.

Completeness4/5

The tool set provides strong coverage for core Jira ticket workflows, including CRUD-like operations (create, get, list, update_status) and comment management. A minor gap exists in the lack of a tool to update ticket details beyond status (e.g., edit description or fields), but agents can work around this by creating new tickets or using comments.

Maintenance

ActivityInactive
ResponsivenessNo issues