Jira MCP Server
Jira MCP Server
A Model Context Protocol (MCP) server for Jira Cloud. It exposes issue, project, board, sprint, search, comment, worklog, link, version, attachment and property operations as MCP tools, backed directly by the Jira Cloud REST API (v3) and Agile API (1.0).
This project is not affiliated with, endorsed by, or sponsored by Atlassian.
Table of Contents
Overview
Auth: Jira Cloud API token (email + token, Basic Auth) — no OAuth redirect flow needed.
HTTP client: Node's native
fetch/FormData— no extra HTTP dependency.Runtime deps: just
@modelcontextprotocol/sdkandzod.Destructive/admin tools are off by default:
deleteJiraIssue,deleteJiraComment,deleteJiraIssueAttachment,createJiraProject,updateJiraProjectonly register when you explicitly opt in via env vars (see below).
Prerequisites
Node.js v20 or higher (native
fetch/FormDataneed to be stable).A Jira Cloud site and an API token — create one at https://id.atlassian.com/manage-profile/security/api-tokens.
An MCP-compatible client (VS Code + GitHub Copilot, Claude Code, etc.).
Setup
Clone/copy this project, then install dependencies:
npm install npm run buildOr, once published, install as a dependency of your own project:
npm i @automate-io/jira-mcp-server@latest
## Configuration
The server reads its Jira connection from environment variables — set these in your MCP
client's server config, never commit them to source control.
| Variable | Required | Description |
| --- | --- | --- |
| `JIRA_URL` | Yes | Your site, e.g. `https://your-domain.atlassian.net` |
| `JIRA_USERNAME` | Yes | Account email used to generate the API token |
| `JIRA_TOKEN` | Yes | API token from id.atlassian.com |
| `JIRA_ENABLE_DELETE` | No | Set to `true` to register `deleteJiraIssue`/`deleteJiraComment`/`deleteJiraIssueAttachment` |
| `JIRA_ENABLE_MANAGE` | No | Set to `true` to register `createJiraProject`/`updateJiraProject` |
Example `.vscode/mcp.json` (also included in this repo, using prompted inputs so the token
isn't hardcoded):
```json
{
"servers": {
"jira-mcp": {
"type": "stdio",
"command": "node",
"args": ["node_modules/@automate-io/jira-mcp-server/dist/server.js"],
"cwd": "${workspaceFolder}",
"env": {
"JIRA_URL": "${input:jiraBaseUrl}",
"JIRA_USERNAME": "${input:jiraEmail}",
"JIRA_TOKEN": "${input:jiraApiToken}"
}
}
},
"inputs": [
{ "id": "jiraBaseUrl", "type": "promptString", "description": "Jira Cloud site URL" },
{ "id": "jiraEmail", "type": "promptString", "description": "Jira account email" },
{ "id": "jiraApiToken", "type": "promptString", "description": "Jira API token", "password": true }
]
}Tool catalogue
Grouped by file under src/tools/. 41 tools by default, 46 with delete/manage enabled.
File | Tools |
| getJiraIssue, createJiraIssue, editJiraIssue, listJiraIssueTransitions, transitionJiraIssue, listJiraIssueChangelogs, watchJiraIssue, deleteJiraIssue |
| listJiraIssueComments, addOrEditJiraIssueComment, deleteJiraComment |
| listJiraIssueWorklogs, addOrEditJiraIssueWorklog |
| listJiraIssueLinkTypes, createJiraIssueLink, listJiraIssueRemoteIssueLinks |
| searchJiraIssuesUsingJql |
| getJiraCurrentUser, getJiraUser, lookupJiraAccountId, findJiraIssueAssignableUsers |
| listJiraProjects, listJiraProjectIssueTypesMetadata, getJiraIssueTypeMetaWithFields, listJiraStatuses, listJiraProjectComponents, createJiraProject, updateJiraProject |
| getJiraProjectVersions, manageJiraProjectVersion, getJiraProjectVersionRelatedWork, manageJiraProjectVersionRelatedWork |
| listJiraBoards, getJiraBoardConfig, getJiraBoardIssueData, createJiraBoard |
| listJiraBoardSprints, getJiraBoardSprintData, manageJiraSprint |
| listJiraFilters, listJiraDashboards |
| getJiraEntityProperty, editJiraEntityProperty |
| uploadAttachmentToJiraIssue, downloadJiraIssueAttachment, deleteJiraIssueAttachment |
Italicised tools require the matching JIRA_ENABLE_* flag.
Design notes
src/utilities/jira-client.tsis the single HTTP entry point (jiraRequest). It preserves the real HTTP status code on every response (including errors), parses the body by content-type instead of assuming JSON, and needs no manual context disposal since it's built on nativefetch.src/utilities/tool-helpers.tsprovidessafeHandler(shared try/catch) andtoToolResult(maps a Jira response to MCP content withisErrorreflecting the real status), so each tool handler stays a few lines of Jira-specific logic instead of repeating boilerplate.src/utilities/adf.tsconverts plain text into the minimal Atlassian Document Format Jira Cloud's v3 API requires for rich-text fields (comments, descriptions, worklog comments).searchJiraIssuesUsingJqluses the current token-paginated/rest/api/3/search/jqlendpoint, since the olderstartAt-based/rest/api/3/searchis deprecated.Startup logs go to stderr, never stdout — stdout is reserved for the MCP JSON-RPC stream over the stdio transport, so anything else written there would corrupt it.
Troubleshooting
Server exits immediately with "Missing required environment variable": set
JIRA_URL,JIRA_USERNAME,JIRA_TOKENin your MCP client's server config.401/403 from Jira: regenerate your API token, and confirm
JIRA_USERNAMEmatches the Atlassian account that owns the token.A delete/manage tool doesn't show up: set
JIRA_ENABLE_DELETE/JIRA_ENABLE_MANAGEto"true"in the server'senvconfig.