Jira MCP Server
README.md
# Jira MCP Server
MCP (Model Context Protocol) server for **Jira Cloud** API integration. Create issues and list issue types using Basic Auth (email + API token).
## Features
- **jira_create_issue** – Create a new Jira issue with project, summary, and issue type
- **jira_list_issue_types** – List available issue types for a project
## Prerequisites
- Node.js 24+
- Jira Cloud site
- [Atlassian API token](https://id.atlassian.com/manage-profile/security/api-tokens)
## Setup
1. **Clone and install**
```bash
cd jira_mcp
npm install
```
2. **Configure environment**
Copy `.env.example` to `.env` and fill in your values:
```bash
cp .env.example .env
```
```env
JIRA_BASE_URL=https://your-domain.atlassian.net
JIRA_EMAIL=user@example.com
JIRA_API_TOKEN=your_api_token_here
```
3. **Build**
```bash
npm run build
```
## Usage
### Run the server
```bash
npm start
```
Or with env vars inline:
```bash
JIRA_BASE_URL=https://your-domain.atlassian.net JIRA_EMAIL=you@example.com JIRA_API_TOKEN=xxx npm start
```
The server runs via **stdio** and is intended to be used as a subprocess by MCP clients (e.g. Cursor, Claude Desktop).
### Cursor configuration
Add to your Cursor MCP config (e.g. `~/.cursor/mcp.json`):
```json
{
"mcpServers": {
"jira": {
"command": "node",
"args": ["/path/to/jira_mcp/dist/index.js"],
"env": {
"JIRA_BASE_URL": "https://your-domain.atlassian.net",
"JIRA_EMAIL": "your-email@example.com",
"JIRA_API_TOKEN": "your-api-token"
}
}
}
}
```
## Tools
### jira_list_issue_types
List issue types (Bug, Task, Story, etc.) for a project.
| Parameter | Type | Required | Description |
| --------------- | ------ | -------- | ------------------------------ |
| project_key | string | Yes | Jira project key (e.g. PROJ) |
| response_format | string | No | `markdown` (default) or `json` |
### jira_create_issue
Create a new Jira issue.
| Parameter | Type | Required | Description |
| --------------- | ------ | -------- | -------------------------------------- |
| project_key | string | Yes | Jira project key |
| summary | string | Yes | Issue title |
| issue_type | string | Yes | Issue type name (e.g. Bug, Task) or ID |
| description | string | No | Issue description |
| response_format | string | No | `markdown` (default) or `json` |
## Testing Without Cursor
The best way to test the MCP server interactively is with **MCP Inspector**, a web UI for exercising tools, resources, and prompts.
1. **Build the project** (if not already done):
```bash
npm run build
```
2. **Run MCP Inspector** with your server. With a `.env` file in the project root, the server loads it automatically:
```bash
npm run inspector
```
Or run directly (env from `.env` is loaded by the server):
```bash
npx @modelcontextprotocol/inspector node dist/index.js
```
To pass env vars explicitly instead:
```bash
npx @modelcontextprotocol/inspector \
-e JIRA_BASE_URL=https://your-domain.atlassian.net \
-e JIRA_EMAIL=you@example.com \
-e JIRA_API_TOKEN=your-token \
node dist/index.js
```
3. **Open the Inspector** in your browser (typically `http://localhost:6274`).
4. **Test tools** – Use the Tools tab to call `jira_list_issue_types` and `jira_create_issue` with sample inputs.
The Inspector runs your server as a subprocess and connects via stdio, so it behaves like a real MCP client.
## Development
```bash
# Run with auto-reload
npm run dev
# Run all tests (unit + integration)
npm test
# Run tests with coverage
npm run test:coverage
# Run integration tests only (spawns MCP server + mock Jira)
npm run test:integration
# Lint code
npm run lint
npm run lint:fix
# Format code
npm run format
npm run format:check
```
### Pre-commit hooks (Husky)
On each `git commit`, Husky runs lint and Prettier on staged files. If there are errors, the commit is blocked with a message:
```
❌ Commit blocked: Fix the lint or Prettier errors above.
Tips: npm run lint:fix | npm run format
```
To bypass (use sparingly): `git commit --no-verify` or `HUSKY=0 git commit`
### CI
GitHub Actions runs on **pull requests** to `main`/`master` with separate stages on **Node.js 24.x**:
- **Unit Tests** – `npm run test:unit` (90% coverage enforced)
- **Integration Tests** – `npm run test:integration` (MCP server + mock Jira)
- **Lint & Format** – ESLint and Prettier checks
- **Security Audit** – `npm audit` (fails on moderate+ vulnerabilities)
- **CodeQL** – Static security analysis (JavaScript/TypeScript)
- **Dependency Review** – Checks for vulnerable deps in PRs
**Dependabot** is configured for weekly dependency updates (`.github/dependabot.yml`).
To block merges until PRs pass, enable **branch protection** in GitHub: Settings → Branches → Add rule → Require status checks to pass before merging.
## API Reference
- [Jira REST API v3](https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/)
- [Basic Auth for REST APIs](https://developer.atlassian.com/cloud/jira/platform/basic-auth-for-rest-apis/)
## License
MIT
TDQS
A4.6/5.0
Scored across 2 tools
Disambiguation5/5
The two tools are completely distinct: one lists issue types for discovery, the other creates an issue. There is no overlap or ambiguity between them.
Naming Consistency5/5
Both tools follow the same 'jira_verb_noun' pattern (jira_list_issue_types, jira_create_issue), making the naming predictable and consistent.
Tool Count3/5
With exactly 2 tools, the server sits in the 'borderline thin' range. While the scope is clear, a Jira server typically needs more tools to be useful.
Completeness2/5
The tools cover only creation and issue-type lookup. Missing get, update, delete, search, and project listing means agents cannot verify or manage issues, leaving significant workflow gaps.
Maintenance
ActivityInactive
ResponsivenessNo issues