Skip to main content
Glama
README.md
# Jira MCP Server

A Model Context Protocol (MCP) server for Jira integration, enabling AI assistants to interact with Jira issues, comments, and custom fields through a standardized interface.

## Features

This MCP server provides the following tools:

| Tool | Description |
|------|-------------|
| `get_my_issues` | Get all issues currently assigned to you |
| `get_issue_details` | Get full details of a specific Jira issue |
| `add_comment` | Add a comment to a specified Jira issue |
| `get_my_work_summary` | Get a summary of issues you've worked on within a date range |
| `get_team_activity` | Get recent issue updates from configured team members |
| `get_project_components` | Get all available components for a Jira project |
| `update_issue_field` | Update supported custom fields on a Jira issue |
| `update_progress` | Update the Progress Update field with template-aware behavior |
| `create_issue` | Create a new issue in Jira with support for custom fields |
| `get_sprint_tasks` | Retrieve sprint tasks for the current week or next week |

## Prerequisites

- **Node.js**: v18.0.0 or higher
- **npm**: v8.0.0 or higher
- **Jira Cloud Account**: With API access enabled
- **Jira API Token**: Generated from your Atlassian account

## Installation

1. **Clone the repository:**
   ```bash
   git clone <repository-url>
   cd jira-mcp
   ```

2. **Install dependencies:**
   ```bash
   npm install
   ```

3. **Build the project:**
   ```bash
   npm run build
   ```

## Configuration

### Environment Variables

The server requires the following environment variables:

