The interesting work is on the way back: JIRA returns descriptions and comments as nested Atlassian Document Format, and this flattens them to text while keeping the relationships — mentions, links, parents, epics — as structured data. The two ceilings are worth planning around: 50 issues per JQL search and 100 children per epic, so a large board needs more than one call.
A TypeScript server for JIRA that runs JQL, reads issues with their comments and relationships, and creates or updates them — trimming Atlassian Document Format down to plain text on the way out.
- search_issues — any JQL query, up to 50 results per request
- get_issue — one issue with its comments and all of its relationships
- get_epic_children — every child of an epic with comment history, up to 100 issues per request
- create_issue — a new issue from project key, issue type, summary, and optional description and fields
- update_issue — fields changed on an existing issue
- add_comment — plain text in, converted to Atlassian Document Format for you
- add_attachment — a file uploaded to an issue as base64 content with a filename
- Issue mentions extracted out of descriptions and comments, deduplicated, and returned alongside formal links, parent/child ties and epic associations
A JIRA account with API access, and four environment variables: JIRA_API_TOKEN, JIRA_BASE_URL, JIRA_USER_EMAIL and optionally JIRA_TYPE for cloud or server. Built and run with Bun v1.0.0 or higher. Jira Cloud uses REST API v3 with an API token; Jira Server and Data Center use v2, and Data Center 8.14.0 and later can use a Personal Access Token with JIRA_AUTH_TYPE=bearer.
One command plus a key — npx -y jira-mcp, then supply credentials
