MCP server by abdoosalomov
Jira MCP Server 🚀
Custom MCP server for Agrobank's self-hosted Jira (itjira.agrobank.uz)
Setup
Option A — Run with Node
1. Install dependencies
npm install
2. Configure credentials
Edit the .env file:
JIRA_BASE_URL=https://itjira.agrobank.uz
JIRA_EMAIL=your.email@agrobank.uz
JIRA_PASSWORD=your_password
3a. Hook up Claude Desktop
Open Claude Desktop config:
- Mac:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"jira": {
"command": "node",
"args": ["/absolute/path/to/mcp-servers/index.js"],
"env": {
"JIRA_BASE_URL": "https://itjira.agrobank.uz",
"JIRA_EMAIL": "your.email@agrobank.uz",
"JIRA_PASSWORD": "your_password"
}
}
}
}
Restart Claude Desktop and you're good.
3b. Hook up Claude Code
One-liner via the CLI (user scope, available across all projects):
claude mcp add jira \
-s user \
-e JIRA_BASE_URL=https://itjira.agrobank.uz \
-e JIRA_EMAIL=your.email@agrobank.uz \
-e JIRA_PASSWORD=your_password \
-- node /absolute/path/to/mcp-servers/index.js
Or drop it in ~/.claude.json manually:
{
"mcpServers": {
"jira": {
"command": "node",
"args": ["/absolute/path/to/mcp-servers/index.js"],
"env": {
"JIRA_BASE_URL": "https://itjira.agrobank.uz",
"JIRA_EMAIL": "your.email@agrobank.uz",
"JIRA_PASSWORD": "your_password"
}
}
}
}
Check it loaded:
claude mcp list
Option B — Run with Docker
1. Build the image
docker build -t jira-mcp:latest .
Or with compose:
docker compose build
2a. Wire up Claude Desktop
MCP talks over stdio, so Claude Desktop spawns the container per session. Use -i --rm and pass env vars through:
{
"mcpServers": {
"jira": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "JIRA_BASE_URL",
"-e", "JIRA_EMAIL",
"-e", "JIRA_PASSWORD",
"jira-mcp:latest"
],
"env": {
"JIRA_BASE_URL": "https://itjira.agrobank.uz",
"JIRA_EMAIL": "your.email@agrobank.uz",
"JIRA_PASSWORD": "your_password"
}
}
}
}
Why this shape:
-ikeeps stdin open (MCP needs JSON-RPC over stdio)--rmcleans up when Claude Desktop closes the pipe-e VAR(no=value) inherits from theenvblock — secrets never get baked into the image- No
-t(no TTY) and no port mapping — pure stdio, no listener
Restart Claude Desktop.
2b. Wire up Claude Code
claude mcp add jira \
-s user \
-e JIRA_BASE_URL=https://itjira.agrobank.uz \
-e JIRA_EMAIL=your.email@agrobank.uz \
-e JIRA_PASSWORD=your_password \
-- docker run -i --rm \
-e JIRA_BASE_URL -e JIRA_EMAIL -e JIRA_PASSWORD \
jira-mcp:latest
Verify:
claude mcp list
Available Tools
| Tool | Description |
|------|-------------|
| get_my_issues | Get all issues assigned to you (filter by status) |
| search_issues | Search by keyword or JQL |
| get_issue | Get full details of an issue (e.g. PROJ-123) |
| create_issue | Create a new issue or subtask (pass parentIssueKey for subtasks) |
| add_comment | Add a comment to an issue |
| get_transitions | See available status transitions |
| transition_issue | Change issue status (To Do → In Progress → Done) |
| get_projects | List all projects you have access to |
| update_issue | Update priority, summary, or description |
| get_current_user | Get the currently authenticated Jira user |
Example prompts in Claude
- "Show me my current Jira tasks"
- "What issues do I have In Progress?"
- "Get details of BANK-456"
- "Create a subtask under MOBCORE-565 titled 'Fix login bug'"
- "Add a comment to BANK-123: done with testing"
- "Move BANK-789 to Done"
- "Bump priority of BANK-100 to High"