| Variable | Description | Example |
|----------|-------------|---------|
| `JIRA_BASE_URL` | Your Jira instance base URL | `https://your-org.atlassian.net` |
| `JIRA_USER_EMAIL` | Your Jira account email | `user@example.com` |
| `JIRA_API_TOKEN` | Jira API token ([Generate here](https://id.atlassian.com/manage-profile/security/api-tokens)) | `ATATT3xFfGF0...` |
| `JIRA_CURRENT_USER` | (Optional) Override current user for queries | `currentuser()` |
| `JIRA_TEAM_MEMBERS` | (Optional) Comma-separated list of team member emails | `user1@example.com,user2@example.com` |

## Usage

### Starting the Server

```bash
# Production
npm start

# Development (with hot reload)
npm run dev
```

### MCP Client Configuration

Add the server to your MCP client configuration:

```json
{
  "mcpServers": {
    "jira": {
      "command": "node",
      "args": ["/path/to/jira-mcp/dist/index.js"],
      "env": {
        "JIRA_BASE_URL": "https://your-org.atlassian.net",
        "JIRA_USER_EMAIL": "your-email@example.com",
        "JIRA_API_TOKEN": "your-api-token",
        "JIRA_TEAM_MEMBERS": "teammate1@example.com,teammate2@example.com"
      }
    }
  }
}
```

## Supported Custom Fields

The following custom fields can be updated using `update_issue_field`:

| Field Name | Field ID | Type | Description |
|------------|----------|------|-------------|
| Decision Needed | `customfield_15111` | Rich text (ADF) | Flag if a decision is required |
| Progress Update | `customfield_15112` | Rich text (ADF) | Weekly progress status |
| Decision Maker(s) | `customfield_15113` | User picker | Person responsible for decisions |
| Risks/Blockers | `customfield_15115` | Rich text (ADF) | Current risks or blockers |
| Completion Percentage | `customfield_15116` | Number | Progress percentage (0-100) |
| Health Status | `customfield_15117` | Select | Project health (On Track, At Risk, etc.) |

## API Reference

### get_my_issues

Returns all unresolved issues assigned to the current user.

**Parameters:** None

**Returns:** Array of issues with `key`, `summary`, `status`, `priority`, `updated`

---

### get_issue_details

Get full details of a specific issue.

**Parameters:**
- `issueKey` (string, required): The issue key (e.g., "PROJ-123")

**Returns:** Issue object with `key`, `summary`, `description`, `status`, `priority`, `assignee`, `reporter`, `created`, `updated`, `comments`

---

### add_comment

Add a comment to an issue.

**Parameters:**
- `issueKey` (string, required): The issue key
- `commentBody` (string, required): The comment text

**Returns:** `{ success: boolean, commentId: string, created: string }`

---

### get_my_work_summary

Get issues you've worked on within a date range.

**Parameters:**
- `startDate` (string, required): Start date in YYYY-MM-DD format
- `endDate` (string, required): End date in YYYY-MM-DD format

**Returns:** Array of issues with activity type

---

### get_team_activity

Get recent updates from team members.

**Parameters:**
- `timeframeDays` (number, optional): Days to look back (default: 7)

**Returns:** Array of activity items with `issueKey`, `teamMember`, `activityType`, `timestamp`, `summary`

---

### update_issue_field

Update a custom field on an issue.

**Parameters:**
- `issueKey` (string, required): The issue key
- `fieldNameOrId` (string, required): Field name or ID
- `value` (string | number | object, required): Value to set

**Returns:** `{ success: boolean, fieldId: string, fieldName: string }`

---

### update_progress

Update the Progress Update field with template awareness.

**Parameters:**
- `issueKey` (string, required): The issue key
- `refreshDate` (boolean, optional): Update date only, preserve content
- `weeklyUpdate` (string, optional): Weekly update text
- `delivered` (string, optional): What was delivered
- `whatsNext` (string, optional): Upcoming work

**Returns:** `{ success: boolean, updatedSections: string[], parsedExisting: object }`

The Progress Update field uses a structured template:
- ℹ️ **Update for week of [date]:** - Weekly status
- ✅ **What we've delivered so far:** - Accomplishments
- ❓ **What's next:** - Upcoming work

---

### get_project_components

Get all available components for a Jira project.

**Parameters:**
- `projectKey` (string, required): The project key (e.g., "TSSE")

**Returns:** `{ components: [{ id: string, name: string, description?: string }] }`

---

### create_issue

Create a new issue in Jira with support for standard and custom fields.

**Parameters:**
- `projectKey` (string, required): The project key (e.g., "TSSE")
- `issueType` (string, required): The issue type (e.g., "Epic", "Story", "Task", "Bug")
- `summary` (string, required): Issue summary/title
- `description` (string, optional): Issue description (plain text)
- `assignee` (string, optional): Assignee accountId or "currentuser()" for current user
- `priority` (string, optional): Priority name (e.g., "High", "Medium", "Low")
- `labels` (string[], optional): Array of labels to apply
- `duedate` (string, optional): Due date in YYYY-MM-DD format
- `components` (string[], optional): Array of component names
- `healthStatus` (string, optional): Health Status value (e.g., "On Track", "At Risk", "Off Track")
- `completionPercentage` (number, optional): Completion percentage (0-100)
- `decisionNeeded` (string, optional): Decision Needed field content
- `risksBlockers` (string, optional): Risks/Blockers field content
- `progressUpdate` (object, optional): Progress Update with `weeklyUpdate`, `delivered`, `whatsNext`
- `customFields` (object, optional): Additional custom fields as key-value pairs

**Returns:** `{ success: boolean, key: string, id: string, self: string }`

---

### get_sprint_tasks

Retrieve sprint tasks for the current week or next week. Sprint tasks are tagged with labels in the format MonDD-DD (e.g., Dec15-19 for December 15-19).

**Parameters:**
- `week` (enum, required): Which week to retrieve - `"this_week"` or `"next_week"`
- `scope` (enum, required): Scope of tasks - `"my_tasks"` for current user only, `"team_tasks"` for all team tasks

**Returns:**
```json
{
  "sprintLabel": "Dec15-19",
  "weekRange": { "monday": "2024-12-15", "friday": "2024-12-19" },
  "tasks": [{ "key": "PROJ-123", "summary": "...", "status": "...", "priority": "...", "assignee": "...", "updated": "..." }]
}
```

## Development

### Building

```bash
npm run build
```

### Project Structure

```
jira-mcp/
├── src/
│   ├── index.ts        # MCP server entry point and tool definitions
│   └── jira-client.ts  # Jira API client wrapper
├── dist/               # Compiled JavaScript output
├── package.json
├── tsconfig.json
└── README.md
```

### Contributing

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some overlap between get_issue_details and search_issues, as both can retrieve issue information. The descriptions clarify that get_issue_details is for a specific issue, while search_issues uses JQL for broader queries, reducing confusion. Other tools like add_comment, create_issue, and update_progress are clearly differentiated.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case, such as add_comment, create_issue, and get_issue_details. This uniformity makes the tool set predictable and easy to navigate, with no deviations in naming conventions across the 11 tools.

Tool Count5/5

With 11 tools, the server is well-scoped for Jira operations, covering core workflows like issue management, commenting, searching, and project/sprint tracking. Each tool serves a specific purpose without redundancy, making the count appropriate for the domain.

Completeness4/5

The tool set provides comprehensive coverage for Jira interactions, including CRUD operations (create, read, update) and specialized functions like sprint management and team activity. Minor gaps exist, such as the lack of a delete_issue tool or direct issue transition capabilities, but agents can work around these using update_issue_field or search_issues.

Maintenance

ActivityInactive
ResponsivenessNo issues