jira-legacy-mcp-cli
v0.1.3
Published
MCP server for legacy Jira Server and Jira Data Center using REST API v2
Maintainers
Readme
Jira Legacy MCP Server
MCP server for legacy Jira Server and Jira Data Center environments, built around Jira REST API v2 and tested with Jira Server 7.7.1 assumptions.
Package: jira-legacy-mcp-cli
Repository: DevquasarX9/mcp-jira-legacy
Works with: Claude Code, Claude Desktop, Codex, Cursor, and other MCP clients
Why this package exists
Most Jira MCP integrations assume Jira Cloud, REST API v3, and accountId-based users. That is the wrong fit for many self-hosted installations.
This server is designed for teams that need:
- Jira Server or Jira Data Center compatibility
- REST API v2 compatibility
- legacy username and
nameuser fields instead of Jira CloudaccountId - a local stdio MCP server for tools such as Claude Desktop, Cursor, and Codex
- safe defaults, with write tools disabled unless explicitly enabled
If your Jira instance is primarily Jira Cloud or modern Jira-first tooling, this package is probably not the right choice.
Compatibility
- Primary target: Jira Server 7.7.1
- API family:
/rest/api/2 - User identity model: legacy
usernameandname - Transport: MCP stdio server
- Agile support: optional
/rest/agile/1.0endpoints when Jira Software is installed and available
Non-goals:
- Jira Cloud-first behavior
/rest/api/3accountId-based user workflows- Cloud OAuth scope assumptions
- destructive issue deletion flows in v1
Capabilities
The server exposes structured Jira tools for:
- instance info, auth validation, current user, and permissions
- project listing and project metadata
- JQL issue search and direct issue reads
- comments, worklogs, links, transitions, and changelog reads
- issue creation and updates when write mode is enabled
- assignment, transitions, comments, labels, links, worklogs, and attachments when write mode is enabled
- user search and assignable-user lookups
- favourite filters and filter-backed issue search
- optional Jira Agile board, sprint, backlog, and epic tools
- higher-level read-only intelligence tools for stale work, blockers, overdue issues, standups, sprint summaries, release notes, and triage support
Safety model
The package is intentionally conservative by default.
JIRA_READ_ONLY=trueby defaultJIRA_ENABLE_WRITE_TOOLS=falseby defaultJIRA_ENABLE_DESTRUCTIVE_TOOLS=falseby default- tool inputs are validated with
zod - project allow/deny lists are enforced for scoped operations
- credentials, auth headers, tokens, and cookies are redacted from logs
JIRA_DRY_RUN=truecan preview write payloads without mutating JiraJIRA_AUDIT_LOG=truecan record write activity without exposing secrets
Install
Global install
npm install -g jira-legacy-mcp-cliRun with npx
npx -y jira-legacy-mcp-cliLocal development
npm install
npm run build
npm testThe installed CLI command is:
jira-legacy-mcp-serverQuick start
- Copy
.env.exampleto.env. - Set your Jira base URL and authentication values.
- Keep read-only mode enabled first.
- Run the server from your MCP client.
Minimal example:
JIRA_BASE_URL=https://jira.example.com
JIRA_AUTH_MODE=basic
JIRA_USERNAME=your.username
JIRA_PASSWORD=your-password
JIRA_READ_ONLY=true
JIRA_ENABLE_WRITE_TOOLS=falseMCP client setup
Example client configs live in the repository under examples/clients/:
Environment variables
Required
JIRA_BASE_URLJIRA_AUTH_MODEJIRA_USERNAMEforbasicandcookieJIRA_PASSWORDorJIRA_TOKENdepending on auth mode
Optional
JIRA_STRICT_SSL=trueJIRA_CA_CERT_PATHJIRA_TIMEOUT_MS=30000JIRA_MAX_RESULTS=50JIRA_MAX_RESPONSE_BYTES=1048576JIRA_MAX_ATTACHMENT_BYTES=10485760JIRA_ENABLE_WRITE_TOOLS=falseJIRA_ENABLE_DESTRUCTIVE_TOOLS=falseJIRA_ALLOWED_PROJECTSJIRA_DENIED_PROJECTSJIRA_DEFAULT_PROJECTJIRA_LOG_LEVEL=infoJIRA_AUDIT_LOG=falseJIRA_DRY_RUN=falseJIRA_READ_ONLY=trueJIRA_AUTH_HEADER_NAMEJIRA_AUTH_HEADER_VALUE
Authentication modes
basic: username plus password, or username plus token where the Jira deployment supports itbearer: for proxy or plugin-backed token scenarioscookie: uses/rest/auth/1/sessionheader: for trusted reverse-proxy identity forwarding
Notes:
- On Jira Server 7.7.1,
basicwith username/password is the safest default. - Jira Server 7.7.1 does not natively behave like modern Jira Cloud PAT-based authentication.
beareris included for compatible self-hosted environments, not as a claim about stock Jira Server 7.7.1 features.
Authentication examples
Basic auth
JIRA_BASE_URL=https://jira.example.com
JIRA_AUTH_MODE=basic
JIRA_USERNAME=your.username
JIRA_PASSWORD=your-password
JIRA_READ_ONLY=trueCookie auth
JIRA_BASE_URL=https://jira.example.com
JIRA_AUTH_MODE=cookie
JIRA_USERNAME=your.username
JIRA_PASSWORD=your-password
JIRA_READ_ONLY=trueHeader auth behind a reverse proxy
JIRA_BASE_URL=https://jira.example.com
JIRA_AUTH_MODE=header
JIRA_AUTH_HEADER_NAME=X-Forwarded-User
JIRA_AUTH_HEADER_VALUE=service-account
JIRA_READ_ONLY=trueMCP configuration
Generic MCP server config
{
"mcpServers": {
"jira": {
"command": "jira-legacy-mcp-server",
"env": {
"JIRA_BASE_URL": "https://jira.example.com",
"JIRA_AUTH_MODE": "basic",
"JIRA_USERNAME": "your.username",
"JIRA_PASSWORD": "your-password",
"JIRA_READ_ONLY": "true"
}
}
}
}npx config
{
"mcpServers": {
"jira": {
"command": "npx",
"args": ["-y", "jira-legacy-mcp-cli"],
"env": {
"JIRA_BASE_URL": "https://jira.example.com",
"JIRA_AUTH_MODE": "basic",
"JIRA_USERNAME": "your.username",
"JIRA_PASSWORD": "your-password",
"JIRA_READ_ONLY": "true"
}
}
}
}Codex TOML config
[mcp_servers.jira]
command = "jira-legacy-mcp-server"
[mcp_servers.jira.env]
JIRA_BASE_URL = "https://jira.example.com"
JIRA_AUTH_MODE = "basic"
JIRA_USERNAME = "your.username"
JIRA_PASSWORD = "your-password"
JIRA_READ_ONLY = "true"Claude Desktop
Add the same server block to your Claude Desktop MCP configuration and point command to either jira-legacy-mcp-server or a local node dist/index.js.
Cursor
Add the same block in Cursor MCP settings. Keep credentials in the server environment and start in read-only mode.
Codex
Use the same MCP server definition when Codex is configured to launch local MCP servers.
Tool catalog
Instance and auth
jira_get_server_infojira_validate_authjira_get_current_userjira_get_permissions
Projects
jira_list_projectsjira_get_projectjira_get_project_componentsjira_get_project_versionsjira_get_project_rolesjira_get_project_statuses
Issues and search
jira_search_issuesjira_get_issuejira_get_issue_commentsjira_get_issue_transitionsjira_get_issue_worklogsjira_get_issue_linksjira_get_issue_changelog
Issue write tools
jira_create_issuejira_update_issuejira_assign_issuejira_add_commentjira_update_commentjira_transition_issuejira_link_issuesjira_add_labelsjira_remove_labelsjira_add_worklogjira_upload_attachment
Users
jira_search_usersjira_get_userjira_list_assignable_usersjira_list_project_users
Filters
jira_list_favourite_filtersjira_get_filterjira_search_filter_issues
Agile
jira_list_boardsjira_get_boardjira_list_sprintsjira_get_sprintjira_get_sprint_issuesjira_get_backlog_issuesjira_get_board_epics
Intelligence
jira_summarize_project_statusjira_find_stale_issuesjira_find_blocked_issuesjira_find_unassigned_issuesjira_find_overdue_issuesjira_summarize_sprintjira_explain_issue_historyjira_prepare_standup_summaryjira_generate_release_notesjira_find_duplicate_candidatesjira_triage_issue
Example JQL
project = ABC AND status = "Open" ORDER BY updated DESC
project = ABC AND assignee is EMPTY
project = ABC AND updated <= -14d AND resolution is EMPTY
project = ABC AND duedate < now() AND resolution is EMPTY
fixVersion = "1.2.0" AND resolution is not EMPTYCommon Jira Server notes
- user APIs expect legacy usernames, not
accountId - custom fields are typically named like
customfield_12345 - Agile endpoints may be unavailable without Jira Software
- attachment uploads require
X-Atlassian-Token: no-check - transition availability depends on workflow state and Jira permissions
SSL and internal CAs
For internal Jira instances with a private certificate authority:
JIRA_STRICT_SSL=true
JIRA_CA_CERT_PATH=/absolute/path/to/internal-ca.pemTemporary lab-only bypass:
JIRA_STRICT_SSL=falseDo not disable SSL verification permanently in production.
Docker
Build and run locally:
docker compose build
docker compose upThis image still runs the stdio MCP server. It is useful for reproducible local packaging, not as a long-lived HTTP API service.
Development
npm run typecheck
npm run build
npm test
npm run pack:dry-runProject layout:
src/config.ts: environment loading and validationsrc/jira/: Jira client, auth, errors, pagination, types, and endpointssrc/security/: redaction, audit, guardrails, and limitssrc/tools/: MCP tools grouped by feature areasrc/server.ts: MCP server assemblysrc/index.ts: stdio entrypoint
Contribution guidance lives in CONTRIBUTING.md.
CI and publishing
GitHub Actions workflows:
.github/workflows/ci.yml: typecheck, lint, test, build, and package verification.github/workflows/publish.yml: publish to npm on GitHub release publication when the tag matchesv<package.json version>
The package is published as jira-legacy-mcp-cli and already includes:
- a
binentry forjira-legacy-mcp-server - a package
filesallowlist - a
prepackbuild step - npm trusted publishing metadata
Release checklist
- verify connectivity against a Jira Server or Data Center staging instance
- verify username-based user flows on a Jira 7-compatible target
- verify write paths in a non-production project before enabling them broadly
- verify Agile tools on an instance with Jira Software available
- run
npm run typecheck - run
npm run build - run
npm test - run
npm run pack:dry-run - publish a GitHub release with a tag matching
v<package.json version>
